Отказ от ответственности : Я пробовал поискать в Google что-то, что будет делать то, что я хочу, но не повезло. Я надеюсь, что кто-то здесь сможет протянуть руку.
Фон
У меня есть библиотека классов .NET, которая обращается к защищенному веб-сервису с помощью библиотеки WSE 2.0. Веб-служба предоставляет интерфейс для центральной базы данных (на самом деле это часть сети обмена данными, охватывающей несколько клиентов), а библиотека классов предоставляет простую оболочку для вызовов веб-службы, чтобы сделать ее доступной из унаследованного приложения VB6. Устаревшее приложение использует библиотеку классов для извлечения и публикации информации в веб-службе. В настоящее время приложение и библиотека библиотек классов установлены на стороне клиента на нескольких рабочих станциях.
Проблема
Суть в том, что веб-сервис, к которому мы обращаемся, использует HTTPS, и для доступа к нему необходимо предоставить действительный сертификат клиента X509. Поскольку все наши компоненты находятся на клиентском компьютере, это привело к проблемам развертывания. Например, нам необходимо загрузить и установить сертификаты для каждого пользователя на каждом клиентском компьютере, по одному для каждого пользователя, которому может потребоваться доступ к веб-службе через наше приложение. Более того, сам веб-сервер должен быть доступен через VPN (в частности, OpenVPN), что означает, что VPN-клиент должен быть установлен и настроен на каждом клиентском компьютере. Это большая проблема (у некоторых наших клиентов десятки рабочих станций).
Предлагаемое решение
Предлагаемое решение - перенести всю эту логику на центральный сервер на сайте клиента. В этом сценарии наше унаследованное приложение будет связываться с локальным сервером, который затем отключится и перенаправит запросы в реальный веб-сервис. Кроме того, все сертификаты X509 будут установлены на сервере, а не на каждом отдельном клиентском компьютере, в рамках усилий по упрощению и централизации развертывания.
Пока что у нас есть три варианта:
- Найдите готовый прокси-сервер SOAP, который может принимать входящие запросы SOAP на основе HTTP, изменять заголовок
Host
и связанные с маршрутизацией части сообщения SOAP (чтобы они указывали на настоящий веб-сервер), открывать SSL-соединение с реальным веб-сервером, представление правильного клиентского сертификата серверу (на основе сопоставления имени пользователя и сертификата), пересылка измененного запроса, чтение ответа, преобразование его обратно в открытый текст и отправка его обратно клиенту .
- Напишите прокси-сервер вручную, который сделает все, что я только что упомянул.
- Придумайте совершенно другой и, надеюсь, лучший способ решения этой проблемы.
Обоснование
Логическое обоснование попытки найти и / или написать прокси-сервер SOAP состоит в том, что нашу существующую библиотеку оболочки .NET вообще не нужно будет изменять. Мы просто указали бы на прокси-сервер вместо реальной конечной точки веб-службы, используя простое HTTP-соединение вместо HTTPS. Прокси-сервер обработает запрос, изменит его так, чтобы реальный веб-сервис принял его (например, изменил заголовок SOAPAction
, чтобы он был правильным), обработал рукопожатие SSL / сертификата и отправил необработанные данные ответа назад к клиенту.
Тем не менее, в лучшем случае это звучит как ужасный хак для меня. Итак, какие наши варианты здесь?
- Могу ли я прикусить пулю и написать свой собственный прокси-сервер с поддержкой HTTP / SSL / SOAP / X509, чтобы сделать все это?
- Или ... есть готовое решение с достаточно расширяемым API, чтобы я мог легко заставить его делать то, что я хочу
- Или ... я должен использовать совершенно другой подход?
Ключевыми проблемами, которые мы пытаемся решить, являются (а) централизация места хранения сертификатов для упрощения установки и управления сертификатами и (б) настройка таким образом, чтобы VPN-подключение к веб-серверу осуществлялось только с одного компьютера, вместо того, чтобы на каждом клиенте было установлено программное обеспечение VPN-клиента.
Обратите внимание, что мы не контролируем веб-сервер, на котором размещен веб-сервис.
РЕДАКТИРОВАТЬ : Для пояснения, я уже внедрил (довольно дрянной) прокси-сервер в C #, который отвечает требованиям, но что-то мне кажется в корне неверным по поводу всего этого подхода к проблеме. Так что, в конечном счете, я ищу либо подтверждение того, что я на правильном пути, либо полезный совет, говорящий мне, что я иду по этому пути совершенно неправильно, и любые советы, как сделать это лучше (если есть такой, который Я подозреваю, что есть).