Создание доверенного ssl сертификата.
Для своего сайта было принято решение использовать ssl шифрование, но самоподписной сертификат оказался совсем не удобным решением, потому как по несколько раз кликать по сообщениям браузера об опастности данной ссылки ну совсем не прикольно. К счастью есть сервис Let’s Encrypt у которого можно получить доверенный ssl сертификат. Правда как у всякой халявы есть свои недостатки :
Срок действия бесплатного SSL-сертификата – до 90 дней.
Бесплатные сертификаты от Let's Encrypt являются сертификатами с проверкой домена (англ. domain validation). То есть, если вам нужно защитить домен и его субдомены, то нужно будет выпускать несколько сертификатов.
Также нельзя получить бесплатные сертификаты с проверкой организации (англ. Organization validation), сертификаты с зеленой строкой (англ. Extended validation), мультидоменные сертификаты (Multi-domain SSL).
Если у вас IDN домен, например, мойдомен.com, то бесплатный SSL от Let's Encrypt уже не подойдет.
Но что поделать, согласимся с этим фактом и начнем устанавливать данный сертификат на наш сервер.
Есть два способа сделать это в автоматическом режиме, чтобы не заказывать ручками сертификат раз в 3 месяца.
1. Установка клиента certbot для автоматической генерации сертификатов.
Заходим на сайт https://certbot.eff.org/ и выбираем в списке ваш web-сервер и операционную систему. Там будет подробное описание как устанавливать клиент. Для Ubuntu 14.04 это выглядит так:
mkdir /opt/letsencrypt
cd /opt/letsencrypt
./certbot-auto
Дальше читаем что пишет нам скрипт, до самого конца установки.
Если нужно добавить еще доменное имя в настроенный letsencrypt, то пишем команду:
2. Установка и обновление сертификата с помощью скрипта getssl который написан на bash.
Этот метод более понятен и вызывает меньше переживаний, так как в отличие от certbot тут понятен каждый шаг скрипта.
Для начала нам надо создать Alias в Apache.
Alias /.well-known/acme-challenge /var/www/getssl/web/.well-known/acme-challenge
<Directory /var/www/getssl/.well-known/acme-challenge>
AllowOverride All
# Apache 2.4
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
Этот алиас будет отображать папку /var/www/getssl/.well-known/acme-challenge по ссылке https://yousite.net/.well-known/acme-challenge/
У нас запрещен просмотр содержимого директорий, поэтому создадим файл .htaccess
с содержимым:
теперь создадим там любой файл и зайдем по ссылке https://yousite.net/.well-known/acme-challenge/ , теперь мы должны его там увидеть.
cd /root
curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl
chmod 700 getssl
Поместить скрипт в /bin, чтобы не указывать полный путь при запуске:
Если установка прошла успешно команда getssl сообщит свою версию:
getssl ver. 1.37
Obtain SSL certificates from the letsencrypt.org ACME server
Usage: getssl [-h|--help] [-d|--debug] [-c|--create] [-f|--force] [-a|--all] [-q|--quiet] [-u|--upgrade] [-w working_dir] domain
Options:
-h, --help Display this help message and exit
Доменная модель GetSSL оперирует двумя видами сущностей:
Аккаунт - глобальный набор правил распространяемых на сервер;
Домен - набор правил для конкретного доменного имени.
Добавим новый домен:
creating main config file /root/.getssl/getssl.cfg
Making domain directory - /root/.getssl/domain.tld
creating domain config file in /root/.getssl/domain.tld/getssl.cfg
Настройка аккаунта.
Let's Encrypt ограничивает лимит запросов к своим серверам. Для отладочных целей лучше использовать stagging сервер:
CA="https://acme-staging.api.letsencrypt.org" # Сервер для отладки
#CA="https://acme-v01.api.letsencrypt.org" # Сервер центра сертификации
Глобально принять соглашение предоставления услуг и указать свой email:
AGREEMENT="https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf"
ACCOUNT_EMAIL="admin@domain.tld"
Настройка домена.
При получении сертификата Let's Encrypt проверяет права владения доменом(ами). Флаг ACL (ACME Challenge Location) указывает на директорию в которую будет сохранено выполненное задание (challenge):
Установите флаг USE_SINGLE_ACL для использование одной директории при подтверждении прав на домены.
Флаги DOMAIN_CERT_LOCATION, DOMAIN_KEY_LOCATION, CA_CERT_LOCATION используются для копирования цепочки сертификатов и закрытого ключа в директорию к которой веб сервер имеет доступ.
PRIVATE_KEY_ALG="rsa"
ACL=('/var/www/onedayadmin.sytes.net/web/.well-known/acme-challenge'
'ssh:server5:/var/www/onedayadmin.sytes.net/web/.well-known/acme-challenge'
'ssh:sshuserid@server5:/var/www/onedayadmin.sytes.net/web/.well-known/acme-challenge'
'ftp:ftpuserid:ftppassword:onedayadmin.sytes.net:/web/.well-known/acme-challenge')
USE_SINGLE_ACL="true"
DOMAIN_CERT_LOCATION="/etc/ssl/yousite.net.crt"
DOMAIN_KEY_LOCATION="/etc/ssl/yousite.net.key"
CA_CERT_LOCATION="/etc/ssl/chain.crt"
RELOAD_CMD="service apache2 reload"
SERVER_TYPE="https"
Получение демо сертификата.
Если GetSSL сообщил о успешном получении сертификата (Verification completed, obtaining certificate.), измените CA в конфигурационном файле аккаунта /root/.getssl/getssl.cfg сервер сертификации:
#CA="https://acme-staging.api.letsencrypt.org" # Сервер для отладки
CA="https://acme-v01.api.letsencrypt.org" # Сервер центра сертификации
Затем повторите запрос ещё раз:
Настроим apache, поправим данные строки:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin mail@mail.ru@mail.ru
ServerName https://namedomain.net
DocumentRoot /var/www/directory_domain.net
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/namedomain.net.crt
SSLCertificateKeyFile /etc/ssl/namedomain.net.key
SSLProtocol all -SSLv2
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
#для доступа к админке с применением .htaccess
<Directory /var/www/namedomain.net/admin_directory/>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
ServerAlias namedomain.net
SSLCertificateChainFile /etc/ssl/chain.crt
</VirtualHost>
</IfModule>
Теперь автоматизируем замену сертификатов.