gpt4 book ai didi

c# - 如何使用 BouncyCaSTLe X509V3CertificateGenerator 设置 upnName(用户主体名称)

转载 作者:行者123 更新时间:2023-11-30 21:40:45 27 4
gpt4 key购买 nike

我正在为应用程序中预先存在的/正在运行的方法编写一些单元测试,该应用程序通过以下方式从给定的证书中收集用户主体名称

var upnName = currentUserCert.GetNameInfo(X509NameType.UpnName, false);

这在运行时有效,但是我目前无法从 BouncyCaSTLe X509V3CertificateGenerator 生成的证书中检索此值。虽然我可以完成大部分工作,但我无法生成包含 upnName 的证书。我只是不确定如何设置用户主体,以便在测试时可以通过 GetNameInfo 检索它。

测试证书本身就是这样生成的

private X509Certificate2 GenerateCert(KeyPurposeID keyPurposeId, string subjectPrefix = "OID.1.2.3.4=", string validCertOriginFragment = "OU=SOME ORG")
{
const int keyStrength = 2048;
const string subject = "98876543210123";

// Generating Random Numbers
var randomGenerator = new CryptoApiRandomGenerator();
var random = new SecureRandom(randomGenerator);
var kpgen = new RsaKeyPairGenerator();

kpgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), keyStrength));

var certificateGenerator = new X509V3CertificateGenerator();

var certName = new X509Name($"{subjectPrefix}{subject} + CN=JAMES BOND (Affiliate), {validCertOriginFragment}, O=SOME ORG, C=US");
var issuer = new X509Name("OU=CERT AUTH CA, OU=Certification Authorities, O=MYCERTAUTH, C=US");
var serialNo = BigInteger.ProbablePrime(120, new Random());

certificateGenerator.SetSerialNumber(serialNo);
certificateGenerator.SetSubjectDN(certName);
certificateGenerator.SetIssuerDN(issuer);
certificateGenerator.SetNotAfter(DateTime.Now.AddYears(50));
certificateGenerator.SetNotBefore(DateTime.Now);

// TODO setup upn name

var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength);
var keyPairGenerator = new RsaKeyPairGenerator();
keyPairGenerator.Init(keyGenerationParameters);
var subjectKeyPair = keyPairGenerator.GenerateKeyPair();
certificateGenerator.SetPublicKey(subjectKeyPair.Public);

if (keyPurposeId != null)
{
certificateGenerator.AddExtension(
X509Extensions.ExtendedKeyUsage.Id,
false,
new ExtendedKeyUsage(keyPurposeId));
}

// Generating the Certificate
var issuerKeyPair = subjectKeyPair;
ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA256WITHRSA", issuerKeyPair.Private, random);
// selfsign certificate
var certificate = certificateGenerator.Generate(signatureFactory);
var x509 = new X509Certificate2(certificate.GetEncoded());

return x509;
}

根据@peop 的建议,将以下内容添加到设置名称的 TODO 中

certificateGenerator.AddExtension("2.5.29.17", true,
new GeneralNames(
new GeneralName(GeneralName.OtherName,
new DerSequence(new DerObjectIdentifier("1.3.6.1.4.1.311.20.2.3"), new DerUtf8String($"{subject}@SOMEWHERE.COM")))
));

让我更接近,我认为,在调查证书时,我有一个很好的额外扩展,但是预期的信息仍然没有通过 GetNameInfo 方法公开。为了让神奇的 Microsoft GetNameInfo 方法亮起并返回预期值,证书是否还必须发生其他事情?

如何通过 BouncyCaSTLe X509V3CertificateGenerator 创建证书以便我可以检索 upnName 以进行测试?

最佳答案

以下为我工作并生成了一个带有主题备用名称属性的证书,该属性与用于用户/客户端身份验证的 Microsoft 证书服务生成的证书格式相同。也就是说,在 Windows 中查看 .cer 文件的 Subject Alternative Name 属性时,您会看到:

    Other Name:        Principal Name=john.doe@contoso.com    RFC822 Name=john.doe@contoso.com
certificateGenerator.AddExtension(X509Extensions.SubjectAlternativeName.Id, false, new DerSequence(
new GeneralName(GeneralName.OtherName,
new DerSequence(new DerObjectIdentifier("1.3.6.1.4.1.311.20.2.3"),
new DerTaggedObject(0, new DerUtf8String("john.doe@contoso.com")))),
new GeneralName(GeneralName.Rfc822Name, "john.doe@costoso.com")));

关键是将 UPN 字符串包装在 DerTaggedObject 中。根据 pepo 的建议, 我用了 ASN.1 Editor查看现有证书。它有一堆围绕这些值的 Context Specific 节点。所以对此进行研究,我发现Tutorial for ASN1 DER Primitive Encoder ,这使我找到了 DerTaggedObject。从那里开始,我开始尝试一些代码,直到我生成的证书的输出与 Microsoft 证书服务创建的证书的输出相匹配。

另请注意,Subject Alternative Name 的扩展未标记为critical(AddExtension 方法的第二个参数为false)。这再次匹配 Microsoft 证书服务生成的内容。

关于c# - 如何使用 BouncyCaSTLe X509V3CertificateGenerator 设置 upnName(用户主体名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44290311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com