本文首发: 开发指南:如何在 CentOS 7 上安装 Nginx
Let’s Encrypt 是由 Internet Security Research Group (ISRG) 开发的一个自由、自动化和开放的证书颁发机构。目前几乎全部的现代浏览器都信任由 Let’s Encrypt 颁发的证书。nginx
这个教程,将会一步一步的教你如何在 CentOS 7 上经过 Certbot 来生成 SSL 安全证书,并配置到 Nginx 上。git
在继续此教程以前,请确保你已经知足了如下两个条件:github
Certbot 是一个很是简单方便的工具,它能够帮助咱们生成 SSL 证书,自动更新 SSL 证书,而且将证书配置到 Web 服务上。web
能够运行如下命令,从 EPEL 仓库中安装 Certbot:centos
sudo yum install certbot
Diffie–Hellman 密匙交换是一种能够在不安全的通讯信道上安全交换密钥的方法。浏览器
如今运行如下命令,能够来生成一个新的 2048 位的 DH 参数:安全
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
2048 位,生成时间大概 3-5 分钟左右。固然,若是您愿意也能够将大小改成 4096 位,可是这样的话,可能生成的时间至少须要花费 30 分钟,此操做具体时长取决于系统熵。
要生成域名的 SSL 证书,咱们将使用 Webroot 插件在 ${webroot-path}/.well-known/acme-challenge
目录中建立临时文件来验证请求的域名。Let's Encrypt 服务器会向临时文件发出 HTTP 请求,以验证请求的域名是否被正确的解析到了正在运行 Certbot 的服务器。服务器
为了简便,咱们将把全部访问 .well-known/acme-challenge
的 HTTP 请求都映射到 /var/lib/letsencrypt
这个目录中。session
下面的命令将会建立这个目录,而且使 Nginx 对它拥有读写的权限。dom
sudo mkdir -p /var/lib/letsencrypt/.well-known sudo chgrp nginx /var/lib/letsencrypt sudo chmod g+s /var/lib/letsencrypt
为了不 Nginx 配置文件中存在重复的代码,请建立如下两个代码片断(里面是 Nginx 的配置代码),咱们将在相关的 Nginx 配置文件中包含这些片断:
一、首先,建立一个目录,用于存放 Nginx 配置的代码片断文件:
sudo mkdir /etc/nginx/snippets
二、建立第一个片断文件, letsencrypt.conf,其全路径为: /etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ { allow all; root /var/lib/letsencrypt/; default_type "text/plain"; try_files $uri =404; }
三、建立第二个片断文件,ssl.conf,其全路径为: /etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 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; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 30s; add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload"; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff;
上面的代码中包含 Mozilla 的推荐部分。 支持 OCSP Stapling,HTTP 严格传输安全(HSTS)并强制执行几个以安全为中心的 HTTP 头。
代码片断建立完成以后,就能够打开 Nginx 的域名独立配置文件,将 letsencrypt.conf 文件引入。
在这里,咱们的域名是 kaifazhinan.com ,因此咱们的配置文件为 kaifazhinan.com.conf, 文件的全路径为 /etc/nginx/conf.d/kaifazhinan.com.conf。
server { listen 80; server_name kaifazhinan.com www.kaifazhinan.com; include snippets/letsencrypt.conf; }
注意: 咱们建议针对不一样的域名,建立不一样的独立配置文件。这样会比较清晰,便于管理和查找对应的配置。
Nginx 的主配置文件中有一行代码是 include /etc/nginx/conf.d/*.conf
,这行代码的意思就是加载 /etc/nginx/conf.d/
目录下全部以 .conf 结尾的配置文件,因此咱们直接将独立的配置文件保存在 /etc/nginx/conf.d/
目录下就会自动引入。
从新加载 Nginx 配置使更改生效:
sudo systemctl reload nginx
你如今能够运行 Certbot 使用 Webroot 插件,为你的域名生成 SSL 证书:
sudo certbot certonly --agree-tos --email admin@kaifazhinan.com --webroot -w /var/lib/letsencrypt/ -d kaifazhinan.com -d www.kaifazhinan.com
注意: 记得将 admin@kaifazhinan.com 换成你本身的邮箱,还有 kaifazhinan.com 和 www.kaifazhinan.com 换成你的域名。
若是成功的生成了 SSL 证书,那么 Certbot 将打印相似如下的内容:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/kaifazhinan.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/kaifazhinan.com/privkey.pem Your cert will expire on 2019-02-11. 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 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
如今你已经成功生成了 SSL 证书,如今能够修改 Nginx 的域名配置了,这里咱们的域名是配置文件是 kaifazhinan.com.conf,文件的全路径是 /etc/nginx/conf.d/kaifazhinan.com.conf:
server { listen 80; server_name www.kaifazhinan.com kaifazhinan.com; include snippets/letsencrypt.conf; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name www.kaifazhinan.com; ssl_certificate /etc/letsencrypt/live/kaifazhinan.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/kaifazhinan.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/kaifazhinan.com/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; return 301 https://kaifazhinan.com$request_uri; } server { listen 443 ssl http2; server_name kaifazhinan.com; ssl_certificate /etc/letsencrypt/live/kaifazhinan.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/kaifazhinan.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/kaifazhinan.com/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; # 若是有补充的配置,能够写在这里 }
上面的代码,咱们将 HTTP 的请求重定向到了 HTTPS,将 www.kaifazhinan.com 重定向到了 kaifazhinan.com 上。
最后,经过下面的命令,从新加载 Nginx,使上面的配置生效:
sudo systemctl reload nginx
Let’s Encrypt 颁发的 SSL 证书有效时间是 90 天。咱们须要在证书过时以前自动续订证书,这里将建立一个天天运行两次的定时任务 ,并在证书到期前 30 天自动续订。
经过运行 crontab
命令,来建立一个定时任务:
sudo crontab -e
上面的命令,会自动建立一个文件,并自动进入编辑状态,因此直接复制下面的内容粘贴到里面便可:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
保存并关闭文件。
若是要测试是否可以正常更新证书,你能够在 certbot 命令后面添加 --dry-run
这个参数来主动触发更新命令。
sudo certbot renew --dry-run
若是没有输出错误,则表示 SSL 证书更新成功。
经过此教程,你学会了:
若是你想了解 Certbot 的更多信息,能够参考它的官方文档。
期待下次与你相见 : )
本文首发: 开发指南:如何在 CentOS 7 上安装 Nginx