Apache2 с поддержкой шифрования по ГОСТ на Ubuntu (Debian)
Опубликовано Павел Заика on 2021-08-05 04:10

Задача: Настроить Apache2 с поддержкой шифрования по ГОСТ на Ubuntu (Debian)

Для этого потребуется: Развернуть Apache; установить КриптоПро CSP с дополнительным пакетом cprocsp-apache-modssl; выпустить и установить сертификат для Web сервера из PFX или файла .crt, настроив для него доверие, и настроить конфиг для работы 443 порта по HTTPS с установленным ГОСТ - сертификатом.

Далее по шагам.

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

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

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

#Распаковываем и устанавливаем КриптоПро CSP
tar -xvf ./linux-amd64_deb.tgz && cd ./linux-amd64_deb/
sudo ./install.sh
sudo dpkg -i cprocsp-apache-modssl*

#Создаем папку и копируем в неё конфигурацию в виде файла 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/mod_ssl.so

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

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

#Вариант для контейнера PFX с пинкодом 1234
sudo -u www-data /opt/cprocsp/bin/amd64/certmgr -install -pfx -file '/tmp/site.pfx' -pin 1234 -autodist
sudo -u www-data /opt/cprocsp/bin/amd64/certmgr -export -store uMy -dest /tmp/site.cer

#Устанавливаем корневой сертификат
sudo /opt/cprocsp/bin/amd64/certmgr -install -store mRoot -all -file /tmp/root.p7b

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

#Копируем
sudo cp /tmp/site_gost.pem /etc/apache2/conf/
sudo chown www-data:www-data /etc/apache2/conf/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 www-data /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 www-data /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/apache2/conf/
sudo chown www-data:www-data /etc/apache2/conf/site_rsa.pem

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

#Включаем сервис

sudo systemctl enable apache2
sudo systemctl start apache2

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

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.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 плюсик(ов))
Класс!
Не очень :(