Определение правильного клиентского сертификата для ServerXMLHTTP.SetOption

У меня есть три клиентских сертификата, установленных в Windows 7, и мне нужно использовать конкретный для аутентификации вызова ServerXMLHTTP60 с помощью VBA.

Вызов ServerXMLHTTP60.SetOption с понятным именем сертификата возвращается без ошибок. Но последующий .send завершается неудачно с сообщением «Для завершения аутентификации клиента требуется сертификат».

Пример кода:

    Public Sub TestCert()
    Dim myHTTP as New ServerXMLHTTP60
    Dim myURL as String

        ' Open the connection to the secure server
         myHTTP.Open "GET", "https://server/finalpath", False

        ' Attempt to set the correct client certificate
        ' I have also tried just the friendly name as well as 
        ' LOCAL_MACHINE\My\cert friendly name'
        myHTTP.SetOption 3, "CURRENT_USER\My\cert friendly name"

        ' Send request fails with "A certificate is required ..."
        myHTTP.Send
    End Sub

Указанный сертификат отлично работает через IE или Firefox с этим сайтом. Я должен использовать неправильный путь для сертификата. Есть ли способ определить правильный путь к сертификату клиента для обеспечения успеха?


person Bryan P    schedule 11.08.2015    source источник
comment
Я столкнулся с этой же проблемой и в итоге использовал WinHTTP вместо SetAutoLogonPolicy, который предоставляет сертификат клиента по умолчанию так же, как и IE. WinHTTP также является хорошим выбором, поскольку он поддерживает WPAD в том случае, если сеть, в которой вы находитесь, использует прокси.   -  person Blackhawk    schedule 11.08.2015
comment
@Blackhawk, спасибо, но теперь возникла новая проблема. WinHTTP.Send теперь работает без ошибок, но, похоже, он вообще не отправляет сертификат. WinHTTP.ResponseText содержит точно такой же документ с ошибкой аутентификации, возвращенный, как если бы я вообще пытался отправить запрос без какого-либо сертификата или политики автолога.   -  person Bryan P    schedule 11.08.2015
comment
Можете ли вы посетить сайт с IE?   -  person Blackhawk    schedule 11.08.2015
comment
Я могу. Никаких проблем, и автоматический запрос сертификата происходит без сбоев.   -  person Bryan P    schedule 11.08.2015
comment
Что ж, я думаю, это снова попытка найти соответствующий сертификат для работы. Вот пример установки сертификата клиента с помощью WinHTTP для сайта HTTPS.   -  person Blackhawk    schedule 11.08.2015
comment
Вы пробовали request.SetAutoLogonPolicy AutoLogonPolicy_Always раньше, чем request.send?   -  person Blackhawk    schedule 11.08.2015
comment
Я ценю помощь. По-прежнему безуспешно. Удалось ли вам прикрепить сертификат с помощью базовых функций WinHTTP или WININET? Мне не удалось успешно использовать функцию .InternetSetOption (), где вы должны предоставить контекст сертификата - эта функция всегда возвращает ошибку о нехватке места в буфере. Я понимаю, что использование VBA, вероятно, является здесь основной проблемой, но все это происходит внутри серверной функциональности MS Access.   -  person Bryan P    schedule 12.08.2015
comment
Перенос проблемы на - ›ссылку   -  person Bryan P    schedule 12.08.2015
comment
Это в конечном итоге сработало для вас? По моему опыту, вам нужно использовать субъект сертификата или любое из значений альтернативного имени субъекта, а не понятное имя при предоставлении клиентского сертификата, по крайней мере, с ASP / VBScript с использованием ServerXMLHTTP или WinHTTP.   -  person KBr    schedule 13.06.2017
comment
Я получаю ошибку времени выполнения «-2147012852 (80072f0c). Для завершения аутентификации клиента требуется сертификат. Означает ли это, что мой сертификат не проходит при рукопожатии?   -  person bherto39    schedule 09.07.2020


Ответы (1)


Это свело меня с ума на пару дней, но ... Предполагая, что вы устанавливаете свой клиент в хранилище по умолчанию под текущим пользователем, и ваш сертификат имеет subject cn = mycert, то, похоже, это сработает. Запуск office16, windows 10, winhttp5.1

Dim apiConnection As New WinHttp.WinHttpRequest

' Set the authentication settings
apiConnection.SetClientCertificate "mycert"

apiConnection.Open "Get", "https://localhost:8443", False
apiConnection.Send
person cloudpta    schedule 19.06.2018