Только что нашел решение, которое прошло тестирование на:
- Windows 10 (IIS 10)
- Windows 2012 R2 (IIS 8.5)
Это проблема клиента. MSXML2.ServerXMLHTTP действительно требует от вас использования сертификата клиента при вызове конечной точки, защищенной с помощью SSL (даже если конечная точка не требует этого), как отметил OP.
На веб-сервере вам необходимо:
- Создание сертификата клиента
- Назначение разрешений для сертификата
- Установить сертификат для объекта 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
Надеюсь, это все еще поможет.