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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 8 Next »

Введение

Протокол 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