我正在开发一个 ASP.NET Core Web API,其中一项功能涉及生成自签名 X.509 证书。为此,我使用 BouncyCastle 库和 Ed25519 算法来生成和签名密钥。
该 API 旨在动态创建证书,然后用于安全通信。证书生成过程中一切都按预期进行,不会抛出任何错误。但是,当我使用 ASN.1 解码器分析生成的证书时,我注意到一个问题:AlgorithmIdentifier
签名部分中包含参数 ANY NULL 字段。
这是有问题的,因为根据 X.509 (RFC 8410) 中 Ed25519 的规范,Ed25519 的参数字段应该被省略。以下是 ASN.1 输出中有问题的部分:
signature AlgorithmIdentifier SEQUENCE (2 elem)
algorithm OBJECT IDENTIFIER 1.3.101.112 curveEd25519 (EdDSA 25519 signature algorithm)
parameters ANY NULL
将参数字段设置为 NULL 不符合 Ed25519 证书的标准,这可能会导致证书在某些环境或系统中使用时出现兼容性问题。
private X509Certificate CreateSelfSignedCertificate(X509Name subjectName, Pkcs10CertificationRequest csr, Ed25519PrivateKeyParameters privateKey, DateTime notBefore, DateTime notAfter)
{
var certGen = new X509V3CertificateGenerator();
var serialNumber = new BigInteger("2651512");
certGen.SetSerialNumber(serialNumber);
certGen.SetIssuerDN(subjectName);
certGen.SetSubjectDN(subjectName);
certGen.SetNotBefore(notBefore);
certGen.SetNotAfter(notAfter);
certGen.SetPublicKey(csr.GetPublicKey());
certGen.AddExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(csr.GetPublicKey()));
var authorityKeyIdentifier = new AuthorityKeyIdentifierStructure(csr.GetPublicKey());
certGen.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, authorityKeyIdentifier);
certGen.AddExtension(X509Extensions.BasicConstraints, false, CreateCustomExtensionValueRoot());
var signatureFactory = new Asn1SignatureFactory(EdECObjectIdentifiers.id_Ed25519.Id, privateKey);
return certGen.Generate(signatureFactory);
}
证书似乎已成功生成,但 ASN.1 分析AlgorithmIdentifier
表明参数字段包含一个 NULL 值。这不符合 Ed25519 算法规范,其中必须完全省略参数字段。有人知道如何解决这个问题吗?
我相信这个问题已经在 BouncyCastle.Cryptography NuGet 包 2.3.0 版中修复。
如果坚持使用早期版本,您可以提供自己的实现
ISignatureFactory
:并改用: