Выпуск SSL-сертификата
Для того, чтобы web-сервер Apache мог работать по защищённому протоколу HTTPS необходимо выпустить SSL-сертификат, с помощью которого будет шифроваться трафик между клиентом и сервером, а так же проверяться подлинность сайта. Сертификат состоит из 2-ух частей (2-ух ключей) - public
(публичный, собствено сам сертификат) и private
(приватный / личный / закрытый). Публичный ключ используется для шифрования данных, идущих от клиента к серверу в защищённом соединении, приватный ключ — для расшифровки полученных от клиента данных на сервере. После того как пара ключей приватный / публичный сгенерированы, на основе публичного ключа формируется запрос сертификата в центр сертификации, в ответ на который центр сертификации высылает подписанный сертификат. Центр сертификации при подписывании проверяет клиента, что позволяет ему гарантировать что держатель сертификата является тем, за кого себя выдаёт.
Приватный ключ
Приватный ключ является самым важным элементом при выпуске сертификата.
Если приватный ключ скомпрометирован, то это несёт угрозу информационной безопасности. При попадании приватного ключа к злоумышленнику ни о какой надёжной передачи данных речи быть не может, т.к. злоумышленник может расшифровать трафик этим ключём.
Если приватный ключ потерян или повреждён, то работа web-сервера будет не возможна, т.к. не получится зашифровать / расшифровать передаваемый трафик. Так же при утере или повреждении приватного ключа мы не сможем сменить или перевыпустить сертификат, т.к. на основе приватного ключа генерируется CSR-запрос в центр сертификации.
Для того, чтобы избежать риска компрометации приватного ключа его можно создать зашифрованным. При создании ключа с шифрованием будет запрошен пароль. Этот пароль впоследствии всегда будет запрашиваться при доступе к ключу. В том числе и при запуске web-сервера, чтении информации о сертификате. Мы будем использовать ключ без шифрования. Для создания такого ключа необходимо выполнить следующую команду:
openssl genrsa -out private.key 2048
CSR-запрос
openssl req -out request.csr -key private.key -new -sha256
Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Applied Internet Projects Organizational Unit Name (eg, section) []:Security Common Name (e.g. server FQDN or YOUR name) []:wiki.gwtools.ru Email Address []:webmaster@gwtools.ru Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Сертификат
Теперь мы можем выпускать сертификат. Для этого есть 2 пути:
- Выпуск самоподписанного сертификата.
- Выпуск сертификата в центре сертификации (удостоверяющем центре).
Удостоверяющим центром может быть один из популярных сервисов: VeriSign, Thawte, Comodo, StartSSL и другие.
Так же вы сами можете создать свой центр сертификации и выпускать (подписывать) свои сертификаты.
Настройка web-сервера
Большое количество ценной информации по настройке и безопасности можно найти в статье Security/Server Side TLS.
Для работы Forward Secrecy на основе алгоритма Diffie-Hellman (DHE) необходимо сгенерировать файл dhparam.pem
командой:
openssl dhparam 2048 -out dhparam.pem
Если ваш сертификат подписан промежуточным (intermediate) сертификатом, вам необходимо указать web-серверу всю цепочку сертификатов, иначе сертификат будет выдавать ошибку. Обычно удостоверяющий центр прямо говорит об этом и предлагает скачать сертификаты всей цепочки.
Настройка Apache
Настройка Nginx
Для удобства общие для всех доменов настройки вынесены в отдельный файл ssl.conf
:
add_header Strict-Transport-Security max-age=15768000; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_dhparam /usr/local/etc/nginx/ssl/dhparam.pem; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /usr/local/etc/nginx/ssl/ca.pem;
Если вы хотите, чтобы пользователей автоматически перекидывало на HTTPS-протокол, то в настройках сайта укажите:
server { listen 80; server_name wiki.gwtools.ru; return 301 https://$host$request_uri; }
Проверить правильность настройки web-сервера и корректность сертификатов можно на ресурсе SSL Server Test