认真是一种态度
坚持是一种选择

0%

为你的Nginx配置免费SSL证书

一般配置https方法

一般当你申请或购买了ssl证书后,都会提供给你cerkey后缀的文件,将文件上传到nginx服务器上,然后修改nginx配置文件,重启nginx即可生效,一个常见的ssl配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 443;
server_name localhost;
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/证书名称.pem;
ssl_certificate_key cert/证书名称.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}

证书因为颁发机构不同,价格也会不同,少则几百,多则上千,一般有效期是一年。而我们要介绍的当然是免费的ssl证书,那就是由Let's Encrypt提供的ssl证书,官网地址:https://letsencrypt.org

步骤还是一样,首先你得告诉颁发机构域名是你自己的,怎么验证域名是你的,一般你需要在域名申请的后台设置一个颁发结构发给你的txt记录,你将该值配到你的域名解析上,比如阿里的后台就长这样:

你只需要按照颁发机构给你的随机串码去配置就可以了,这样颁发机构就可验证域名确实是属于你本人的。

自动配置

Let's Encrypt的ssl证书虽然是免费的,但是它的有效期只有90天,也就是说,每90天之后要生成新证书对过期证书进行替换,还是有点繁琐,如果某一天你忘了,你的网站就会因为证书过期,被浏览器阻止访问了。

万能的互联网上啥都有,你遇到的问题别人也会遇到,于是一个自动化脚本acme.sh诞生了,只要你授权该脚本去访问你的域名配置后台,他就可以自动帮你去域名提供商设置验证记录,同时会去Let's Encrypt请求颁发证书,然后自动下载到你的服务器上。

本文介绍的方法中,域名是在阿里云上申请的,所以需要在阿里云后台进行配置,当然其他域名提供商也是支持的,比如腾讯云,配置基本都是大同小异。

1.一键获取脚本acme.sh

1
curl https://get.acme.sh

2.获取阿里云后台App_Key跟App_Secret,进入阿里云这个页面,可以拿到程序调用需要的appid和appsecret值。

3.创建一个脚本文件ali_dns.sh,设置key和secret和要生成的域名的证书,注意改成你自己的内容,内容如下:

1
2
3
4
export Ali_Key="xxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxxx"

./acme.sh --issue --log --dns dns_ali -d 你自己的域名xxx.xdull.cn

4.执行ali_dns.sh,证书会生成在xxx.xdull.cn文件夹下,这个文件夹是你上面的命令指定的,--dns dns_ali表示使用的阿里域名解析。

5.配置nginx,设置ssl证书的所在路径

1
2
3
4
5
6
7
8
9
10
11
12
server {
server_name xxx.xdull.cn;
listen 443 http2 ssl;
ssl_certificate /root/.acme.sh/xxx.xdull.cn/fullchain.cer;
ssl_certificate_key /root/.acme.sh/xxx.xdull.cn/xxx.xdull.cn.key;
ssl_trusted_certificate /root/.acme.sh/xxx.xdull.cn/ca.cer;

location / {
root html;
index index.html index.htm;
}
}

6.重新加载nginx配置

1
nginx -s reload

acme.sh的强大之处是当你首次执行完ali_dns.sh后,下次acme.sh为定时帮你执行证书申请和替换,你可通过crontab -l命令查看执行频率。当然你也可以通过acme.sh --cron -f命令强制执行。

开放防火墙

如果上述操作完了,仍然无法通过https访问,检查下你的443端口是否被防火墙阻止了,如果是就开放443端口。

1
2
3
4
5
6
#查看开放的端口号
firewall-cmd --list-all
#开放443端口
sudo firewall-cmd --add-port=443/tcp --permanent
重启防火墙
firewall-cmd --reload