Я общаюсь по https с сервером, который требует аутентификации клиента.
Чтобы заставить его работать, мне пришлось импортировать корневой сертификат сервера в глобальное хранилище сертификатов Windows с помощью Microsoft Management Console (ммс).
Но я пытаюсь заставить его работать тихо.
Итак, мой вопрос:
Как сообщить Wininet, чтоданный сертификат является корневым, поэтому он может использовать его для проверки всей цепочки сертификатов?
(без обработки пользователя, без прав администратора или регистрации на уровне системы)
Подробнее:
У меня есть (a) сертификат + (b) закрытый ключ моего клиента.
У меня есть (c) корневой сертификат сервера.
Я собрал pfx-файл, содержащий (a) и (b):
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile root.pem -out test.pfx
Теперь я могу использовать test.pfx для сборкихранилище сертификатов CS (с использованием PFXImportCertStore
).
Во время создания моего запроса я установил все сертификаты из CS (используя InternetSetOption(INTERNET_OPTION_CLIENT_CERT_CONTEXT)
)
Вот очень минималистичный фрагмент моего кода:
CRYPT_INTEGER_BLOB blob ;
blob.pbData = ...pointer to a buffer containing test.pfx
blob.cbData = ...size of this buffer
HCERTSTORE cs = PFXImportCertStore( &blob,L"pw",PKCS12_NO_PERSIST_KEY ) ;
HINTERNET ses = InternetOpen("test",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0) ;
HINTERNET con = InternetConnect( ses,"server",4444,NULL,NULL,INTERNET_SERVICE_HTTP,0,NULL ) ;
HINTERNET req = HttpOpenRequest( con,"POST",NULL,NULL,NULL,NULL,INTERNET_FLAG_SECURE,NULL ) ;
PCCERT_CONTEXT pc = CertEnumCertificatesInStore( cs,0 ) ;
for (; pc ; pc = CertEnumCertificatesInStore( cs,pc ))
InternetSetOption( req,INTERNET_OPTION_CLIENT_CERT_CONTEXT,(void*)pc,sizeof( CERT_CONTEXT )) ;
HttpSendRequest( req,NULL,0,NULL,0 ) ;
Но он не работает как есть.
Мне нужно вставить корневой сертификат (c) в хранилище сертификатов Windows.
Кроме того, сертификат (c), вставленный в файл pfx, бесполезен.
Я могу опустить его в командной строке openssl
.
Поскольку я хочу, чтобы он работал без вывода сообщений и этот корневой сертификат использовался только один раз для этого запроса, мне интересно, можно ли пометить его как root (в PFXImportCertStore
или InternetSetOption
шаг)?
PS Я работаю с Visual Studio 2017 / Windows 10 x64.
PPS Это продолжение моего предыдущего поста: Подлинность клиента(сертификат + закрытый ключ) с использованием WinInet .