我正在使用BouncyCastle生成证书。一切正常,直到我尝试使用GeneralName.OtherName添加主题备用名称扩展名为自定义Oid = 1.3.6.1.4.1.311.20.2.3(它代表用户主体名称(UPN))。所以结果应该是这样的: 主题备选名称部分 - >其他名称 - >用户主体名称= user @ domain
我这样做:
Asn1EncodableVector vector = new Asn1EncodableVector
{
new GeneralName(GeneralName.OtherName,
new KeySpecificInfo(new DerObjectIdentifier("1.3.6.1.4.1.311.20.2.3"), new DerOctetString(GetBytes("user@domain"))))
}
DerSequence seq = new DerSequence(vector);
GeneralNames subjectAltName = GeneralNames.GetInstance(seq);
// Adding extension to X509V3CertificateGenerator
certGen.AddExtension(X509Extensions.SubjectAlternativeName, false, subjectAltName);
之后,我在创建的证书的SubjectAlternativeName部分收到一个奇怪的序列化结果。很明显,添加OtherName部分是错误的,但我找不到有关为BouncyCastle添加自定义oid的任何信息。 有什么想法吗?
答案 0 :(得分:1)
这也适用于C#bouncycastle证书:
//Subject Alternative Name
if (! (String.IsNullOrEmpty(_subjectAlternativeName))) {
//Here we signify ip address instead of DNS SAN. This could be condition upon further development.
GeneralNames subjectAltName = new GeneralNames(new GeneralName(GeneralName.IPAddress, _subjectAlternativeName));
certificateGenerator.AddExtension(X509Extensions.SubjectAlternativeName, false, subjectAltName);
}
答案 1 :(得分:1)
找到答案here。它是Java,但C#的代码实际上是相同的。
这是我在C#中的版本。
Asn1EncodableVector otherName = new Asn1EncodableVector();
otherName.Add(new DerObjectIdentifier("1.3.6.1.4.1.311.20.2.3"));
otherName.Add(new DerTaggedObject(true, GeneralName.OtherName, new DerUtf8String(siteName)));
Asn1Object upn = new DerTaggedObject(false, 0, new DerSequence(otherName));
Asn1EncodableVector generalNames = new Asn1EncodableVector();
generalNames.Add(upn);
// Adding extension to X509V3CertificateGenerator
certificateGenerator.AddExtension(X509Extensions.SubjectAlternativeName, false, new DerSequence(generalNames));