В данной статье описана установка и настройка 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>
|