在Bouncycastle中使用主题备用名称中的自定义Oid

时间:2016-08-10 15:22:24

标签: certificate x509certificate bouncycastle

我正在使用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的任何信息。 有什么想法吗?

2 个答案:

答案 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));