Приветствую.
Друзья, товарищи, совсем отчаялся найти решение сам, поэтому излагаю в надежде на помощь или хотя бы моральную поддержку.
Суть проблемы, а точнее задачи сводится к настройке двухстороннего TLS соединения с сервером ЕИС (int223.zakupki.gov.ru).
Выдержка из
инструкции по настройке:
Используется криптографический протокол TLS. Соединение устанавливается по протоколу TLS в режиме двухсторонней аутентификации с дополнительной проверкой сертификата электронной подписи (далее - ЭП).
Так вот сертификат есть, он валидный и состоит в цепочке сертификатов, которые представлены у них на сайте. (вы не поверите, зашел на zakupki.gov.ru, а там оповещение о регламентных работах
в период с 22:00 20.09.2019 по 12:00 31.09.2019
именно сегодня...)
Ну да ладно суть не в этом.
Так вот двухсторонний TLS решил поднять через sTunnel на CentOS 7.
Для корректной работы с подобными системами необходима поддержка шифрования ГОСТ 2012 в openssl. При чем в версии openssl 1.0.x эта штука входила в коробку, а начиная с версии openssl 1.1.x уже нет и на этом фоне кто-то написал
вот такой вот репозиторий на гитхабе для сборки этой самой поддержки.
Собрал это дело под версию OpenSSL 1.1.1d. Это мне удалось практичеки без проблем.
Далее нужно настроить sTunnel, который будет по сути проксировать трафик через себя, шифруя его через openssl с этим самым ГОСТом.
Вот конфиг sTunnel
foreground = yes
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
pid = /usr/local/etc/stunnel/stunnel.pid
output = /usr/local/etc/stunnel/stunnel.log
debug = 7
verify = 2
engine = gost
CAfile = /usr/local/etc/stunnel/certs/ca.pem
cert = /usr/local/etc/stunnel/certs/cl.pem
[zakupki]
client = yes
accept = 127.0.0.1:1000
connect = int223.zakupki.gov.ru:443
ciphers = GOST2001-GOST89-GOST89
TIMEOUTclose = 0
Ну и конечно он не запускается с таким выводом:
[ ] Clients allowed=500
[.] stunnel 5.55 on x86_64-pc-linux-gnu platform
[.] Compiled/running with OpenSSL 1.1.1d 10 Sep 2019
[.] Threading:PTHREAD Sockets:POLL,IPv6 TLS:ENGINE,FIPS,OCSP,PSK,SNI
[ ] errno: (*__errno_location ())
[.] Reading configuration from file /usr/local/etc/stunnel/stunnel.conf
[.] UTF-8 byte order mark not detected
[ ] Enabling support for engine "gost"
[.] UI set for engine #1 (gost)
[ ] Initializing engine #1 (gost)
[ ] Engine #1 (gost) initialized
[.] FIPS mode disabled
[ ] Compression disabled
[ ] No PRNG seeding was required
[ ] Initializing service [zakupki]
[ ] Ciphers: GOST2001-GOST89-GOST89
[ ] TLSv1.3 ciphersuites: TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
[ ] TLS options: 0x02100004 (+0x00000000, -0x00000000)
[ ] Loading certificate from file: /usr/local/etc/stunnel/certs/cl.pem
[ ] Certificate loaded from file: /usr/local/etc/stunnel/certs/cl.pem
[ ] Loading private key from file: /usr/local/etc/stunnel/certs/cl.pem
[!] error queue: ssl/ssl_rsa.c:556: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib
[!] SSL_CTX_use_PrivateKey_file: crypto/pem/pem_lib.c:745: error:0909006C:PEM routines:get_name:no start line
[!] Service [zakupki]: Failed to initialize TLS context
[ ] Deallocating section defaults
Как видно из конфига stunnel используется, как клиент для подключения к серверу закупок, НО он упорото требует от меня private key, который для этого соединения не нужен. Ну и собсно сервис не запускается и ничерта не работает.
Ладно думаю, оставлю в покое stunnel, пойду помучаю openssl.
# openssl s_client -connect zakupki.gov.ru:443 -CAfile ca.pem -cert cl.pem
и получаю:
unable to load client certificate private key file
140265341962048:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY
Собсно тоже самое.
Вся эта история нужна для отправки POST запросов на сервер int223.zakupki.gov.ru.
Какие есть варианты настройки подобной интеграции, возможно есть какие-то другие схемы или другой подход?
Еще я никак не могу понять нужен ли для этого какой-нибудь криптопро (в инструкции об этом ни слова)?