Apache2 с поддержкой шифрования по ГОСТ на RedOS 7.3
Опубликовано Павел Заика on 2021-08-03 14:06

 Apache2 с поддержкой шифрования по ГОСТ на RedOS 7.3

Устанавливаем Apache и mod_ssl
sudo dnf install httpd mod_ssl

Активируем модуль Apache ssl_module
sudo a2enmod ssl

Скачиваем дистрибутив КриптоПро CSP с сайта - https://cryptopro.ru/products/csp/downloads

Распаковываем и устанавливаем КриптоПро CSP с дополнительными компонентами lsb-cprocsp-devel cprocsp-apache-modssl
tar -xvf ./linux-amd64_rpm.tgz && cd ./linux-amd64_rpm/
sudo ./install.sh
sudo dnf install ./cprocsp-apache-modssl* 

Копируем файл cpro.conf (Пример содержимого файла cpro.conf представлен в конце инструкции*)
sudo cp ./cpro.conf /etc/httpd/conf.d/

Открываем файл /etc/httpd/conf.modules.d/00-ssl.conf с помощью nano и комментируем существующие строки.

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

Создаем запрос на сертификат для Apache
sudo -u apache /opt/cprocsp/bin/amd64/cryptcp -creatrqst -provtype 80 -rdn 'CN=localhost.localdomain, C=RU ,S=77 Москва, L=г. Москва' -certusage 1.3.6.1.5.5.7.3.1 -cont '\\.\HDIMAGE\Apache1' -ex /tmp/request.req

Устанавливаем корневые и промежуточные сертификаты УЦ
sudo /opt/cprocsp/bin/amd64/certmgr -install -file uc_root.cer -store mRoot
sudo /opt/cprocsp/bin/amd64/certmgr -install -file uc_ca.cer -store mCA

Выпускаем на УЦ сертификат по запросу и устанавливаем его в контейнер
sudo -u apache /opt/cprocsp/bin/amd64/certmgr -install -store uMy -cont '\\.\HDIMAGE\Apache1' -file /tmp/site_gost.cer

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

Копируем
sudo cp /tmp/site_gost.pem /etc/httpd/conf.d/
sudo chown apache:apache /etc/httpd/conf.d/site_gost.pem

В случае наличия Openssl RSA ключей для сайта можно продолжить их использование конвертировав их через pkcs12:

openssl pkcs12 -export -out Apache2.p12 -in cert.pem -inkey key.pem [-passin pass:123] -passout pass:1

Устанавливаем контейнер соответсвующему пользователю
sudo -u apache /opt/cprocsp/bin/amd64/certmgr -install -pfx -pin 1 -store uMy -file /home/user/dst/Openssl_certs/Apache2.p12 -provname 'Crypto-Pro Enhanced RSA and AES CSP' -provtype 24

Конвертируем из DER в PEM
sudo -u apache /opt/cprocsp/bin/amd64/certmgr -export -store uMy -dest '/tmp/site_rsa.cer' -thumbprint 'хеш'
openssl x509 -inform DER -in /tmp/site_rsa.cer -outform PEM -out /tmp/site_rsa.pem

Копируем
sudo cp /tmp/site_rsa.pem /etc/httpd/conf.d/
sudo chown apache:apache /etc/httpd/conf.d/site_rsa.pem

Указываем путь к сертификату в cpro.conf в секции Gost and Rsa (CSP is used for GOST and RSA, no openssl):
SSLCertificateFile "conf.d/site_gost.pem" 
SSLCertificateFile "conf.d/site_rsa.pem"

Включаем службу и запускаем

sudo systemctl enable httpd
sudo systemctl start httpd

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

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.d/localhost_gost.pem"
SSLCertificateFile "conf.d/localhost_rsa.pem"

# 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>

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