У меня есть несколько сайтов, работающих с бесплатным сертификатом StartSSL (CJSHayward.com, JobhuntTracker.com), а Firefox отклоняет StartSSL и отображает страницу с ошибкой о том, что мой сервер неправильно настроен (IIRC) из-за цепочки сертификатов. Я попросил о помощи и подтвердил, что мой VirtualHost (доступен по запросу) предназначен для цепочки сертификатов и что промежуточный сертификат установлен правильно. Сайты отображаются без ошибок, о которых мне известно в Chrome, Safari, Edge или Opera.
После некоторых поисков, Давайте зашифровать! выглядело привлекательным предложением, и вскоре у меня был (AFAICT) закрытый ключ и сертификат для каждого домена в / etc / apache2 / sites-enabled, за вычетом, конечно, любых доменов, которые больше мне не принадлежат. Я подумал, что сделаю пробный запуск и сделаю HTTPS-соединение с сайтом, доступным теперь только по HTTP: JSH.name. Я переместил "Let's Encrypt!" сертификат и закрытый ключ в мой каталог SSL и добавил:
<VirtualHost *:443>
ServerAdmin cjshayward@pobox.com
DocumentRoot /home/jonathan/stornge
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/0000_csr-letsencrypt.pem
SSLCertificateKeyFile /etc/apache2/ssl/0000_key-letsencrypt.pem
ServerName jsh.name
ServerAlias www.jsh.name
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog /home/jonathan/logs/stornge.com combined
<Directory /home/jonathan/stornge/>
Options ExecCGI Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Затем я перезагрузился, чтобы увидеть свою работу, и каждый запрос HTTP или HTTPS, который я делал, просто зависал. Это включало два домена на HTTPS с моим сертификатом StartSSL и домен, который должен был быть недавно доступен по HTTPS, доступ к которому осуществляется через HTTP и HTTPS. Я закомментировал VirtualHost и отказался от Apache, и все старые функции снова вернулись в рабочее состояние.
Я использовал Let's "Encrypt!" правильно? Я немного подозрительно, поскольку существующая конфигурация SSL имеет закрытые ключи с расширением .key, расширение сертификата .crt и файл цепочки сертификатов с расширением .pem.
Я попробовал еще раз, проверив каталог SSL и обнаружив, что 0000_csr.letsencrypt.pem был режимом 644; Я изменил все файлы в этом каталоге на режим 600. Когда я попробовал несколько минут назад, я получил повторение старого поведения: веб-сайт зависает при всех запросах и, кроме того, apachectl restart
получает сообщение (я забыл точную формулировку), что httpd не запущен, и компьютер пытается его запустить.
Как я могу получить бесплатные сертификаты для «Let's Encrypt» или другого инструмента, который не оттолкнул Firefox?
An apachectl -v
дает:
Server version: Apache/2.4.10 (Debian)
Server built: Nov 28 2015 14:05:48
А uname -a
дает:
Linux www 4.4.0-x86_64-linode63 #2 SMP Tue Jan 19 12:43:53 EST 2016 x86_64 GNU/Linux
--ОБНОВИТЬ--
Содержание удалено, 0000_key-letsencrypt.pem ограничен:
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
Находка в иерархии каталогов дает:
root@www:/etc/letsencrypt# find `pwd` -print /etc/letsencrypt /etc/letsencrypt/keys /etc/letsencrypt/keys/0000_key-letsencrypt.pem /etc/letsencrypt/accounts /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3 /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/private_key.json /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/meta.json /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/regr.json /etc/letsencrypt/renewal /etc/letsencrypt/options-ssl-apache.conf /etc/letsencrypt/csr /etc/letsencrypt/csr/0000_csr-letsencrypt.pem
Каталог / home / jonathan / stornge и его содержимое доступны для чтения всем и исполняются во всем мире, где это имеет значение.
--ОБНОВИТЬ--
Добавляем сюда кое-что существенное:
В http://OrthodoxChurchFathers.com В файле конфигурации Apache есть два VirtualHosts, один для обслуживания http://OrthodoxChurchFathers.com и один для перенаправления http://www.OrthodoxChurchFathers.com запросы к http://OrthodoxChurchFathers.com. Файл .conf, содержащий оба VirtualHosts:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName orthodoxchurchfathers.com
#ServerAlias www.orthodoxchurchfathers.com fathers.jonathanscorner.com
DocumentRoot /home/cjsh/fathers/document_root
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/cjsh/fathers>
Options ExecCGI FollowSymLinks Indexes MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
DirectoryIndex index.cgi index.html
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin CJSHayward@POBox.com
ServerName www.orthodoxchurchfathers.com
ServerAlias fathers.jonathanscorner.com
DocumentRoot /home/cjsh/oldmirror
RewriteEngine On
RewriteRule ^(.*)$ http://orthodoxchurchfathers.com$1 [R=301,L]
</VirtualHost></pre></code>
Когда я пытаюсь запустить его и запрашивать один только orthodoxchurchfathers.com, я получаю:
┌──────────────────────────────────────────────────────────────────────┐
│ We were unable to find a vhost with a ServerName or Address of │
│ orthodoxchurchfathers.com. │
│ Which virtual host would you like to choose? │
│ (note: conf files with multiple vhosts are not yet supported) │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │1 008-stornge.conf | Multiple Names | │ │
│ │2 014-paraskeva.conf | paraskeva.jonathansco | │ │
│ │3 036-unixytalk.conf | unixtalk.jsh.name | │ │
│ │4 038-proxy.conf | Multiple Names | │ │
│ │5 027-anna.conf | Multiple Names | │ │
│ │6 044-jobhunt-tracker.creation.c | Multiple Names | │ │
│ │7 049-jsh.conf | Multiple Names | │ │
│ │8 001-steampunk.conf | | │ │
│ │9 006-blajeny.conf | Multiple Names | │ │
│ │10 032-videos.conf | Multiple Names | d│ │
│ └────↓(+)──────────────────────────────────────────────────30%─────┘ │
├──────────────────────────────────────────────────────────────────────┤
│ │
└──────────────────────────────────────────────────────────────────────┘
The command I used was with ./letsencrypt-auto --debug certonly
.
Я написал пару инструкций по запуску SSL-сертификатов Let's Encrypt на CentOS: Начальная настройка & кронируя это.
И мой домен (я использую соглашение об именах файлов z-<[sub-]domain-tld>.conf
) Конфигурационные файлы Apache выглядят так:
<VirtualHost *:80>
ServerName domain.tld
Redirect permanent / https://domain.tld/
</VirtualHost>
<VirtualHost *:443>
SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.tld/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain.tld/fullchain.pem
DocumentRoot /var/www/domain
ServerName domain.tld
ErrorLog logs/domain-error_log
CustomLog logs/domain-access_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ServerAdmin user@domain.tld
SSLEngine on
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
<Directory "/var/www/domain">
Options All +Indexes +FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
А мой ssl.conf выглядит так:
#SSL options for all sites
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
Mutex sysvsem default
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLCompression off
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
Использование Let's Encrypt для получения сертификатов SSL (и повышение рейтинга вашего сайта до "A" с SSL Labs) довольно прост - как только вы пройдете некоторые тайны конфигураций Apache и аргументов командной строки LE.
У меня был хороший успех, используя EFF Certbot в корневом веб-режиме (поскольку меня пугает идея автоматической остановки веб-сервера, пусть даже ненадолго, во время обновления сертификата).
Сначала установите Certbot. Если вы используете Debian Jessie (актуальный на момент написания этой статьи), сначала добавьте jessie-backports
репозиторий, затем
$ sudo apt-get install python-certbot-apache -t jessie-backports
Это принесет несколько пакетов плюс сам certbot.
Затем, чтобы создать сертификат в webroot режим, запустите что-то вроде
$ sudo certbot certonly --webroot -w /srv/www/www.example.net/htdocs -d www.example.net
При желании вы можете добавить --register-unsafely-without-email
так же как --rsa-key-size X
если вам нужен размер модуля, отличный от значения по умолчанию (который в настоящее время составляет 2048 бит). -d fqdn.example.com
можно повторять произвольное количество раз, как и -w
; каждый -w
запускает новый набор доменов, обслуживаемых из каталога, домены, названные -d
. Let's Encrypt не выдает сертификаты с подстановочными знаками (это упоминается в их FAQ) и, по-видимому, также не сертификаты для доменных имен Punycode.
Пользователь, который certbot
работает по мере необходимости, по крайней мере и по умолчанию, доступ для записи в несколько мест в /etc/letsencrypt
. Вероятно, проще всего запустить его как root. Он создаст файл под .well-known/acme-challenge
в заданном корневом веб-каталоге (-w
), удаленная система убедитесь, что он доступен по указанным доменным именам через HTTP, и если все пройдет успешно, будет создана куча файлов PEM в /etc/letsencrypt/archive/www.example.net
плюс соответствующий набор символических ссылок в /etc/letsencrypt/live/www.example.net
и распечатайте дружеское сообщение об успехе.
Если все прошло успешно, вам остается настроить веб-сервер для использования сертификата, найденного в подкаталоге имени хоста /etc/letsencrypt/live
для HTTPS для рассматриваемого домена. Абсолютный минимум для этого для Apache выглядит примерно так:
<VirtualHost *:443>
ServerName www.example.net
SSLEngine on
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.net/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.example.net/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.example.net/chain.pem
</VirtualHost>
Добавьте любые другие директивы по желанию, проверьте, используя apache2ctl -S
и apache2ctl configtest
что все проверено, и активируйте виртуальный хост HTTPS с помощью apache2ctl graceful
.
Не забывайте регулярно обновлять сертификат; в настоящее время сертификаты Let's Encrypt истекают через 90 дней. Пакет Debian поставляется с заданием cron в /etc/cron.d/certbot
и сервис systemd в /lib/systemd/system/certbot.service
которые позаботятся об этом, или вы можете запустить certbot renew
вручную. Запомни apache2ctl graceful
начать пользоваться вновь выданным сертификатом; вы можете настроить задание cron или службу systemd, чтобы это выполнялось автоматически. Чтобы автоматически загружать обновленные сертификаты в Apache на Debian Jessie, рассмотрите возможность обновления /lib/systemd/system/certbot.service
добавить к [Service]
раздел (примечание: порядок важен):
ExecStartPost=/usr/sbin/apache2ctl configtest
ExecStartPost=/usr/sbin/apache2ctl graceful
Обновленный сертификат будет загружен автоматически. если файлы конфигурации Apache проходят configtest
, и укажите Certbot как неисправный модуль, если configtest
или graceful
терпит неудачу.
Я нашел клиента ACME работает хорошо, его легко настроить и начать, он регулярно обновляется и легко обновляется, и он очень хорошо работает в Amazon Linux. Я написал по нему учебник, который вы можете найти Вот.
Начните с загрузки и настройки ACME
https://github.com/hlandau/acme.git
cp ./acmetool /usr/local/bin
/usr/local/bin/acmetool quickstart
Запросить сертификат
./acmetool want example.com www.example.com
Вот как я настроил каталог для задачи - здесь Let's Encrypt подключается к вашему серверу для проверки
mkdir -p /var/www/acme-challenge/.well-known/acme-challenge
chmod -R user:www-data /var/www/acme-challenge/*
find /var/www/acme-challenge/ -type d -exec chmod 755 {} \;
vi /var/www/acme-challenge/.well-known/acme-challenge/text.html (add "hello world!" or similar)
Более подробная информация и комментарии есть на указанном выше веб-сайте, и автор и сообщество могут быть вам полезны.