nginx配置ssl证书Let’s Encrypt
1.Let’s Encrypt
如果要启用 HTTPS,我们需要一个 CA 证书,Let’s Encrypt 是一个免费的证书颁发机构,由 ISRG(Internet Security Research Group)运作。
2.使用 Certbot 获取证书
Certbot 是 Let’s Encrypt 官方推荐的证书获取工具,它可以帮助很方便的获取和更新 Let’s Encrypt 证书,Certbot 支持所有 Unix 内核的操作系统。
3.安装 Certbot 客户端
yum install -y epel-releaseyum install -y certbot
注: 安装和执行 certbot 过程中,可能会报一些错误,这些错误主要是使用到的一些 python 库版本不匹配问题,根据错误提示更新安装相应版本的库即可。
4.申请https证书
sudo certbot certonly -d "*.qinggx.cn" -d qinggx.cn --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
5.设置 DNS TXT 记录
腾讯云解析配置的截图
查看解析是否生效:
dig -t txt _acme-challenge.app.qinggx.cn
按照提示,在自己的域名服务商那里添加或者修改 _ache-challenge 的 txt 记录,修改之后需要验证是否解析成功,验证方式详见后面,验证解析成功之后输入 Enter 键继续
6.证书申请成功
如果出现这样的提示就说明证书已经申请成功了
有时需要删除已生成的证书,重新生成。可使用如下命令进行删除:
ertbot delete --cert-name sub.domain.com
7.配置 web server
证书申请成功了就基本搞定了,有了证书之后就在服务器上配置一下就可以了
nginx 配置示例:
server {
#listen 80;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/weihanli.xyz/fullchain.pem;#证书地址
ssl_certificate_key /etc/letsencrypt/live/weihanli.xyz/privkey.pem;#key地址
if ($scheme = http) {
return 301 https://$host$request_uri;
}
server_name weihanli.xyz;
}
更多:
server {
listen 443 ssl;
server_name xxx.abc.com;
ssl on; // 该配置项需要去掉
ssl_certificate cert/server.crt;
ssl_certificate_key cert/server.key;
/*
设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,和off差不多,停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。
*/
ssl_session_cache shared:SSL:1m;
// 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
ssl_session_timeout 5m;
/*
选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。
这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。
*/
ssl_ciphers HIGH:!aNULL:!MD5;
// 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:3001;
}
}
重新加载 web 服务器配置或者重新重启web服务器以加载新证书,这里以重新加载 nginx 配置为例
8.配置 tomcat
配置 tomcat 支持 https,有两处需要修改:
在 Connector 节点增加
proxyPort="443"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" proxyPort="443" />
添加如下 Value 节点
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto" />
9.测试
启动 nginx 或重新载入配置,使用浏览器打开 https://app.qinggx.cn/
service nginx reload
可以使用在线工具 https://www.ssllabs.com/ssltest 来检测证书情况。
10.自动更新证书
Let’s Encrypt 证书只有 90 天有效期,我们需要在证书到期之前更新证书,certbot 提供了相应的命令 certbot renew。
/usr/bin/certbot renew --dry-run
可以将此更新命令添加到计划任务中,certbot renew 命令只会更新还有 30 天才会到期的证书,所以我们可以每隔 2 个月在凌晨3:30执行一次更新操作即可,创建一个新文件 certbot-auto-renew-cron
,写入 cron 计划内容:
30 3 * */2 * /usr/bin/certbot renew --post-hook "service nginx restart" --quiet >> /var/log/cerbot.log
--pre-hook
这个参数表示执行更新操作之前要做的事情
犀利士
--post-hook
这个参数表示执行更新操作完成后要做的事情
启动 crontab 定时任务
crontab certbot-auto-renew-cron