Запрос на продление сертификата 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 делает то же самое:

https://github.com/theonlylawislove/WindowsSDK7-Samples/blob/master/security/x509%20certificate%20enrollment/vc/enrollpkcs7/enrollPKCS7.cpp

hr = pPkcs7->InitializeFromCertificate(
ContextUser,VARIANT_FALSE, strOldCert, 
XCN_CRYPT_STRING_BINARY,              
(X509RequestInheritOptions)(InheritPrivateKey|InheritTemplateFlag));

В этом контексте приведенный выше код должен быть изменен как:

X509RequestInheritOptions.InheritPrivateKey  | X509RequestInheritOptions.InheritTemplateFlag);
Другие вопросы по тегам