Проверка подлинности клиента Https с Wininet, используя непостоянный корневой сертификат - PullRequest
0 голосов
/ 16 мая 2019

Я общаюсь по 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 .

...