nginx + ГОСТ. отечественная криптография.

Привет. Сегодня я выложу свой конспектик о том, как подружить nginx, openssl, КриптоПро CSP и gost_capi ( http://www.cryptopro.ru/forum2/default.aspx?g=posts&t=8544#post55555 ). Только не спрашивайте зачем мне это было нужно. И так начнем:

0) Ставим Centos6 minimal
1) yum update -y && reboot #Апдейт + ребут
2) yum install -y openssh-clients lsb unzip wget #Ставим всякое нужное
3) Копирую со своей машины на сервер linux-amd64.tgz (csp 4), gost_capi_20150306.zip и файлы гаммы. (файлы гаммы получаем с виндовой машины по инструкции ofk41.narod.ru/docs/crypto_3/arm.pdf … их нужно минимум кажется 3 или 4, сгенерируйте лучше штук 10 сразу).
Получается примерно так:
[root@gost ~]# ls -lhR
.:
итого 12M
-rw——-. 1 root root 1,1K Мар 10 22:24 anaconda-ks.cfg
drwxr-xr-x. 4 root root 4,0K Мар 10 22:38 gamma
-rw-r—r—. 1 root root 262K Мар 10 22:37 gost_capi_20150306.zip
-rw-r—r—. 1 root root 11K Мар 10 22:24 install.log
-rw-r—r—. 1 root root 3,1K Мар 10 22:23 install.log.syslog
-rw-r—r—. 1 root root 12M Мар 10 22:40 linux-amd64.tgz

./gamma:
итого 12K
drwxr-xr-x. 2 root root 4,0K Мар 10 22:38 db1
drwxr-xr-x. 2 root root 4,0K Мар 10 22:38 db2
-rw-r—r—. 1 root root 8 Мар 10 22:38 kpim

./gamma/db1:
итого 4,0K
-rw-r—r—. 1 root root 720 Мар 10 22:38 kis_1

./gamma/db2:
итого 4,0K
-rw-r—r—. 1 root root 720 Мар 10 22:38 kis_1
[root@gost ~]#

4) tar xfz linux-amd64.tgz && cd linux-amd64 && rpm -i lsb-cprocsp-base-4.0.0-4.noarch.rpm lsb-cprocsp-rdr-64-4.0.0-4.x86_64.rpm lsb-cprocsp-capilite-64-4.0.0-4.x86_64.rpm lsb-cprocsp-kc2-64-4.0.0-4.x86_64.rpm # инсталим csp
5) cp /root/gamma/db1/kis_1 /var/opt/cprocsp/dsrf/db1/kis_1 && cp /root/gamma/db2/kis_1 /var/opt/cprocsp/dsrf/db2/kis_1 # копируем файлы гаммы в нужное место
6) service cprocsp restart # Рестартим cprocsp что бы подхватилась гамма
7) PATH=$PATH:/opt/cprocsp/sbin/amd64/:/opt/cprocsp/bin/amd64/ #Правим PATH что бы каждый раз не писать полные пути. Действует только для текущего сеанса
8) csptest -keyset -newkeyset -container ‘\\.\HDIMAGE\yukra’ -exportable # Создаем хранилище на диске с именем yukra (мой ник, можно использовать любое другое).
Примерный вывод:
=============
[root@gost amd64]# csptest -keyset -newkeyset -container ‘\\.\HDIMAGE\yukra’ -exportable
CSP (Type:75) v4.0.9000 KC2 Release Ver:4.0.9518 OS:Linux CPU:AMD64 FastCode:READY:SSSE3.
AcquireContext: OK. HCRYPTPROV: 8641603
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2001 KC2 CSP
Container name: «yukra»
Signature key is not available.
Attempting to create a signature key…
CryptoPro CSP: Set password on produced container «yukra».
Password:
Retype password:
a signature key created.
Exchange key is not available.
Attempting to create an exchange key…
an exchange key created.
Keys in container:
signature key
exchange key
Total:
[ErrorCode: 0x00000000]
=============
9) Проверяем что все ок:
csptest -keyset -enum_cont -verifycontext -fqcn # Проверяем что хранилище создалось
Примерный вывод:
=============
[root@gost amd64]# csptest -keyset -enum_cont -verifycontext -fqcn
CSP (Type:75) v4.0.9000 KC2 Release Ver:4.0.9518 OS:Linux CPU:AMD64 FastCode:READY:SSSE3.
AcquireContext: OK. HCRYPTPROV: 24206403
\\.\HDIMAGE\yukra
OK.
Total:
[ErrorCode: 0x00000000]
[root@gost amd64]#
=============
10) certmgr -inst -store root -file /root/CA.cer # Копируем на машину сертификат УЦ и впиливаем его (/root/CA.cer — файс с сертом УЦ)

11) /opt/cprocsp/bin/amd64/cryptcp -creatrqst -provtype 75 -rdn ‘E=gost.yukra.ru, CN=gost.yukra.ru’ -cont ‘\\.\HDIMAGE\yukra’ -certusage ‘1.3.6.1.5.5.7.3.1’ -ku -du -ex -nokeygen /root/qst # Генерим запрос на сертификат. Он сохраняется в файл /root/qst. Параметры rdn и certusage для меня загадка, в параметр cont нужно указать ранее созданное хранилище (если параметр опустить, то его запросит дополнительно)

12.0) Копируем запрос В УЦ, подписываем, туда-сюда, вот это все

12) certmgr -inst -file /root/CM2.cer -cont ‘\\.\HDIMAGE\yukra’ # Вставляем сертификат из файла /root/CM2.cer в хранилище ‘\\.\HDIMAGE\yukra’

13) certmgr -list -store uMy # Проверяем, что все ок. Вывод примерно как ниже, внимание на «PrivateKey Link: Yes»:
=============
[root@gost ~]# certmgr -list -store uMy
Certmgr 1.0 (c) «CryptoPro», 2007-2010.
program for managing certificates, CRLs and stores

=============================================================================
1——-
Issuer : DC=ru, DC=cp, CN=test-ca
Subject : CN=gost.yukra.ru, E=gost.yukra.ru
Serial : 0x1C65FFCB000000CF2E79
SHA1 Hash : 0xe8f98fd64be1a573b8a727c22d90ed2ae3bcadcc
Signature Algorithm : ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm : ГОСТ Р 34.10-2001 (512 bits)
Not valid before : 10/03/2015 12:49:09 UTC
Not valid after : 10/03/2025 19:29:09 UTC
PrivateKey Link : Yes
Container : HDIMAGE\\yukra.000\1352
Extended Key Usage : 1.3.6.1.5.5.7.3.1
=============================================================================

[ErrorCode: 0x00000000]
[root@gost ~]#

=============

14) cd && unzip gost_capi_20150306.zip && rpm -i gost_capi_20150306/release/cprocsp-cpopenssl-gost-64-4.0.0-4.x86_64.rpm —nodeps #Ставим гост_гапи
15) ln -s /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so.1.0.0 # Поскольку мы не используем cpopenssl и в прошлом п. ставились с «—nodeps», то нужно поправить симлинк. Напоминаю что исктруция под centos6
/opt/cprocsp/cp-openssl/lib/amd64/engines/libgost_capi.so.0.0.0
16) Правим /etc/pki/tls/openssl.cnf. diff:

20a21,32
> openssl_conf = openssl_def
>
> [openssl_def]
> engines = engine_section
>
> [engine_section]
> gost_capi = gost_section
>
> [gost_section]
> engine_id = gost_capi
> dynamic_path = /opt/cprocsp/cp-openssl/lib/amd64/engines/libgost_capi.so
> default_algorithms = CIPHERS, DIGESTS, PKEY, PKEY_CRYPTO, PKEY_ASN1

17) Собираем nginx сами, чемылохичтоли готовое качать:
yum install -y gcc pcre-devel zlib-devel openssl-devel && cd /usr/src/ && wget http://nginx.org/download/nginx-1.7.10.tar.gz && tar xfz nginx-1.7.10.tar.gz && cd nginx-1.7.10 && ./configure —with-http_ssl_module && make install

18) Правим /usr/local/nginx/conf/nginx.conf, diff:

96,115c96,118
< # HTTPS server < # < #server { < # listen 443 ssl; < # server_name localhost; < < # ssl_certificate cert.pem; < # ssl_certificate_key cert.key; < < # ssl_session_cache shared:SSL:1m; < # ssl_session_timeout 5m; < < # ssl_ciphers HIGH:!aNULL:!MD5; < # ssl_prefer_server_ciphers on; < < # location / { < # root html; < # index index.html index.htm; < # } < #} --- >
> server {
> listen 443 ssl;
> server_name localhost;
>
> ssl_certificate /root/CM2.cer;
> ssl_certificate_key engine:gost_capi:yukra;
>
>
> ssl_session_cache shared:SSL:1m;
> ssl_session_timeout 5m;
>
> ssl_ciphers HIGH:MEDIUM:+GOST2001-GOST89;
> ssl_prefer_server_ciphers on;
>
> location / {
> root html;
> index index.html index.htm;
> }
> }
>
>
>

20) Стартуем nginx, идем по адресу через IE, предварительно импортировав в доверенные УЦ сертифитат вашего УЦ, радуемся, открываем дверь в кабинет начальника ногой и просим прибавки.

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed