Запрос на продление сертификата C#
Код ниже пытается обновить существующий сертификат. Сертификат обновляется, но генерируется новый открытый / закрытый ключ, несмотря на то, что указана опция X509RequestInheritOptions.InheritPrivateKey.
Что не так в приведенном ниже коде, поскольку целью было сохранить существующий закрытый ключ? В консоли управления сертификатами я могу обновить сертификат и сохранить существующий закрытый ключ.
string certificateSerial = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
X509Certificate certificate = getCertificate(certificateSerial);
var objPkcs7 = new CX509CertificateRequestPkcs7();
objPkcs7.InitializeFromCertificate(X509CertificateEnrollmentContext.ContextUser, true,
Convert.ToBase64String(enrollmentAgentCertificate.GetRawCertData()),
EncodingType.XCN_CRYPT_STRING_BASE64,
X509RequestInheritOptions.InheritPrivateKey & X509RequestInheritOptions.InheritValidityPeriodFlag);
IX509Enrollment ca = new CX509EnrollmentClass();
ca.InitializeFromRequest(objPkcs7);
ca.Enroll();
Спасибо
1 ответ
Кажется, проблема в документации MSDN:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa379430%28v=vs.85%29.aspx
На странице указано: "..Вы также можете использовать побитовую операцию И, чтобы объединить выбор наследования ключей с InheritNone или с любой комбинацией следующих флагов...".
Однако, если мы используем побитовое И между InheritPrivateKey = 0x00000003 и InheritValidityPeriodFlag= 0x00000400, мы получим 0, которое является InheritDefault (т.е. нет наследования закрытого ключа)
Для моего случая использования нам нужно использовать побитовое ИЛИ. Кажется, пример C++ SDK делает то же самое:
hr = pPkcs7->InitializeFromCertificate(
ContextUser,VARIANT_FALSE, strOldCert,
XCN_CRYPT_STRING_BINARY,
(X509RequestInheritOptions)(InheritPrivateKey|InheritTemplateFlag));
В этом контексте приведенный выше код должен быть изменен как:
X509RequestInheritOptions.InheritPrivateKey | X509RequestInheritOptions.InheritTemplateFlag);