CentOS 7 Nginx Настройка SSL-сертификата Let’s Encrypt

сервер Nginx CentOS

Срок действия Alibaba Cloud, купленного в прошлом году, истек.Поскольку плата за продление Alibaba Cloud намного дороже, чем новая покупка, я снова купил виртуальную машину.В процессе миграции мне нужно было перенастроить сертификат Let's Encrypt.Во время миграции были обнаружены некоторые проблемы. процесс выполнения После нескольких часов нащупывания я наконец понял.

Общий процесс установки сертификата Let's Encrypt

yum install epel-release -y
yum install certbot -y

Затем выполните:

certbot certonly --webroot -w /home/www/www.biaodianfu.com -d www.biaodianfu.com -m biaodianfu@email.com --agree-tos

Значение связанных параметров:

  • --webroot - режим запуска
    • Автономный режим: текущая служба веб-сервера должна быть остановлена, а порт 80 может быть запущен встроенным веб-сервером клиента для связи с Let's Encrypt.
    • режим webroot: вам не нужно останавливать текущий веб-сервер, но вам нужно создать временный каталог в корневом каталоге доменного имени и убедиться, что внешняя сеть может получить доступ к этому каталогу через доменное имя.
  • -w указывает каталог, в котором находится веб-сайт
  • -d указывает доменное имя веб-сайта
  • -m Укажите контактный адрес электронной почты, заполните реальный и действительный, letsencrypt отправит уведомление по электронной почте до истечения срока действия сертификата
  • --agree-tos указывает на принятие соответствующего соглашения

Используя режим webroot, Certbot сгенерирует случайный файл при проверке доменного имени сервера, а затем сервер Certbot получит доступ к вашему файлу через HTTP, поэтому убедитесь, что ваш Nginx настроен так, чтобы вы могли получить доступ к этому файлу.

Поскольку виртуальному хосту LNMP по умолчанию запрещено скрытые файлы и каталоги, начинающиеся с ., поэтому, если вы посетите http://www.biaodianfu.com/.well-known/acme-challenge/****, эта ссылка вернет ошибку 403. ошибка, поэтому его нужно добавить под серверным узлом конфигурации nginx

location ~ /.well-known {
    allow all;
}

Окончательный файл конфигурации выглядит следующим образом:

server {
    listen       80;
    server_name  biaodainfu.com www.biaodianfu.com;
    index index.html index.htm index.php;
    charset utf-8;
 
    root   /home/www/www.biaodianfu.com;
    
    location / {
        try_files $uri $uri/ =404;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
 
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass php-fpm;
        #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
    {
        expires      30d;
    }
    
    location ~ .*.(js|css)$
    {
        expires      12h;
    }
	
    location ~ /.well-known {
        allow all;
    }
}

После перезапуска nginx выполните операцию подачи заявки на сертификат.В обычных условиях вы можете увидеть следующее содержимое дисплея:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.biaodianfu.com/fullchain.pem. Your cert will
   expire on 2018-02-25. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to biaodianfu@email.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:
 
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

После завершения настройте сервер nginx и настройте сервер для поддержки доступа https.

server {
  listen 80;
  server_name biaodianfu.com www.biaodianfu.com;
  return 301 https://www.biaodianfu.com$request_uri;
}
 
server {
    listen 443 ssl http2;
    server_name  biaodainfu.com www.biaodianfu.com;
    index index.html index.htm index.php;
    charset utf-8;
 
    root   /home/www/www.biaodianfu.com;
 
    ssl_certificate /etc/letsencrypt/live/www.biaodianfu.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.biaodianfu.com/privkey.pem;
 
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
 
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
 
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass php-fpm;
        #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
    {
        expires      30d;
    }
    
    location ~ .*.(js|css)$
    {
        expires      12h;
    }
    
    location = /favicon.ico {
	log_not_found off;
	access_log off;
    }
    
    location ~ /.well-known {
        allow all;
    }
}

 

Выше приведены общие шаги и процессы.Теперь я не сталкивался с какими-либо проблемами при выполнении Centos 7.2.На этот раз я использую Centos 7.4, но возникла проблема.

Устранение неполадок при установке сертификата

Вопрос 1: ImportError: нет модуля с именем «requests.packages.urllib3»

Причина в том, что версия запросов, которые идут вместе с системой, слишком низкая, см.Этот адресВременное решение:

pip install requests urllib3 pyOpenSSL --force --upgrade

Вторая проблема возникает после выполнения: ImportError: в модуле 'pyOpenSSL' отсутствует необходимая функциональность. Попробуйте обновиться до версии 0.14 или новее.

Основная причина в том, что официальный исходный код RHEL/CentOS и версия исходного кода epel для pyOpenSSL слишком устарели, а новая версия certbot зависит от более поздней версии библиотеки pyOpenSSL, которая дает сбой.

Решение: удалите certbot и PyOpenSSL в epel, используйте pip для установки certbot.

pip search certbot
yum remove certbot pyOpenSSL
pip install certbot

pip установить certbot. Если вы столкнулись с ошибкой, что Python.h или pyconfig.h не может быть найден, вы можете установить пакет Python для разработки: найден, а затем установите пакет OpenSSL devel: yum install -y openssl-devel; снова запустите команду pip install certbot, чтобы успешно установить certbot.

Выполнить, когда закончите

certbot certificates
аутентификация. Вывод нормальный, что указывает на то, что pip установил последнюю версию certbot и может работать правильно.

Автоматическое обновление сертификатов

Поскольку срок действия этого сертификата составляет всего 90 дней, нам необходимо настроить функцию автоматического продления, чтобы помочь нам автоматически обновлять срок действия сертификата. Сначала смоделируйте обновление сертификата в командной строке:

certbot renew --dry-run

Эффект успешного обновления симуляции следующий:

[root@iZuf64dhkm7u57qfwrrhw6Z ~]# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
 
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.biaodianfu.com.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for www.biaodianfu.com
Waiting for verification...
Cleaning up challenges
 
-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/www.biaodianfu.com/fullchain.pem
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)
 
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/www.biaodianfu.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
-------------------------------------------------------------------------------
 
IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
[root@iZuf64dhkm7u57qfwrrhw6Z ~]#

Если вы не можете подтвердить правильность конфигурации nginx, обязательно запустите команду имитации обновления, чтобы убедиться, что certbot нормально взаимодействует с сервером. Используйте команду crontab -e для включения автоматических задач, командная строка:

crontab -e

Добавить конфигурацию: (автоматически выполнять операцию обновления сертификата в 2:30 каждые два месяца), сохранить и выйти.

30 2 * */2 * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

Команда для проверки срока действия сертификата:

openssl x509 -noout -dates -in /etc/letsencrypt/live/www.biaodianfu.com/cert.pem

SSL-безопасность тестового сервера

Qualys SSL Labs предоставляет комплекснуюТестирование безопасности SSL, введите доменное имя своего веб-сайта и оцените конфигурацию HTTPS. В идеале оценка A+, если вы получите A-, как я, то есть много возможностей для улучшения. Кроме того, у Puyun также есть инструмент для тестирования https:www.upyun.com/https

Связанные улучшения:

1. Создайте значение ключа Perfect Forward Security (PFS)

mkdir /etc/ssl/private/ -p
cd /etc/ssl/private/
openssl dhparam 2048 -out dhparam.pem

Perfect Forward Security (PFS), китайский перевод в Perfect Forward Secrecy, в 2014 году из-за кропотливой лазейки (существует возможность утечки закрытого ключа сервера) сайт прямой секретности не используется, а зашифрованные данные связи могут быть расшифрованы с помощью закрытый ключ, ведущий к утечке информации, что заставляет серьезно относиться к секретности. В общем, так будет безопаснее, и основная причина не получить оценку А+ именно из-за этого. (Время генерации немного велико)

2. Обновите файл конфигурации

# https://mozilla.github.io/server-side-tls/ssl-config-generator/
server {
    listen 80;
    server_name biaodianfu.com www.biaodianfu.com;
    return 301 https://www.biaodianfu.com$request_uri;
}
server {
    listen 443 ssl http2;
    server_name  biaodainfu.com www.biaodianfu.com;
    index index.html index.htm index.php;
    charset utf-8;
	
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
 
    root   /home/www/www.biaodianfu.com;
 
    ssl_certificate /etc/letsencrypt/live/www.biaodianfu.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.biaodianfu.com/privkey.pem;
	
	ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
 
	# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/ssl/private/dhparam.pem;
 
	# intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
	
    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;
	
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
 
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
 
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass php-fpm;
        #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
    {
        expires      30d;
    }
    
    location ~ .*.(js|css)$
    {
        expires      12h;
    }
    
    location = /favicon.ico {
	    log_not_found off;
	    access_log off;
    }
    
    location ~ /.well-known {
        allow all;
    }
}

Другие ссылки:

Наградить автора