c# - 在 C# 中使用 Bouncy Castle 签署 CSR
问题描述
我在C#中使用Bouncy Castle创建了根证书和中间证书。现在我想接受并使用证书签署CSR 。我到处都在获得 Java 解决方案。我想将 java 代码转换为 C#,但没有获得 C# 的确切文档。有人可以帮忙吗?
解决方案
这是我的解决方案:
public string SignCSR(string str_csr, int validityInYears)
{
try
{
char[] characters = str_csr.Replace("-----BEGIN CERTIFICATE REQUEST-----", "").Replace("-----END CERTIFICATE REQUEST-----", "").ToCharArray();
byte[] csrEncode = Convert.FromBase64CharArray(characters, 0, characters.Length);
Pkcs10CertificationRequest pk10Holder = new Pkcs10CertificationRequest(csrEncode);
bool verify = pk10Holder.Verify();
if (verify == false)
{
return constants.INVALIDCERTIFICATEREQUEST;
}
// Generating Random Numbers
CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator();
SecureRandom random = new SecureRandom(randomGenerator);
X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
// Serial Number
BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
certificateGenerator.SetSerialNumber(serialNumber);
//Import intermediate certificate and get issuer details
string pathToRootCert = Configuration["intermediatecertificatelocation"];
string intermediateIssuer = rootBusinessLogic.ImportIssuerFromPem(pathToRootCert);
// Issuer and Subject Name
//X509Name issuerDN = new X509Name(issuerName);
X509Name issuerDN = new X509Name(intermediateIssuer); //issuer is intermediate certificate here whi will sign
certificateGenerator.SetIssuerDN(issuerDN);
certificateGenerator.SetSubjectDN(pk10Holder.GetCertificationRequestInfo().Subject);
// Valid For
DateTime notBefore = DateTime.UtcNow.Date;
DateTime notAfter = notBefore.AddYears(validityInYears);
certificateGenerator.SetNotBefore(notBefore);
certificateGenerator.SetNotAfter(notAfter);
certificateGenerator.SetPublicKey(pk10Holder.GetPublicKey());
//Import root certificate and get issuer details
//get root private key from file
string rootKeyPathFromConfig = Configuration["intermediate_privatekeylocation"];
AsymmetricKeyParameter issuerPrivKey = rootBusinessLogic.ImportPrivateKeyFromPemFile(rootKeyPathFromConfig);
if (issuerPrivKey == null)
{
return constants.INTERMEDIATEKEYERROR;
}
ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA256WITHRSA", issuerPrivKey, random);
// Selfsign certificate
Org.BouncyCastle.X509.X509Certificate certificate = certificateGenerator.Generate(signatureFactory);
X509Certificate2 x509 = new X509Certificate2(certificate.GetEncoded());
StringBuilder builder = new StringBuilder();
builder.AppendLine("-----BEGIN CERTIFICATE-----");
builder.AppendLine(Convert.ToBase64String(x509.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
builder.AppendLine("-----END CERTIFICATE-----");
var str_certificate = builder.ToString();
return str_certificate ;
}
catch (Exception ex)
{
return ex.Message;
}
}
pathToRootCert
是存储在设备中的中间证书的路径,ImportIssuerFromPem
是检索中间证书颁发者名称的方法,rootKeyPathFromConfig
是用于签名目的的中间证书私钥的路径,是获取格式ImportPrivateKeyFromPemFile
私钥的方法。AsymmetricKeyParameter
此方法返回 PEM 格式的证书。
推荐阅读
- sql - JSON_VALUE 的 Postgres 语句
- react-native - React native - 带有远程调试的控制台日志记录
- javascript - posgresql:选择现有表中的特定列并根据绝对值以降序对其进行排序?
- javascript - 使用 bootstrap 4 时的固定位置菜单
- python - 需要帮助确定文本文件中文本的一般格式
- javascript - React Native - 如何使用地图数据呈现行?
- django - Nginx 可以访问静态文件夹,但不能访问其中的其他文件夹。找不到子文件夹/index.html
- python - 将 Python ArgumentParser 传递给另一个模块?
- bash - 在 Makefile 中创建多行回显块
- python - 如何使用 pathlib & csv 模块编写?