Продолжаем нашу историю с шифрованием
данных, передающихся от клиента к
терминальному серверу.
Конфигурируем
Сервер VNC
Прежде чем мы попробуем установить
безопасное соединение между сервером и
клиентом VNC, нужно сконфигурить Stunnel и
определить в нем все ключи и сертификаты.
Для этого в каталоге Stunnel создаем файл
конфигурации stunnel.conf примерно следующего
содержания:
CAfile = CAcert.pem
CApath = certificates
cert = server.pem
client = no
verify = 3
[vnc]
accept = 443
connect = 127.0.0.1:5900
Он означает, что все входящие соединения
к 443 порту будут форвардится на локальный
порт 5900. Естественно, происходить это будет
только в том случае, если клиент подтвердит
свою благонадежность предоставив
правильный сертификат, который должен
храниться в локальной директории
сертификатов (пункт конфига verify = 3 говорит о
том, что сертификат должен удостоверяться
обоими сторонами).
Следующий шаг как раз и состоит в том, что
бы запихнуть сертификаты в директорию Stunnel:
сертификат СА (C:\CA\CAcert.pem), приватный и открытый
ключ VNC (C:\CA\temp\vnc_server\server.pem). Наконец надо
загрузить сертификат VNC. Для того, что бы Stunnel мог найти его в
процессе аутентификации, нужно сперва
определить его имя:
C:\progra~1\openssl\openssl x509 -hash -noout -in client.crt
и затем скопировать client.crt в файл, имя
которого определит openssl, а расширение равно
0.
cd C:\CA\temp\vnc_client
C:\progra~1\openssl\openssl x509 -hash -noout -in client.crt
value
copy client.crt value.0
Получившийся файл копируем в C:\Program
Files\Stunnel\certificates. В результате должно
получится примерно следующее:
VNC Client
Процедура конфигурирования клиента
практически аналогична серверу. Делаем
stunnel.conf:
CAfile = CAcert.pem
CApath = certificates
cert = client.pem
client = yes
verify = 3
[vnc]
accept = 127.0.0.1:5900
connect = VNC_server_IP_address:443
Переписываем C:\CA\CAcert.pem
и C:\CA\temp\vnc_client\client.pem
в директорию Stunnel. Определяем имя сертификата сервера:
C:\progra~1\openssl\openssl x509 -hash -noout -in server.crt
и переписываем server.crt в имя.0. Получаем
примерно следующее:
Тестируем
Софт вроде как настроен - надо тестить.
Запускаем Stunnel на клиенте и сервере,
стартуем VNC. На клиенте VNC запускаем vncviewer.exe,
в качестве удаленного компьютера вводим
127.0.0.1. Если все сконфигурировано правильно
соединение должно установиться и Stunnel
сообщит об этом. Если нет - упорно роемся в
логам и пытаемся выяснить причину неудачи.
Для этого в конфиг Stunnel надо добавить:
debug = 7
и рестартовать программу.
Обратное соединение
Приведенный выше метод прекрасно
работает если клиент и сервер находятся в
одной сети. Но что если сервер VNC находится
за файрволом или NAT и внешние соединения к
нему не проходят?
Это можно обойти благодаря опции /listen в
клиенте VNC. В традиционной ситуации клиент-сервер
именно клиент инициирует TCP/IP соединение. Однако в
приведенном выше примере это работать не
будет, так как клиент просто не сможет
пробиться к серверу. Но в VNC конечно можно
обойти подобный казус и установить
обратное соединение.
На сервере пишем конфиг:
CAfile = CAcert.pem
CApath = certificates
cert = server.pem
client = yes
verify = 3
[vnc]
accept = 127.0.0.1:5500
connect = VNC_client_IP_address:443
На клиенте:
CAfile = CAcert.pem
CApath = certificates
cert = client.pem
client = no
verify = 3
[vnc]
accept = 443
connect = 127.0.0.1:5500
Ясно, что в этом случае клиент и сервер
поменялись ролями, сервер Stunnel стал SSL
клиентом, а Stunnel на клиентской стороне - SSL
сервером. Так же необходимо изменить способ,
каким соединяются VNC. Необходимо запустить
vncviewer.exe в слушающем режиме (пункт Run Listening VNC
Viewer в меню), потом на VNC сервере нужно
добавить нового клиента 127.0.0.1. После этого
остается лишь протестировать соединение и
определить его работоспособность :).
Неудобство метода состоит в том, что для
установления соединения необходимо
выполнить определенные действия на
сервере, что не совсем удобно. Автор статьи
предлагает засунуть все это во встроенный
шедулер и раз в 10 минут запускать сервер в
слушающем режиме.
Ссылки: