本文是我参考互联网上一些 HTTPS 相关文章, 而后自己实践而来
主要内容由 ** 获取证书 ,nginx TSL 配置 ** 两部分组成
项目环境搭建
获取证书
安装完 Git 后, 克隆
certbot(* 原名 letsencrypt*) 项目
$ git clone https://github.com/certbot/certbot
$ cd certbot
克隆完成后, 此时可以通过命令获取证书
- Webroot
该方式适用于本机中正在运行中的项目, 无须停止服务器即可申请
$ ./certbot-auto certonly --webroot -w /usr/local/nginx/html --email admin@example.com -d example.com -d www.example.com -d other.example.com
--webroot
为申请方式类型
-w /usr/local/nginx/html
配置申请域名项目的 Webroot
跟路径, 以静态页面为例
location / {
root /usr/local/nginx/html;
index index.html;
}
- Standalone
该方式需要 ** 确保 80,443 端口没有被占用 **
$ ./certbot-auto certonly --standalone --email admin@example.com -d example.com -d www.example.com -d other.example.com
--standalone
为申请方式类型
--email admin@example.com -d example.com
参数参考 Webroot
方式
如果验证没有问题, 稍候页面会弹出一个协议对话框, 点击 Agree 即可
- Manual
该方式适用于申请证书服务器不是域名所在服务器的情况
$ ./certbot-auto certonly --manual --email admin@example.com -d example.com -d www.example.com -d other.example.com
--standalone
为申请方式类型
--email admin@example.com
参数参考 Webroot
方式
-d example.com
为需要申请的域名,需要拥有对该域名所在机器的读写权限
运行后, 会要求用户在域名所在服务器的项目跟目录创建一个文件, 并指定文件内容
Make sure your web server displays the following content at
http://example.com/.well-known/acme-challenge/VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc before continuing:
VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc.JhmxNt13DUzzmC4_7VfnfWh1gmePbExxQygAMf9KTSo
mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s" VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc.JhmxNt13DUzzmC4_7VfnfWh1gmePbExxQygAMf9KTSo > .well-known/acme-challenge/VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc
Press Enter to Continue
操作完成后按下回车键即可
申请操作成功后, 会在界面中输出证书的存放路径, 以及证书的到期时间 (**90 天 **)
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert
will expire on 2017-08-17. To obtain a new or tweaked version of
this certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
"certbot-auto 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
生成证书中会创建 /etc/letsencrypt
文件夹, 证书文件默认存放在 /etc/letsencrypt/live/example.com
文件夹中, 其中 example.com
取自第一个域名
在 example.com
文件夹中包含 4 个文件 cert.pem chain.pem fullchain.pem privkey.pem
- cert.pem 域名证书
- chain.pem 根证书及中间证书
- fullchain.pem 由
cert.pem
和 chain.pem
合并而成
- privkey.pem 证书私钥
** 创建一个 2048 位的
Diffie-Hellman 文件 **(nginx 默认使用 1024 位的 Diffie–Hellman 进行密钥交换, 安全性太低)
openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048
nginx TSL 配置
首先对 http 协议进行 301 重定向到 https 协议
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
https 相关配置
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_dhparam /etc/letsencrypt/live/dhparams.pem;
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_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
add_header Strict-Transport-Security max-age=60;
}
以上配置完成后, 重启 nginx 即可完成对 https 的切换
使用以下命令即可进行 ** 续期 **, 续期成功后需要服务器
$ ./certbot-auto renew
该命令只会对快到期的证书才会进行更新, 如果希望强制更新, 可以增加 --force-renewal
参数
其他说明