Использовать файловый SSL-сертификат с запросом ServerXMLHTTP - PullRequest
0 голосов
/ 30 августа 2018

У меня есть доступ к API веб-службы (ADP Workforce Now), который использует аутентификацию OAuth2. Их стандартные инструкции включают установку сертификата SSL на клиентской рабочей станции, но у них также есть пример решения .NET, который просто напрямую использует файл сертификата (PFX). Среда .NET может сделать это с помощью класса X509Certificate2, в котором есть конструктор, который принимает имя файла напрямую. Этот объект затем используется с WebRequestHandler, таким образом:

WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = LoadCertificateFile(<pfx file path>, <key file path>, <cert password>);
handler.ClientCertificates.Add(certificate);

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

Этот «особый вкус» непосредственного использования файла PFX - это не то, что я могу воспроизвести в средах, отличных от .NET, где я использую объект MSXML2.ServerXMLHTTP (например, автоматизируя его из Visual Foxpro). Я могу сделать стандартный запрос, например:

loRequest = CREATEOBJECT("MSXML2.ServerXMLHTTP")
loRequest.SetOption(2, 13056)
loRequest.Open("POST", "https://iat-api.adp.com/auth/oauth/v2/token?grant_type=client_credentials")
loRequest.SetRequestHeader("Authorization", "Basic " + <encoded username/password>)
loRequest.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)")
loRequest.Send()

но Send(), как и ожидалось, выдает ошибку: " Для завершения аутентификации клиента требуется сертификат. "

Если я правильно установлю сертификат в своем Личном хранилище, Send() будет успешным, и мне будет выдан токен на предъявителя, который я смогу использовать для последующих вызовов API - все это прекрасно работает. Но если я удалю сертификат из личного хранилища, я вернусь к ошибке.

Как я уже сказал, сторона .NET имеет этот класс сертификатов и возможность добавлять сертификаты в обработчик веб-запросов. Как мне сделать то же самое из не-.NET? Это первый раз, когда я не смог заставить что-то работать, не завися от более сложных библиотек .NET. По правде говоря, в любом случае я, скорее всего, буду придерживаться .NET, поскольку его обработка JSON гораздо более элегантна, чем та, что я работаю в Visual Foxpro. Но я все же хотел бы иметь возможность использовать прямую проверку подлинности SSL-сертификата из-за пределов .NET. Мне нравятся некоторые автономные исполняемые файлы без зависимостей.

...