Page tree
Skip to end of metadata
Go to start of metadata

Введение

Протокол TLS решает следующие задачи:

  • Взаимная аутентификация сервера и клиента на основе цифровых сертификатов
  • Шифрование передаваемых данных
  • Обеспечение целостности передаваемых данных

Опциональной составляющей протокола TLS является строгая аутентификация клиента. Для этой цели всем клиентам WEB-сервиса выдается ключ и сертификат TLS-аутентификации.

Если рассматривать процедуру аутентификации клиента упрощенно, то сервер и клиент вырабатывают ключ согласования на основе открытого ключа сервера и закрытого ключа клиента, и затем на основе шифрования рендома с приложением сертификата клиента сервер аутентифицирует клиента и авторизует его на WEB-ресурсе.

В протоколе TLS для аутентификации, обеспечения целостности и шифрования данных могут использоваться комбинации различных криптографических алгоритмов - шифрсьютов в терминологии протокола. Для российских криптоалгоритмов основным шифрсьютом является GOST2001-GOST89-GOST89, при этом выработка ключа согласования производится по схеме VKO  GOST 34.10-2001.

Браузеры по умолчанию не поддерживают российскую криптографию в протоколе TLS. При этом существенным препятствием к кроссбраузерности TLS-ГОСТ является то, что различные браузеры используют различные реализации протокола: Internet Explorer базируется на Microsoft Crypto API и schannel; Mozilla Firefox на NSS; Google Chrome на NSS, а под некоторыми платформами на OpenSSL. 

В такой ситуации удобно использовать приложение sTunnel. Приложение sTunnel в режиме клиента работает по принципу прокси – принимает на “вход” незащищенное соединение от браузера, устанавливает защищенное по протоколу TLS соединение с удаленным WEB-сервером, транслирует данные на удаленный сервер от клиента и обратно по этому защищенному соединению.

STunnel  использует в качестве криптоядра OpenSSL, что c одной стороны обеспечивает поддержку шифрсьюта GOST2001-GOST89-GOST89, а с другой позволяет для хранения ключа аутентификации и сертификата использовать Рутокен ЭЦП. При этом выработка ключа согласования по схеме VKO  GOST 34.10-2001 проводится аппаратно, на “борту” Рутокен ЭЦП, а закрытый ключ никогда не покидает устройство, и вредоносное ПО не может украсть его из оперативной памяти компьютера.

Для подключения Рутокен ЭЦП к sTunnel  используется engine PKCS11_GOST.

Сборка и конфигурирование sTunnel версии 5-16

Внимание! Сборку следует осуществлять с openssl версии старше 1.0.1f.

Stunnel следует собирать с патчем (для версии 5-16). 

Патч поддержки российских криптоалгоритмов
diff --git a/src/client.c b/src/client.c
index 53292a6..8ba2673 100644
--- a/src/client.c
+++ b/src/client.c
@@ -358,7 +358,7 @@ NOEXPORT void remote_start(CLI *c) {
 NOEXPORT void ssl_start(CLI *c) {
     int i, err;
     SSL_SESSION *old_session;
-    int unsafe_openssl;
+    int unsafe_openssl = 1;
     X509 *peer_cert;
  
     c->ssl=SSL_new(c->opt->ctx);
@@ -395,8 +395,6 @@ NOEXPORT void ssl_start(CLI *c) {
         SSL_set_accept_state(c->ssl);
     }
  
-    unsafe_openssl=SSLeay()<0x0090810fL ||
-        (SSLeay()>=0x10000000L && SSLeay()<0x1000002fL);
     while(1) {
         /* critical section for OpenSSL version < 0.9.8p or 1.x.x < 1.0.0b *
          * this critical section is a crude workaround for CVE-2010-3864   *
diff --git a/src/ssl.c b/src/ssl.c
index 82a15e1..e651a30 100644
--- a/src/ssl.c
+++ b/src/ssl.c
@@ -82,6 +82,8 @@ NOEXPORT void cb_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
 }
  
 int ssl_configure(GLOBAL_OPTIONS *global) { /* configure global SSL settings */
+    OpenSSL_add_all_algorithms();
+    SSLeay_add_ssl_algorithms();
 #ifdef USE_FIPS
     if(FIPS_mode()!=global->option.fips) {
         RAND_set_rand_method(NULL); /* reset RAND methods */

 

Затем следует создать конфигурационный сайт sTunnel.conf:

Пример конфигурационного файла sTunnel для ОС Windows. Данный конфигурационный файл обеспечивает подключение Рутокен ЭЦП
; проверка сертификата сервера обязательна
verify=2
 
; режим работы клиент TLS-прокси
client=yes
 
; корневой сертификат
CAFile=ca2001_A-root.crt
  
; версия протокола TLS
sslVersion=TLSv1
  
; создаем иконку в трее
taskbar=yes
  
; уровень ведения логирования
DEBUG=7
  
; использовать engine PKCS11_GOST для работы с Рутокен ЭЦП
engine=pkcs11_gost
  
; использовать библиотеку PKCS#11 из директории запуска процесс
engineCtrl=MODULE_PATH:rtpkcs11ecp.dll
  
;за ГОСТ-ы отвечает engine
engineDefault=ALL
   
  
[remote system]
 
; используем для загрузки ключа engine PKCS11_GOST
engineNum = 1
 
; загружаем клиентский сертификат из файла
cert=client.crt
 
; ID ключа на Рутокен ЭЦП                                                                
key = 03:bf:4a:c2:a9:7a:bc:de:9b:e0:bb:6e:45:7c:0c:82:07:85:c6:fd
 
; прокси принимает подключения на данном порту
accept = 127.0.0.1:1443
 
; удаленный сервер
connect = 192.168.0.78:2443
 
; используем российский шифрсьют для TLS
ciphers = GOST2001-GOST89-GOST89
 
; for IE
TIMEOUTclose = 0

Установка и запуск sTunnel под ОС Windows

Как таковой установки sTunnel не требуется. Нужно в одну папку скопировать сам stunnel  и его конфигурационный файл:

  • stunnel.exe
  • stunnel.conf

библиотеки из состава openssl:

  • libeay32.dll
  • ssleay32.dll
  • gost.dll

engine поддержки Рутокен ЭЦП:

  • pkcs11_gost.dll

библиотеку PKCS#11 для Рутокен ЭЦП:

  • rtpkcs11ecp.dll

А так же корневой сертификат, на основе которого будет проверяться сертификат сервера и сертификат клиента.

 

Для запуска sTunnel следует прописать переменную окружения OPENSSL_ENGINES = [путь к директории, в которой находятся pkcs11_gost.dll и gost.dll].

При запуске должен быть подключен Рутокен ЭЦП с нужным ключом, sTunnel запросит PIN-код токена:

После ввода PIN-кода в трее должна появиться иконка туннеля:

После этого браузером можно идти на http://127.0.0.1:1443 и вы попадете на удаленный сервер по защищенному соединению с аутентификацией клиента:

Как получить тестовый сертификат TLS-аутентификации 

Для того, чтобы попробовать sTunnel на нашей тестовой площадке требуется корневой сертификат, который следует положить в файл ca.crt, прописанный в параметре CAFile конфигурационного файла stunnel.conf. Этот корневой будет использоваться при проверке сертификата сервера.

 

Тестовый корневой сертификат
-----BEGIN CERTIFICATE-----
MIICTDCCAfugAwIBAgIQK24zUf1usq1IIAIDy1uhQTAIBgYqhQMCAgMwfzEjMCEG
CSqGSIb3DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8w
DQYDVQQHEwZNb3Njb3cxFzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQD
ExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDIwHhcNMTQwODA1MTM0NDI0WhcNMTkw
ODA1MTM1NDAzWjB/MSMwIQYJKoZIhvcNAQkBFhRzdXBwb3J0QGNyeXB0b3Byby5y
dTELMAkGA1UEBhMCUlUxDzANBgNVBAcTBk1vc2NvdzEXMBUGA1UEChMOQ1JZUFRP
LVBSTyBMTEMxITAfBgNVBAMTGENSWVBUTy1QUk8gVGVzdCBDZW50ZXIgMjBjMBwG
BiqFAwICEzASBgcqhQMCAiMBBgcqhQMCAh4BA0MABEDgUgrcR9wpvdcgXwxIfO/U
jR52JdC9UgWOrc3Ky2YMpunm+lAm5JIgbnCASrzW/Q43EMfmhQGy7dZijrm3zcee
o1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUFTF8
sI0a3mbXFZxJUpcXJLkBeoMwEAYJKwYBBAGCNxUBBAMCAQAwCAYGKoUDAgIDA0EA
2MocS+lhIGVHLNXI6jiI3s3scchFv7+c5d7/VVp3JJnt4Lki0avn90/m0G97j1oq
407pZA2QUDLB8eO0SRJX1Q==
-----END CERTIFICATE-----

 

Для получения клиентского сертификата следует выполнить инструкцию: 

  1. Устанавливаем Рутокен Плагин, идем на http://ra.rutoken.ru
  2. Подключаем Рутокен ЭЦП, логинимся
  3. Создаем ключевую пару, ID ключевой пары прописываем в конфигурационный файл sTunnel.conf в параметр key:
  4. Формируем для этой ключевой пары запрос на сертификат:
  5. Получаем тестовый сертификат:
  6. Скопируем полученный сертификат в файла client.crt, прописанный в параметре cert конфигурационного файла stunnel.conf

  • No labels