Выпуск SSL-сертификата: различия между версиями

Материал из Bas Wiki
Перейти к навигации Перейти к поиску
 
(не показано 26 промежуточных версий этого же участника)
Строка 11: Строка 11:
Для того, чтобы избежать риска компрометации приватного ключа его можно создать зашифрованным. При создании ключа с шифрованием будет запрошен пароль. Этот пароль впоследствии всегда будет запрашиваться при доступе к ключу. В том числе и при запуске web-сервера, чтении информации о сертификате. Мы будем использовать ключ без шифрования. Для создания такого ключа необходимо выполнить следующую команду:
Для того, чтобы избежать риска компрометации приватного ключа его можно создать зашифрованным. При создании ключа с шифрованием будет запрошен пароль. Этот пароль впоследствии всегда будет запрашиваться при доступе к ключу. В том числе и при запуске web-сервера, чтении информации о сертификате. Мы будем использовать ключ без шифрования. Для создания такого ключа необходимо выполнить следующую команду:
<pre>
<pre>
$ openssl genrsa -out private.key 2048  
openssl genrsa -out private.key 2048  
</pre>
</pre>


Строка 34: Строка 34:


== Сертификат ==
== Сертификат ==
== Настройка Apache ==
Теперь мы можем выпускать сертификат. Для этого есть 2 пути:
# Выпуск самоподписанного сертификата.
# Выпуск сертификата в центре сертификации (удостоверяющем центре).
Удостоверяющим центром может быть один из популярных сервисов: VeriSign, Thawte, Comodo, StartSSL и другие.<br />
Так же вы сами можете создать свой центр сертификации и выпускать (подписывать) свои сертификаты.


== Настройка web-сервера ==
Большое количество ценной информации по настройке и безопасности можно найти в статье [https://wiki.mozilla.org/Security/Server_Side_TLS Security/Server Side TLS].<br />
<br />
Для работы Forward Secrecy на основе алгоритма Diffie-Hellman (DHE) необходимо сгенерировать файл <code>dhparam.pem</code> командой:
<pre>openssl dhparam 2048 -out dhparam.pem</pre>
Если ваш сертификат подписан промежуточным (intermediate) сертификатом, вам необходимо указать web-серверу всю цепочку сертификатов, иначе сертификат будет выдавать ошибку. Обычно удостоверяющий центр прямо говорит об этом и предлагает скачать сертификаты всей цепочки.
=== Настройка Apache ===
=== Настройка Nginx ===
Для удобства общие для всех доменов настройки вынесены в отдельный файл <code>ssl.conf</code>:
<pre>
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;
</pre>
Если вы хотите, чтобы пользователей автоматически перекидывало на HTTPS-протокол, то в настройках сайта укажите:
<pre>
server {
listen 80;
server_name wiki.gwtools.ru;
return 301 https://$host$request_uri;
}
</pre>
Настройка сайта для работы по протоколу HTTPS:
<pre>
server {
listen 443 ssl spdy;
server_name wiki.gwtools.ru;
include /usr/local/etc/nginx/ssl.conf;
ssl_certificate /usr/local/etc/nginx/ssl/wiki.gwtools.ru.crt;
ssl_certificate_key /usr/local/etc/nginx/ssl/wiki.gwtools.ru.key;
root /usr/local/www/mediawiki;
}
</pre>
<br />
Проверить правильность настройки web-сервера и корректность сертификатов можно на ресурсе [https://www.ssllabs.com/ssltest/ SSL Server Test]
=== Скрипт с основными командами ===
<pre>#!/bin/bash
key="private.key"
req="request.csr"
cer="cert.crt"
##########
# create private key
openssl genrsa -out $key 2048
# create request
openssl req -out $req -key $key -new -sha256 -config openssl.cnf
# check request
openssl req -text -noout -in $req
# self sign
openssl x509 -req -days 365 -in $req -signkey $key -out $cer -extensions v3_req -extfile v3_req.conf
# Forward Secrecy DHE
openssl dhparam 2048 -out dhparam.pem</pre>
Для выпуска самоподписанного сертификата с алиасами, необходимо создать следующий файл (v3_req.conf):
<pre>[v3_req]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:false
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = wiki.gwtools.ru
DNS.2 = site.gwtools.ru
DNS.3 = 127.0.0.1
IP.1 = 127.0.0.1</pre>
==Источники==
# [https://wiki.mozilla.org/Security/Server_Side_TLS Security/Server Side TLS]
# [http://httpd.apache.org/docs/2.2/mod/mod_ssl.html Apache Module mod_ssl]
# [http://nginx.org/ru/docs/http/ngx_http_ssl_module.html Модуль ngx_http_ssl_module]
# [https://www.ssllabs.com/ssltest/ SSL Server Test]
[[Category:OpenSSL]]
[[Category:OpenSSL]]
[[Category:SSL]]
[[Category:SSL]]

Текущая версия от 12:12, 20 февраля 2021

Для того, чтобы 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 пути:

  1. Выпуск самоподписанного сертификата.
  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;
}

Настройка сайта для работы по протоколу HTTPS:

server {
	listen			443 ssl spdy;
	server_name		wiki.gwtools.ru;

	include			/usr/local/etc/nginx/ssl.conf;
	ssl_certificate		/usr/local/etc/nginx/ssl/wiki.gwtools.ru.crt;
	ssl_certificate_key	/usr/local/etc/nginx/ssl/wiki.gwtools.ru.key;

	root			/usr/local/www/mediawiki;
}


Проверить правильность настройки web-сервера и корректность сертификатов можно на ресурсе SSL Server Test

Скрипт с основными командами

#!/bin/bash

key="private.key"
req="request.csr"
cer="cert.crt"

##########

# create private key
openssl genrsa -out $key 2048

# create request
openssl req -out $req -key $key -new -sha256 -config openssl.cnf

# check request
openssl req -text -noout -in $req

# self sign
openssl x509 -req -days 365 -in $req -signkey $key -out $cer -extensions v3_req -extfile v3_req.conf

# Forward Secrecy DHE
openssl dhparam 2048 -out dhparam.pem

Для выпуска самоподписанного сертификата с алиасами, необходимо создать следующий файл (v3_req.conf):

[v3_req]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:false
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = wiki.gwtools.ru
DNS.2 = site.gwtools.ru
DNS.3 = 127.0.0.1
IP.1 = 127.0.0.1

Источники

  1. Security/Server Side TLS
  2. Apache Module mod_ssl
  3. Модуль ngx_http_ssl_module
  4. SSL Server Test