Table of Contents

ВСЕ ЧТО ОПИСАНО ТУТ - НЕ РАОТАЕТ! То есть можно установить сертификат сервера web-интерфейса XenApp на nginx и терминировать сессию SSL на nginx и сам web-интерфейс будет работать правильно. НО! приложения в таком виде не запускаются! Citrix Reciever делает какой-то HTTPS запрос, который не имеет заголовка, а содержит несколько шестнадцатеричных символов и nginx этого не понимает!

Поэтому - в качестве reverse proxy и балансировщика нагрузки надо использовать HAproxy как описано тут: HAproxy - балансировщик нагрузки и reverse-proxy для XenApp и других HTTPS сервисов на одном IP

План работ:
Экспорт сертификата сервера Web-интерфейса в формате PFX (формат понятный Windows 2008).
Экспорт корневого сертификата нашего центра сертификации.
Преобразование сертификата сервера Web-интерфейса из формата PFX в формат PEM (понятный nginx).
Преобразование корневого сертификата нашего центра сертификации из формата *.cer в формат PEM (понятный nginx).
Настройка nginx
Настройка Web-интерфейса XenApp.

Итак приступим.

Шаг 1: Экспорт сертификата

Запускаем mmc.exe
Заходим в меню 'Console' и нажимаем 'Add/Remove Snap-in'.
Нажимаем кнопку 'Add', выбираем 'certificates' и нажимаем 'Add'.
Выбираем 'Computer Account' и нажимаем 'Next'.
Выбираем 'Local Computer' и нажимаем 'OK'.
Нажимаем 'Close' и затем 'OK'.
Разворачиваем меню 'Certificates' и нажимаем на папку 'Personal'.
Делаем правый клик на сертификате который будем экспортировать и выбираем 'All tasks' → 'Export'.
Появляется мастер. Убеждаемся что стоит галочка добавления приватного ключа и продолжаем выполнять инструкции мастера пока не будет сгенерирован .PFX файл.

Шаг 2: Экспорт корневого сертификата центра сертификации

Запускаем mmc.exe
Заходим в меню 'Console' и нажимаем 'Add/Remove Snap-in'.
Нажимаем кнопку 'Add', выбираем 'certificates' и нажимаем 'Add'.
Выбираем 'Computer Account' и нажимаем 'Next'.
Выбираем 'Local Computer' и нажимаем 'OK'.
Нажимаем 'Close' и затем 'OK'.
Разворачиваем меню 'Certificates' и нажимаем на папку 'Доверенные корневые центры сертификации'.
Делаем правый клик на сертификате который будем экспортировать и выбираем 'All tasks' → 'Export'.
Появляется мастер. Формат экспортируемого файла - X.509 (CER) в кодировка DER.

Шаг 3 : Перебрасываем сертификаты на машину nginx и извлекаем приватный ключ из сертификата сервера web-интерфейса

Передаем сертификат на машину с nginx и экспортируем приватный ключ из .PFX файла.

openssl pkcs12 -in webserver.pfx -nocerts -out webserver_key.pem

Следующая команда удалит пароль из приватного ключа, чтобы nginx не запрашивал его при старте.

openssl rsa -in webserver_key.pem -out webserver_key_nopassword.pem

И заменим файл с паролем на файл без пароля:

mv webserver_key_nopassword.pem webserver_key.pem

Для извлечения приватного ключа из PFX-файла выполните команду:

openssl pkcs12 -in filename.pfx -nocerts -out privatekey.pem\\

Для извлечения сертификата из PFX-файла выполните команду:

openssl pkcs12 -in filename.pfx -clcerts -nokeys -out certificate.crt\\

Шаг 4 : Извлекаем сертификат .pem из сертификата сервера web-интерфейса .pfx

Экспортируем сертификат из .PFX файла.

openssl pkcs12 -in webserver.pfx -clcerts -nokeys -out webserver_cert.pem

Шаг 5: Конвертируем корневой сертификат в формат PEM и присоединяем его к сертификату web-сервера

Конвертация из DER в PEM:

openssl x509 -inform der -in CA_certificate.cer -out CA_certificate.pem

А затем объединить корневой сертификат и сертификат сервера:

cat CA_certificate.pem >> webserver_cert.pem

Шаг 6: Настраиваем nginx

Во первых положим файлы сертификата и ключа в папку с конфигурацией nginx. У меня конфигурация nginx лежит в каталоге /usr/local/nginx/conf/.

cp webserver_cert.pem /usr/local/nginx/conf/certs/webserver_cert.pem
cp webserver_key.pem /usr/local/nginx/conf/certs/webserver_key.pem

Затем в конфигурации nginx пропишем reverse-proxy на наш web-интерфейс XenApp:

server {
listen 443 ssl;
server_name xenapp.mycompany.com;

ssl                     on;
ssl_protocols           SSLv3 TLSv1;
ssl_certificate /usr/local/nginx/conf/certs/webserver_cert.pem;
ssl_certificate_key /usr/local/nginx/conf/certs/webserver_key.pem;

access_log /var/log/nginx/xenapp.mycompany.com.log main;

location / {
proxy_pass http://xenapp.mycompany.com;
}
}

С хоста nginx имя xenapp.mycompany.com должно резолвится в локальный IP-адрес сервера с Web-интерфейсом. Для этого пропишем его в /etc/hosts или на внутренний DNS.

Шаг 7: Настройка Web-интерфейса XenApp

У меня оба сайта Web-интерфейса настроены на 80 порту (без HTTPS). Настройка Web-интерфейса XenApp сводится к изменениию режима Secure Access.
До использования nginx у меня на одном сервере работали все компоненты XenApp - LicServer, сам XenApp, а также его Web-интерфейс и SecureGateway. В такой конфигурации у меня работал режим GatewayDirect. Теперь, когда мы избавились от SecureGateway, режим Secure Access нужно изменить на Direct.