为了推广HTTPS协议,电子前哨基金会EFF成立了 Let's Encrypt,提供免费证书。
Let's Encrypt
一个于2015年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。
部署HTTPS,包含
申请域名
部署 Web 应用,并开启服务。如 Nginx,Apache 等
获取证书
配置 Web,如商品监听,指定证书等。
本篇总结在 CentOS 和 Nginx 上安装 Let's Encrypt 签发的证书的过程。
安装 certbot
使用 certbot 获取 SSL 证书
sudo yum install epel-release
sudo yum install certbot
对于 Nignx ,certbot 使用 webroot 的插件获取 SSL。这款插件会在 [your webroot path]/.well-known 生成特殊的文件,在申请证书时,Let's Encrypt 服务会通过 Http 来访问此文件,以签证服务器,所以在使用 certbot 获取证书之前,你需要确保此目录能被外界使用访问。
修改Nginx配置
可以先不修改 nginx 的配置,继续往下走,如果获取证书过程中提示无法访问 /.well-known,才去修改 nginx 的配置,在 server 块里添加如下代码
location ~ /.well-known {
allow all;
}
然后,重启或 reload nginx,即 sudo service nginx restart
获取证书
sudo certbot certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com
--webroot-path 改为你的 webroot path, webroot插件会在此目录下生成前面提到的 .well-known
使用 -d 指定域名。example.com改为你的域名,如果有多个域名,可以多次 -d 指定
最终会在 /etc/letsencrypt/live/example.com 下,生成四个 PEM 文件
cert.pem: 域名证书
chain.pem:Let's Enctrypt chain certificate
fullchain.pem:cert.pem 和 chain.pem 组成
privkey.pem:证书的私钥
执行 sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
生成 generate a strong Diffie-Hellman group,这一步不一定要
配置 Web 服务
upstream product{
server 127.0.0.1:3001;
}
server{
### ssl 配置开始 ###
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/stu.kenniu.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/stu.kenniu.top/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
### SSL 配置结束 #####
server_name stu.kenniu.top;
#charset koi8-r;
#access_log logs/host.access.log main;
# location ~ /.well-known{
# allow all;
# }
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://product;
}
}
ssl 相关的配置即完成了,在浏览器试一下 Https 已经可以访问
接下来新建一个Nginx的配置,将http的请求转发为https
自动更新证书
因为 Let's Encrypt 的证书有效期是90天,到期前要更新证书。certbot 提供了更新证书的命令 sudo cerbot renew。添加一个 conb job 来实现自动更新
sudo crontab -e
输入
30 2 1 /usr/bin/certbot renew >> /var/log/le-renew.log
35 2 1 /usr/bin/systemctl reload nginx
保存即可创建 cron job。以后每周1的凌晨2点30自动更新证书,2点35自动重启nginx。
参考链接
https://www.digitalocean.com/...
https://certbot.eff.org/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。