База знаний
OpenSSl engine.TLS ГОСТ в Apache на Linux/UNIX
Опубликовано Николай Батищев on 2016-02-25 17:27

1. Установка и настройка CSP

Порядок действий будет рассмотрен на примере Debian8 x32, Apache 2.4.17, openssl 1.0.1k, КриптоПро CSP 3.9.8227.

Устанавливаем CSP KC2 (потому что fork) дистрибутив можно взять с сайта, GOST_capi и патченый mod_ssl в этой теме https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=55563#post55563. Получаем сертификат (CommonName=hostname/ip, 1.3.6.1.5.5.7.3.1). Сертификат и ключ устанавливаются в личное хранилища пользователя, имеющего права на запуск apache. Сертификат сервера и корневой сертификат (не обязательно) необходимо экспортировать в файлы, затем конвертировать в pem при помощи openssl. Конфигурируем openssl в openssl.cnf вписываем следующее (после строки, oid_section = new_oids)
 
openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
gost_capi = gost_section

[gost_section]
engine_id = gost_capi
dynamic_path = /opt/cprocsp/cp-openssl/lib/ia32/engines/libgost_capi.so
default_algorithms = CIPHERS, DIGESTS, PKEY, PKEY_CRYPTO, PKEY_ASN1
 
Что бы проверить правильность работы криптографии делаем следующее

Проверяем подгружается ли engine в openssl
 
$ openssl engine
(dynamic) Dynamic engine loading support
(gost_capi) CryptoPro ENGINE GOST CAPI ($Revision: 127755 $)

Пробуем подписать произвольный файл. Проверяем доступность сертификата, привязку к закрытому ключу
 
$ openssl cms -sign -engine gost_capi -keyform ENGINE -inkey CommonName -in ~/test -out ~/test.sig -outform PEM -CAfile ~/root.pem -nodetach -signer ~/server.pem
engine "gost_capi" set.
$ cat ~/test.sig
-----BEGIN CMS-----
MIIFQQYJKoZIhvcNAQcCoIIFMjCCBS4CAQExDDAKBgYqhQMCAgkFADAVBgkqhkiG
9w0BBwGgCAQGdGVzdA0KoIIDBzCCAwMwggKyoAMCAQICExIAC5ydtBZgmo+ltZQA
AAALnJ0wCAYGKoUDAgIDMH8xIzAhBgkqhkiG9w0BCQEWFHN1cHBvcnRAY3J5cHRv
cHJvLnJ1MQswCQYDVQQGEwJSVTEPMA0GA1UEBxMGTW9zY293MRcwFQYDVQQKEw5D
UllQVE8tUFJPIExMQzEhMB8GA1UEAxMYQ1JZUFRPLVBSTyBUZXN0IENlbnRlciAy
MB4XDTE1MTIxNzEzNDM1M1oXDTE2MDMxNzEzNTM1M1owFTETMBEGA1UEAxMKcmFi
b3RhaXBsejBjMBwGBiqFAwICEzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEBwjdZR
m1z7BFGD9ZiYfCiGwfSSMo/wflpLwyaCLEQTLMFRQ2Jy47u/e9Srjo0rUPzvanEy
HNf5UxRjQbTf8dHio4IBbTCCAWkwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0P
BAQDAgTwMB0GA1UdDgQWBBR1TVlbx4Bw3ClqLMl3TC99wO7tgjAfBgNVHSMEGDAW
gBQVMXywjRreZtcVnElSlxckuQF6gzBZBgNVHR8EUjBQME6gTKBKhkhodHRwOi8v
dGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NSWVBUTy1QUk8lMjBUZXN0
JTIwQ2VudGVyJTIwMi5jcmwwgakGCCsGAQUFBwEBBIGcMIGZMGEGCCsGAQUFBzAC
hlVodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3QtY2Et
MjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIuY3J0MDQGCCsGAQUF
BzABhihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgG
BiqFAwICAwNBAF9oQ3OryjpX+z00TdNMQA+EVN5IOQjXs05+coxo5jV67IA4ZnNN
5k/67Jd1ol5413In2/pOxyQ32KfhbK/rX7IxggH3MIIB8wIBATCBljB/MSMwIQYJ
KoZIhvcNAQkBFhRzdXBwb3J0QGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUxDzAN
BgNVBAcTBk1vc2NvdzEXMBUGA1UEChMOQ1JZUFRPLVBSTyBMTEMxITAfBgNVBAMT
GENSWVBUTy1QUk8gVGVzdCBDZW50ZXIgMgITEgALnJ20FmCaj6W1lAAAAAucnTAK
BgYqhQMCAgkFAKCB+jAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3
DQEJBTEPFw0xNTEyMjExMjExNDNaMC8GCSqGSIb3DQEJBDEiBCDiut37IX+KCrgA
pAYvmxrdyKrvZdSpMiJkoOLPzMtbEjCBjgYJKoZIhvcNAQkPMYGAMH4wCwYJYIZI
AWUDBAEqMAgGBiqFAwICCTAIBgYqhQMCAhUwCwYJYIZIAWUDBAEWMAsGCWCGSAFl
AwQBAjAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAw
BwYFKw4DAgcwDQYIKoZIhvcNAwICASgwCgYGKoUDAgITBQAEQKz/xzlSEL9sp3FI
hm4kdHj3+eOfU5cKqjMhQq484uJZ850dLutHRXy41A3hc3R9PWEGDcs+n5GGH6s2
I/YOnog=
-----END CMS-----
 
Запускаем TLS сервер средствами openssl
 
$ openssl s_server -engine gost_capi -keyform ENGINE -key SubjectName -cert ~/server.pem
engine "gost_capi" set.
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT
-----BEGIN SSL SESSION PARAMETERS-----
MGMCAQECAgMBBAIAgQQABDBFgKZK72SyVFfdVzqS9bJA9yxmELGenmfZbkob9h9e
hLziI6cVqXAOdVWsb/kbSHOhBgIEVngPs6IEAgIBLKQGBAQBAAAApgwECnJhYm90
YWlwbHo=
-----END SSL SESSION PARAMETERS-----
Shared ciphers:GOST2001-GOST89-GOST89:DHE-DSS-AES128-SHA
CIPHER is GOST2001-GOST89-GOST89
Secure Renegotiation IS supported
GET / HTTP/1.1
User-Agent: Webclient
Accept:*/*
Host: rabotaiplz
Connection: close
 
Подключаемся как клиент, при помощи csptest
 
:~$ /opt/cprocsp/bin/ia32/csptestf -tlsc -server rabotaiplz -port 4433 -v
/opt/cprocsp/bin/ia32/csptestf -tlsc -server rabotaiplz -port 4433 -v
5 algorithms supported:
[0] 1.2.643.2.2.21 (ГОСТ 28147-89)
[1] 1.2.643.2.2.3 (ГОСТ Р 34.11/34.10-2001)
[2] 0x801f
[3] 1.2.643.2.2.20 (ГОСТ Р 34.10-94)
[4] 1.2.643.2.2.19 (ГОСТ Р 34.10-2001)
Cipher strengths: 256..256
Supported protocols: 0x80
Protocol version: 3.1
ClientHello: RecordLayer: TLS, Len: 117
Cipher Suites: (00 81) (00 32) (00 31)
122 bytes of handshake data sent
857 bytes of handshake data received
210 bytes of handshake data sent
222 bytes of handshake data received
Handshake was successful
SECPKG_ATTR_CIPHER_INFO: Proto: 80, Suite: 81 (TLS_GOST_R_3410_01_WITH_28147_CNT_IMIT)
SECPKG_ATTR_NAMES: CN=rabotaiplz
SECPKG_ATTR_PACKAGE_INFO not supported.

Server certificate:
Subject: CN=CommonName
Valid  : 17.12.2015 13:43:53 - 17.03.2016 13:53:53 (UTC)
Issuer : , C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2

Protocol: TLS 1.0
Cipher: 0x661e
Cipher strength: 256
Hash: 0x801e
Hash strength: 256
Key exchange: 0xaa25
Key exchange strength: 512

Header: 5, Trailer: 4, MaxMessage: 16384

HTTP request: GET / HTTP/1.1
User-Agent: Webclient
Accept:*/*
Host: rabotaiplz
Connection: close


Sending plaintext: 90 bytes
108 bytes of application data sent
 
2. Сборка и конфигурация apache

Apache собирается из исходников с пропатченым mod_ssl. В обязательном порядке включается параметр --enable-ssl. Конфигурируете сервер исходя из ваших нужд.
Основные моменты: 
Раскоментировать строку “LoadModule ssl_module modules/mod_ssl.so” в httpd.conf
Директива SSLCertificateKeyFile должны выглядеть примерно так:
SSLCertificateKeyFile "engine:gost_capi:CommonName"
Ключ должен находиться в хранилище пользователя, имеющего привилегии на запуск сервера (не тот, что указан в httpd.conf, а непосредственно тот, от имени которого стартует сервер).
Привожу в пример мой конфигурационный файл:

 

<VirtualHost HostName:443>
    ServerAdmin 
    DocumentRoot "/opt/apache2/htdocs"
    ServerName HostName:443
    ErrorLog "logs/tls-error_log"
    CustomLog "/var/logs/tls-access_log" common

    <Directory "/opt/apache2/htdocs">
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile "/home/stos/server.pem"
    SSLCertificateKeyFile "engine:gost_capi:CommonName"
</VirtualHost>

 

(0 vote(s))
Helpful
Not helpful

Коментарии (0)