Назад | Перейти на главную страницу

Как я могу использовать Let's Encrypt (letsencrypt.org) в качестве бесплатного поставщика сертификатов SSL?

У меня есть несколько сайтов, работающих с бесплатным сертификатом 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
&lt;Directory />
    Options FollowSymLinks
    AllowOverride None
&lt;/Directory>
&lt;Directory /home/cjsh/fathers>
    Options ExecCGI FollowSymLinks Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
&lt;/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/"
&lt;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
&lt;/Directory>

</VirtualHost>

&lt;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]
&lt;/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)

Более подробная информация и комментарии есть на указанном выше веб-сайте, и автор и сообщество могут быть вам полезны.