Не могу использовать HTTPS с объектом ServerXMLHTTP - PullRequest
8 голосов
/ 09 февраля 2012

Я поддерживаю приложение Classic ASP, которое подключается к платежному шлюзу через HTTPS.До недавнего времени не было никаких проблем.Несколько дней назад на сервере были установлены последние обновления (Windows Server 2003), что привело к поломке сайта.Ниже приведен фрагмент кода.

Dim oHttp
Dim strResult
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
oHttp.setOption(2) = 13056
oHttp.open "POST", SOAP_ENDPOINT, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION
oHttp.send SOAP_REQUEST

Ниже приведен дамп объекта ошибки: -

Номер: -2147012852 Описание: Для завершения аутентификации клиента требуется сертификат Сообщение: СертификатТребуется завершить аутентификацию клиента

Сначала я подумал, что это потому, что SSL-сертификат Платежного шлюза не проходил аутентификацию или им нужен клиентский сертификат.Я проверил URL-адрес в браузере на сервере, и он правильно отображался без ошибок, и подтвердил, что серверу Payment Gateway не требуется сертификат клиента.

Я в растерянности.Все исследования, которые я провел, ни к чему не привели.Я даже попробовал следующее, найденное в Stackoverflow: -

Получение XMLHTTP для работы с HTTPS

xmlHttp, запрос XML, asp

В последнем сообщалось, что сертификат XMLHTTP требуется для сертификата клиента, даже если он не нужен серверу, и указана статья в КБ о том, как его установить, но она устарела и не работает.

Ответы [ 5 ]

6 голосов
/ 11 февраля 2012

Попробуйте добавить oHttp.setOption 2, 13056

3 голосов
/ 17 ноября 2017

Только что нашел решение, которое прошло тестирование на:

  • Windows 10 (IIS 10)
  • Windows 2012 R2 (IIS 8.5)

Это проблема клиента. MSXML2.ServerXMLHTTP действительно требует от вас использования сертификата клиента при вызове конечной точки, защищенной с помощью SSL (даже если конечная точка не требует этого), как отметил OP.

На веб-сервере вам необходимо:

  1. Создание сертификата клиента
  2. Назначение разрешений для сертификата
  3. Установить сертификат для объекта ServerXMLHTTP

Подробно:

1. Создать сертификат клиента

Используйте следующую команду PowerShell для создания нового самозаверяющего сертификата:

New-SelfSignedCertificate -DnsName "ServerXMLHTTP", "ServerXMLHTTP" -CertStoreLocation "cert:\LocalMachine\My"

Обратите внимание, что сертификат, созданный этой командой, будет действителен только в течение 1 года.

2. Присвоить разрешения сертификату

Используя MMC, просмотрите хранилище сертификатов для учетной записи компьютера : Как: просмотреть сертификаты с помощью оснастки MMC

Сертификат, созданный выше, можно найти в Сертификаты (локальный компьютер) \ Personal \ Certificates (в столбцах «Выдано» и «Выдано» отображается «ServerXMLHTTP»).

Щелкните правой кнопкой мыши сертификат ServerXMLHTTP, выберите «Все задачи» -> «Управление личными ключами», и откроется диалоговое окно разрешений.

Добавьте пользователя, от имени которого работает пул приложений веб-сайта ASP. По умолчанию он будет работать как «ApplicationPoolIdentity», но ваши настройки могут использовать определенную учетную запись пользователя. Если пул приложений использует ApplicationPoolIdentity, добавляемое имя пользователя - «IIS AppPool \ APP POOL NAME», например, IIS AppPool \ DefaultAppPool

Пользователь будет добавлен с «Полный доступ», который можно отменить выбор. Кажется, требуется только разрешение «Чтение». Нажмите «ОК» для подтверждения прав доступа.

3. Установите сертификат для объекта ServerXMLHTTP

В вашем коде ASP установите объект ServerXMLHTTP для использования сертификата, созданного выше. Например, вызов PayPal для токена доступа:

Dim strAuthToken: strAuthToken = "<Base64 encoded version of ClientId:Secret>"
Dim oHttp: Set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")

With oHttp
    Call .Open("POST", "https://api.sandbox.paypal.com/v1/oauth2/token", False)
    Call .SetOption(3, "LOCAL_MACHINE\My\ServerXMLHTTP")
    Call .SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    Call .SetRequestHeader("Authorization", "Basic " & strAuthToken)
    Call .Send("grant_type=client_credentials")
End With

Надеюсь, это все еще поможет.

0 голосов
/ 23 февраля 2015

Я знаю, что это старый вопрос.Эта проблема может быть из-за неподдерживаемых комплектов шифров.Попробуйте добавить - TLS_RSA_WITH_AES_128_CBC_SHA AES128-SHA - TLS_RSA_WITH_AES_256_CBC_SHA AES256-SHA

Это означает, что вы должны следовать этому kb: http://support.microsoft.com/kb/948963 Это обновление также интересно, если вы по-прежнему будете использовать Windows 2003. Который все еще будет использовать подключение к Windows 2003.на сайт с использованием SHA2 - http://support.microsoft.com/kb/968730

Обратите внимание, что поддержка Windows Server 2003 заканчивается 14 июля 2015 года

0 голосов
/ 02 апреля 2012

Можете ли вы попробовать с oHttp.setOption (3) = "имя хранилища сертификатов / понятное имя сертификата" как ниже. Я надеюсь, что это будет работать.

Dim oHttp                    
Dim strResult 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
oHttp.setOption(2) = 13056
oHttp.setOption(3) = "certificate store name/friendlyname of certificate"
oHttp.open "POST", SOAP_ENDPOINT, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION
oHttp.send SOAP_REQUEST
0 голосов
/ 10 февраля 2012

Вероятно, это действительно вопрос ServerFault.com, в конце концов, если код работает нормально, то это не программная проблема.

Однако я бы попробовал пару вещей.Сначала попробуйте использовать ProgID «MSXML2.ServerXMLHTTP.3.0», в некоторых случаях MSXML3 будет вести себя по-разному в зависимости от того, какой ProgID использовался для создания экземпляра компонента.Также обновление из других источников, таких как ваш поставщик антивирусов (у Sophos была эта проблема), может прервать установку MSXML.

Еще один ProgID, который нужно попробовать - это «MSXML2.ServerXMLHTTP.6.0» после установки MSXML6.Если проблема связана с обновлением ядра MSXML3, возможно, у ядра MSXML6 такой же проблемы нет.

...