понедельник, 29 февраля 2016 г.

Apache: Создание сертификата сервера с SNI

Такое бывает необходимо не только Google. А и, к примеру, в случае, если на multihomed-сервере необходимо поднять TLS. (Конечно, можно по методу мальчиков-линуксоидов создать раздельные сертификаты, повесить их на различные порты, долго изгаляться с mod_rewrite... Но это метод "в лоб". А мы же не бараны).

Для простоты создадим конфигурацию на 2 имени хоста.

Сначала нужно кое-что изменить в конфигурации openssl (конкретно - изменить commonName):
 # SNI for multihomed  
 0.commonName               = Common Name (e.g. server FQDN or YOUR name)  
 0.commonName_max          = 64  
 1.commonName               = Common Name 2 (e.g. server FQDN or YOUR name)  
 1.commonName_max          = 64  

и скорректировать строку:
 # To use this configuration file with the "-extfile" option of the  
 # "openssl x509" utility, name here the section containing the  
 # X.509v3 extensions to use:  
 extensions          = v3_req  

и подготовить файл extSRV.cfg:
 # =================================================  
 # SSL server extension file.   
 # Version 1.8  
 # =================================================  
 basicConstraints=critical,CA:false  
 nsCertType=server  
 nsComment="Web Server SSL Certificate"  
 subjectKeyIdentifier=hash  
 authorityKeyIdentifier=keyid:always,issuer:always  
 keyUsage=critical, digitalSignature, keyEncipherment, dataEncipherment  
 extendedKeyUsage=serverAuth  
 subjectAltName=DNS:lemanruss.localdomain,DNS:primarch.localdomain  

Имена хоста добавляются в subjectAltName одной строкой, разделяем запятыми.

Затем создадим приватный ключ и запрос SSL:
 openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -config openssl.cfg  

с конфигурационным файлом, который мы отредактировали ранее.

Заполняем поля сертификата при создании запроса обычным образом, на запрос commonName (он будет дважды) вводим имена нашего хоста (которые уже присутствуют в /etc/hosts и в нашем DNS, конечно).

Затем подписываем запрос корневым сертификатом (предполагается, что он у вас уже есть и клиенты ему доверяют) с подготовленным файлом расширений:
 openssl x509 -req -sha256 -days 3650 -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -extfile extSRV.cfg  

Готово, можно открыть готовый сертификат и проверить:



Остался один шаг. Настраиваем Apache:

 Listen 4443  
   
 NameVirtualHost *:4443  
   
 # Go ahead and accept connections for these vhosts  
 # from non-SNI clients  
 SSLStrictSNIVHostCheck off  
   
 <VirtualHost *:4443>  
   ServerName lemanruss.localdomain  
   SSLEngine on  
   SSLCertificateFile "/usr/local/squid/etc/server.crt"  
   SSLCertificateKeyFile "/usr/local/squid/etc/server.key"  
 </VirtualHost>  
   
 <VirtualHost *:4443>  
   ServerName primarch.localdomain  
   SSLEngine on  
   SSLCertificateFile "/usr/local/squid/etc/server.crt"  
   SSLCertificateKeyFile "/usr/local/squid/etc/server.key"  
 </VirtualHost>  
   
 SSLProtocol all -SSLv2 -SSLv3  
 SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS  
 SSLCompression on  
   

и перезапускаем его.