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;
Надеюсь, что это поможет другим в будущем.