简单配置后签发https证书
-
配置
域名和网站根目录vim /etc/nginx/conf.d/default.conf(如果没有此文件,则需要自己新建)
server{ listen 80; server_name www.fastcats.top; root /opt/www; }- 这个域名必须要先解析到此服务器,否则无法签发https证书
-
重启nginx
systemctl restart nginx -
采用
Let's Encrypt免费3个月的证书,服务器上直接签发 -
下载签发工具
yum install -y certbot -
新建证书存放文件夹并进入
mkdir -p /etc/letsencryptcd /etc/letsencrypt -
尝试生成
单域名证书(可用最简单的--webroot方式)certbot certonly --dry-run --webroot -w /opt/www -d www.fastcats.top --register-unsafely-without-email- 这里的最后选择不填email,无法收到3个月续期提醒
- 可以改成
-m zjuygp@gmail.com --agree-tos
- 可以改成
- 这里不保证可以一次成功,所以一定要用
--dry-run尝试,避免多次尝试失败后被短期禁用
- 这里的最后选择不填email,无法收到3个月续期提醒
-
出现成功提示后,再去掉
--dry-run参数,正式生成 -
最终出现下面的代表成功
Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/www.fastcats.top/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/www.fastcats.top/privkey.pem Your certificate will expire on 2021-06-27. 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" -
查看证书
certbot certificates -
也可尝试生成
通配符子域名证书(必须用--manual方式)- 先执行
certbot certonly --manual -d "*.fastcats.top" --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory,先别动 - 按要求自己去DNS添加记录,等待确认DNS生效后再回车
- 先执行
-
再次配置nginx,打开文件
vim /etc/nginx/conf.d/default.conf- 添加
https项目:包括域名、根目录、证书、证书keyserver { listen 443 ssl http2; server_name www.fastcats.top; root /opt/www; ssl on; ssl_certificate "/etc/letsencrypt/live/www.fastcats.top/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/www.fastcats.top/privkey.pem"; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH'; ssl_prefer_server_ciphers on; }- 参数解释
ssl on;- 开启ssl加密传输功能
ssl_certificate 'xxx'- 指定证书路径
ssl_certificate_key 'xxx'- 指定证书密钥路径
ssl_session_cache shared:SSL:10m;- 开启会话缓存复用
- 指定为共享模式,存储桶大小为10MB
- 作用: 避免每一次https请求都要创建TLS并握手交换包,造成资源浪费,这里指定缓存session,只要客户端带上此session,nginx就能认出来,迅速恢复会话,无需再创建完整的TLS
- 性能可提升40%
- 开启会话缓存复用
ssl_session_timeout 10m;- 某一个会话缓存的过期时间
- 这里是10分钟,可以加大到60分钟
- 某一个会话缓存的过期时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;- 可选的ssl加密协议
- 这里都是新的
TLS系列(传输层安全协议)- 从1到1.1到1.2均可选
- 2023年更新: 可以支持TLS1.3,需要nginx1.13以上
- 老旧的
SSL系列(安全套接字协议)已经被弃用
- 这里都是新的
- 可选的ssl加密协议
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH';- 指定加密算法组合
ECDHE密钥交换算法RSA签名算法AES128对称加密算法GCM-SHA256签名算法
- 这一项在安装后默认是
ssl_ciphers HIGH:!aNULL:!MD5;- 这是一个宏,和openssl的版本相关
- 可用
openssl ciphers -V 'HIGH:!aNULL:!MD5'查询出具体的算法组合 - 由于CBC相关的加密不安全,所以上面会指定用GCM,如果使用宏,可以改成如下
RC4:HIGH:!aNULL:!MD5,告知偏向于使用RC4系列的加密算法
- 指定加密算法组合
ssl_prefer_server_ciphers on;- 表示使用服务器端的首选算法
- 参数解释
- 添加
-
检查文件是否书写正确
nginx -t- 会报错误行数和变量
-
重启nginx服务
systemctl restart nginx -
证书3个月过期,所以需要强制续期并重启nginx
- (手动)
certbot renew --force-renewnginx -s reload - (定时自动)使用cron作业,需要crontab里面配置如下行:
# 每月的 1号, 4点30 更新证书 30 4 1 * * /usr/local/bin/certbot renew -q # 每月的 1号, 5点30 重新启动 nginx 服务器 30 5 1 * * /usr/local/sbin/nginx -s reload
- (手动)