C# Генерирует несамоподписанный клиентский запрос CX509Certificate без CA, используя certenroll.dll

У меня есть самозаверяющий корневой сертификат, который я сгенерировал в C#, используя CERTENROLL.dll CX509CertificateRequest Certificate.

Я хотел бы написать функцию, которая генерирует клиентские сертификаты, подписанные моим корнем, используя тот же 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, подписанный моим рутом?

Любая помощь или совет будет принята с благодарностью.

1 ответ

Решение

Я смог решить это.

Кодировка SEScert является шестнадцатеричной строкой, а не base64, и для машинного контекста должно быть установлено значение true, а не false, правильный код выглядит следующим образом:

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

Надеюсь, что это поможет другим в будущем.

Другие вопросы по тегам