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