Одним из важнейших требований, предъявляемых к протоколам обмена данными между информационными системами, является их защищенность. К сожалению, веб-сервисы SAS не поддерживают ни один из широко распространенных криптографических протоколов. Организовать защищенный обмен данными можно только с использованием стороннего веб-сервера, поддерживающего протоколы с шифрованием и выполняющего роль промежуточного звена между клиентом и веб-сервисами SAS.
В нашем случае в роли сервера SAS Web Application использовался JBoss 4.2.3 GA, а в роли стороннего веб-сервера – NGINX 1.10.0. Пример такое решения схематично изображен на рис. 1.
Рис. 1: Использование промежуточного веб-сервера для организации защищенного обмена данными.
Криптографический протокол SSL, который поддерживает NGINX, (а также его последующие реализации SSL 2.0, 3.0, TLS 1.0, 1.2) является «прослойкой» между прикладными и транспортными (в нашем случае – HTTPS и TCP/IP) протоколами. Для идентификации участников соединения (клиента и сервера) и шифрования данных, SSL использует цифровые сертификаты. Сертификаты могут быть самоподписными или выданными доверенным удостоверяющим центром (CA - Certificate Authority). С самоподписным сертификатом сложности могут возникнуть из-за того, что клиент не признает сервер доверенным. В большинстве случаев сервер SAS Web Application расположен внутри корпоративной сети и принимает запросы только от клиентов, находящихся внутри той же корпоративной сети, поэтому для выдачи SSL-сертификата логично использовать внутрикорпоративный CA.
Несомненным достоинством NGINX является предельная простота установки и настройки. Для начала необходимо скачать NGINX со страницы: http://nginx.org/ru/download.html. Установка готовых стабильных пакетов для Linux описана на странице http://nginx.org/ru/linux_packages.html#stable. Для Windows нужно просто скачать и распаковать архив. Настройка NGINX ограничивается редактированием конфигурационного файл nginx.conf, где нужно указать параметры виртуального хоста и описать правила перенаправления, используя директиву location. Пример такой конфигурации приведен ниже:
server {
listen 443 ssl;
server_name localhost;
proxy_connect_timeout 350;
proxy_send_timeout 350;
proxy_read_timeout 350;
send_timeout 350;
ssl_certificate C:/nginx-1.10.0/имя_вашего_сертификата.cer;
ssl_certificate_key C:/nginx-1.10.0/ имя_вашего_сертификата.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8080/имя _вашего_сервиса;
proxy_redirect off;
}
location /SASBIWS/services/имя _вашего_сервиса {
proxy_pass http://localhost:8080/SASBIWS/services/имя _вашего_сервиса;
proxy_redirect off;
}
}
Некоторые пояснения по директивам:
listen – задает порт и протокол виртуального сервера;
server_name - задает имя виртуального сервера (используем имя localhost, т.к. перенаправления осуществляются в рамках одного хоста);
ssl_certificate, ssl_certificate_key - полные пути к файлам с открытым и закрытым ключами, которые будут использоваться для SSL-соединения;
location – устанавливает конфигурацию в зависимости от URI запроса (в нашем случае конфигурации идентичные, используем для того, чтобы сделать перенаправление на конкретные сервисы SAS).
Работа NGINX под Windows имеет некоторые особенности: его можно запустить и как службу, и как процесс. Запустить, как службу поможет Windows Server Wrapper. Службу можно настроить на перезапуск в случае остановки, а также автоматический запуск при старте системы. Опыт эксплуатации связки NGINX+JBoss, показал, что при перезапуске или недоступности сервера SAS Web Application процессы NGINX завершаются самопроизвольно. Поэтому необходимо периодически проверять наличие процессов nginx.exe в оперативной памяти системы. Например, это можно сделать при помощи скрипта, запускаемого по расписанию. Пример такого скрипта:
' Имя сценария: nginxprocmonitor.vbs
' Версия: 1.0
' Описание: Запускает процесс nginx, если он не запущен.
'
Option Explicit
Dim strComputer, strProcess, strRunDir, objWshShell
strComputer = "."
strProcess = "nginx.exe"
strRunDir = "C:\nginx-1.10.0"
Set objWshShell= WScript.CreateObject("WScript.Shell")
If Not isProcessRunning(strComputer, strProcess) then
objWshShell.CurrentDirectory = strRunDir
objWshShell.Run "nginx.exe",0,False
End If
Function isProcessRunning(byval strComputer,byval strProcessName)
Dim objWMIService, strWMIQuery
strWMIQuery = "SELECT * FROM Win32_Process WHERE name LIKE '" & strProcessName & "'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
If objWMIService.ExecQuery(strWMIQuery).Count > 0 Then
isProcessRunning = True
Else
isProcessRunning = False
End If
End Function
По умолчанию сервисы SAS используют порт 8080, поэтому для блокировки работы по протоколу HTTP используем брандмауэр. Проверить работоспособность вновь опубликованного HTTPS-сервиса можно, обратившись к его wsdl-описанию:
https://sasrtdmhost/SASBIWS/services/имя_вашего_сервиса?wsdl
После успешной проверки, не забудьте поменять адреса сервисов SAS на новые, т.к. старые мы заблокировали брандмауэром.