Apache2 с поддержкой шифрования по ГОСТ на Astra Linux Smolensk 1.6 с ключом в HSM 2.0
Опубликовано Павел Заика on 2021-06-10 15:13

В данной статье описана установка и настройка Apache2 с поддержкой шифрования по ГОСТ на Astra Linux Smolensk 1.6 с хранением ЗК в HSM 2.0.

Скачиваем дистрибутив КриптоПро CSP с сайта.

Распаковываем и устанавливаем КриптоПро CSP КС2 с дополнительными компонентами lsb-cprocsp-devel cprocsp-stunnel:
tar -xvf ./linux-amd64_deb.tgz && cd ./linux-amd64_deb/
sudo ./install.sh kc2 cprocsp-stunnel
sudo dpkg -i cprocsp-apache-modssl* cprocsp-cpopenssl*
В случае, если используемый дистрибутив не содержит пакеты cprocsp-cpopenssl*, берем их из предыдущего.

Добавляем криптопровайдеры КриптоПро HSM в конфигурацию КриптоПро CSP:
sudo -s
cd /opt/cprocsp/sbin/amd64/
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro HSM CSP' -add string 'Image Path' /opt/cprocsp/lib/amd64/libcspr.so
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro HSM CSP' -add string 'Function Table Name' CPSRV_GetFunctionTable
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro HSM CSP' -add long Type 75
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro HSM CSP' -add string Channel .clientk2

./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 HSM CSP' -add string 'Image Path' /opt/cprocsp/lib/amd64/libcspr.so
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 HSM CSP' -add string 'Function Table Name' CPSRV_GetFunctionTable
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 HSM CSP' -add long Type 80
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 HSM CSP' -add string Channel .clientk2

./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 Strong HSM CSP' -add string 'Image Path' /opt/cprocsp/lib/amd64/libcspr.so
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 Strong HSM CSP' -add string 'Function Table Name' CPSRV_GetFunctionTable
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 Strong HSM CSP' -add long Type 81
./cpconfig -ini '\cryptography\Defaults\Provider\Crypto-Pro GOST R 34.10-2012 Strong HSM CSP' -add string Channel .clientk2

Перезапускаем службу cprocsp:
# service cprocsp restart

Экспортируем в файл корневой сертификат КриптоПро HSM из ключевого контейнера ключа доступа:

# /opt/cprocsp/bin/amd64/csptest -keys -cont cont_name -saveext /root/hsmroot.p7b

Имя ключевого контейнера можно вывести командой:
# /opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc

Устанавливаем корневой сертификат КриптоПро HSM:
# /opt/cprocsp/bin/amd64/certmgr -inst -store root -file /root/hsmroot.p7b

Устанавливаем сертификат ключа доступа с привязкой к ключевому контейнеру:
# /opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov

Экспортируем сертификат ключа доступа в файл:
# /opt/cprocsp/bin/amd64/certmgr -export -dest /root/user.cer

Создаем файл /etc/opt/cprocsp/stunnel/stunnel.conf со следующим содержимым:
# mkdir /etc/opt/cprocsp/stunnel/ && touch /etc/opt/cprocsp/stunnel/stunnel.conf
# nano /etc/opt/cprocsp/stunnel/stunnel.conf

pid = /var/opt/cprocsp/tmp/stunnel-k2.pid
output = /var/log/stunnel-k2.log
socket = r:TCP_NODELAY=1
socket = r:SO_KEEPALIVE=1
TIMEOUTidle = 2147483
debug = 0
for_hsm = yes

[clientk2]
client = yes
connect = 192.168.0.1:1501
accept = /var/opt/cprocsp/tmp/.clientk2
cert = /root/user.cer
pincode =12345678

В данном случае IP-адрес КриптоПро HSM 192.168.0.1, пин-код ключевого контейнера 12345678.

Запускаем процесс stunnel_fork:
# /opt/cprocsp/sbin/amd64/stunnel_fork

Проверяем доступность криптопровайдеров КриптоПро HSM:
/opt/cprocsp/bin/amd64/csptest -enum -provider "Crypto-Pro HSM CSP" -provtype 75 -info
/opt/cprocsp/bin/amd64/csptest -enum -provider "Crypto-Pro GOST R 34.10-2012 HSM CSP" -provtype 80 -info
/opt/cprocsp/bin/amd64/csptest -enum -provider "Crypto-Pro GOST R 34.10-2012 Strong HSM CSP" -provtype 81 -info

Настраиваем автозапуск stunnel_fork как службы в Astra Linux 1.6:

Создаем файл /etc/systemd/system/stunnel.service
# nano /etc/systemd/system/stunnel.service

Со следующим содержанием:
[Unit]
Description=stunnel_fork
After=network.target

[Service]
Type=forking
ExecStart=/opt/cprocsp/sbin/amd64/stunnel_fork
ExecReload=/bin/kill -HUP -$MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

# systemctl enable stunnel
# systemctl start stunnel

Устанавливаем Apache:
sudo apt-get install Apache2

 

Создаем папку и копируем в неё конфигурацию в виде файла cpro.conf (Пример содержимого файла cpro.conf представлен в конце инструкции*) :
sudo mkdir /etc/apache2/conf
sudo chown -R www-data:www-data /etc/apache2/conf
cp ./cpro.conf /etc/apache2/conf

Делаем символьную ссылку:
sudo ln -sf /etc/apache2/conf/cpro.conf /etc/apache2/sites-enabled/default-ssl.conf

Открываем файл /etc/apache2/mods-enabled/ssl.load с помощью nano и комментируем существующие строки.


Добавляем строку: LoadModule ssl_module /opt/cprocsp/lib/amd64/astra_se_mod_ssl.so

Создаем запрос на сертификат для Apache:
sudo -u www-data /opt/cprocsp/bin/amd64/cryptcp -creatrqst -provname "Crypto-Pro GOST R 34.10-2012 HSM CSP" -provtype 80 -rdn 'CN=Astra, C=RU ,S=77 Москва, L=г. Москва' -certusage 1.3.6.1.5.5.7.3.1 -cont Apache1 -ex /tmp/request.req

Выпускаем на УЦ сертификат по запросу и устанавливаем его в контейнер:
sudo -u www-data /opt/cprocsp/bin/amd64/certmgr -install -store uMy -cont '\\.\HSMDB\Apache1' -provname "Crypto-Pro GOST R 34.10-2012 HSM CSP" -file /tmp/site.crt

Конвертируем из DER в PEM:
openssl x509 -inform DER -in '/tmp/site.crt' -outform PEM -out '/tmp/site.pem'

Копируем:
cp /tmp/site.pem /etc/apache2/conf/
Указываем путь к сертификату в cpro.conf в секции Gost and Rsa (CSP is used for GOST and RSA, no openssl):

Gost and Rsa (CSP is used for GOST and RSA, no openssl)
SSLCertificateFile "conf/site.pem"

 

Доступность сервиса проверяем с помощью:

csptest
/opt/cprocsp/bin/amd64/csptest -tlsc -server host_name -v

браузера с поддержкой ГОСТ TLS (на Linux - Chromium GOST)

Открыть страницу в браузере, посмотреть сертификат, убедиться что алгоритм ГОСТ.

 

*Пример файла cpro.conf

SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_gcache_data(1048576)"
SSLSessionCacheTimeout 300

<VirtualHost *:443>
ErrorLog "tls-error_log"
CustomLog "tls-access_log" common

SSLEngine on

# Gost and Rsa (CSP is used for GOST and RSA, no openssl)
SSLCertificateFile "conf/localhost_gost.pem"
SSLCertificateFile "conf/localhost_rsa.cer"

# CPRO:
# SSLProtocol supports only TLSv1, TLSv1.1 TLSv1.2.
# It's not possible to skip middle version:
# TLSv1 +TLSv1.2 will be same TLSv1 +TLSv1.1 +TLSv1.2
SSLProtocol TLSv1 +TLSv1.1 +TLSv1.2

# CPRO:
# SSLCipherSuite supports only 4-hex digit format:
# "000A" => "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
# "002F" => "TLS_RSA_WITH_AES_128_CBC_SHA",
# "0035" => "TLS_RSA_WITH_AES_256_CBC_SHA",
# "003C" => "TLS_RSA_WITH_AES_128_CBC_SHA256",
# "003D" => "TLS_RSA_WITH_AES_256_CBC_SHA256",
# "009C" => "TLS_RSA_WITH_AES_128_GCM_SHA256",
# "009D" => "TLS_RSA_WITH_AES_256_GCM_SHA384",
# "C013" => "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
# "C014" => "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
# "C027" => "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
# "C028" => "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
# "C02F" => "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
# "C030" => "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
# "0081" => "TLS_GOSTR341001_WITH_28147_CNT_IMIT",
# "FF85" => "TLS_GOSTR341112_256_WITH_28147_CNT_IMIT",
# "C100" => "TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC",
# "C101" => "TLS_GOSTR341112_256_WITH_MAGMA_CTR_OMAC",
# "C102" => "TLS_GOSTR341112_256_WITH_28147_CNT_IMIT_IANA",
# etc...

# Example, permit only gost cipher suites:
# SSLCipherSuite C102:C101:C100:FF85:0081
SSLCipherSuite GOST2012-GOST8912-GOST8912:GOST2001-GOST89-GOST89:HIGH

# CPRO:
# Uncomment if client authentication is required
# SSLVerifyClient require

# CPRO:
# Uncomment these lines to proxy using. SSL_CLIENT_CERT require SSLVerifyClient is set.
# ProxyPass / http://127.0.0.1:444/
# RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
# RequestHeader set SSL_CLIENT_S_DN_CN "%{SSL_CLIENT_S_DN_CN}s"

# CPRO:
# Uncomment these lines to https proxy using.
# SSLProxyEngine on
# SSLProxyVerify require
# ProxyPass / https://localhost:4444/

# Rsa (it is not used with msspi)
# SSLCertificateFile "conf/srvtestRSA.pem"
# SSLCertificateKeyFile "conf/srvtestRSA.key"
# SSLCipherSuite HIGH

SSLHonorCipherOrder on
</VirtualHost>

(3 плюсик(ов))
Класс!
Не очень :(

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