Протокол 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. Внимание! Сборку следует осуществлять с openssl версии старше 1.0.1f. Stunnel следует собирать с патчем (для версии 5-16). Затем следует создать конфигурационный сайт sTunnel.conf: Как таковой установки sTunnel не требуется. Нужно в одну папку скопировать сам stunnel и его конфигурационный файл: библиотеки из состава openssl: engine поддержки Рутокен ЭЦП: библиотеку PKCS#11 для Рутокен ЭЦП: А так же корневой сертификат, на основе которого будет проверяться сертификат сервера и сертификат клиента. Для запуска sTunnel следует прописать переменную окружения OPENSSL_ENGINES = [путь к директории, в которой находятся pkcs11_gost.dll и gost.dll]. При запуске должен быть подключен Рутокен ЭЦП с нужным ключом, sTunnel запросит PIN-код токена: После ввода PIN-кода в трее должна появиться иконка туннеля: После этого браузером можно идти на http://127.0.0.1:1443 и вы попадете на удаленный сервер по защищенному соединению с аутентификацией клиента: Для того, чтобы попробовать sTunnel на нашей тестовой площадке требуется корневой сертификат, который следует положить в файл ca.crt, прописанный в параметре CAFile конфигурационного файла stunnel.conf. Этот корневой будет использоваться при проверке сертификата сервера. Для получения клиентского сертификата следует выполнить инструкцию: Введение
Сборка и конфигурирование 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 */
; проверка сертификата сервера обязательна
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
Как получить тестовый сертификат TLS-аутентификации
-----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-----
Патч поддержки российских криптоалгоритмов
Пример конфигурационного файла sTunnel для ОС Windows. Данный конфигурационный файл обеспечивает подключение Рутокен ЭЦП
Тестовый корневой сертификат