C# 使用 certenroll.dll 在没有 CA 的情况下生成非自签名客户端 CX509Certificate 请求

标签 c# certificate x509certificate2 certenroll mscapi

我有一个使用 CERTENROLL.dll 的 CX509CertificateRequest 证书功能在 C# 中生成的自签名根证书。

我想编写一个函数,使用相同的 API 生成由我的根签名的客户端证书。但是,我能找到的唯一不生成自签名证书的 CertEnroll 选项需要经过身份验证的 CA。

似乎有一个用于设置 SignerCertificate 的标志,但它总是无法初始化。

        //Initialize cert
        var cert = new CX509CertificateRequestCertificate();
        //take care of signer
        cert.Issuer = issuen;
        CSignerCertificate sc = new CSignerCertificate();
        var raw = SEScert.GetRawCertData();
        var rawStr=Convert.ToBase64String(raw);
        sc.Initialize(false, X509PrivateKeyVerify.VerifyNone,    
                      EncodingType.XCN_CRYPT_STRING_BASE64, rawStr); //fails here
        cert.SignerCertificate = sc;

有谁知道如何生成由我的根签名的客户端 CX509CertificateRequest?

如有任何帮助或建议,我们将不胜感激。

最佳答案

我能够解决这个问题。

SEScert 的编码是十六进制字符串而不是 base64,机器上下文应该设置为 true 而不是 false 正确的代码如下所示:

ISignerCertificate signerCertificate = new CSignerCertificate();
signerCertificate.Initialize(true, X509PrivateKeyVerify.VerifyNone,EncodingType.XCN_CRYPT_STRING_HEX, SEScert.GetRawCertDataString());
cert.SignerCertificate = (CSignerCertificate)signerCertificate; 

希望这对以后的其他人有帮助。

关于C# 使用 certenroll.dll 在没有 CA 的情况下生成非自签名客户端 CX509Certificate 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756940/

相关文章:

c# - 如何在 C# 中创建 X509Certificate2 时更改颁发者名称

c# - 无法在 C# 中使用命名空间

c# - 正确的方法将数字分配给列表集合中的元素

c# - 使用 Microsoft DI 在泛型构造函数中注入(inject)基本类型

c# - 在 C# 中从基构造函数调用子类构造函数

ios - 什么是了解证书、代码签名、配置和相关主题的好资源(Apple 除外)?

c# - 从 .NET COM 库解码 ASP Request.ClientCertificate ("Certificate")

c# - WebSocket 服务器仅使用 ssl 从握手 header 接收 "G"

java - eToken java key 工具证书

c# - Azure Web应用程序新的X509Certificate2()导致System.Security.Cryptography.CryptographicException : Access denied