0%

SSL/TLS证书的获取,部署和自动更新

ssl证书有广泛的应用。没有ssl证书的网站只能被http协议访问,大多数情况下访问者还会被警告当前网站不安全。搭建梯子的时候也可能用到证书,这是为了将梯子与墙内之间的流量伪装成访问网站的流量。

获取证书

如果域名托管在cloudflare上,那我推荐直接从这里获取证书。步骤见下图,注意第二步之后是申请一个证书,而第三步是为证书免费开通自动续订功能。我的第一个域名的证书是从cloudflare上获取的,如下图。
cloudflareSSL

如果没有cloudflare,还可以使用acme.sh脚本获取证书。这个脚本支持http验证和dns验证两种获取证书的方式。http方式验证服务器上存在某种服务,一条命令直接获取证书;而dns方式不需要服务器的存在,但需要提供在域名托管服务商(cloudflare)那里的API Key。dns方式更好的地方在于,它能够每60天更新一次证书,类似cloudflare为证书自动续订。

我的另外一个域名的证书通过acme.sh的dns方式获取。在/root/.acme.sh/biter.online_ecc/biter.online.conf中,能看到对cloudflare账户和api的记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LOG_FILE='/root/.acme.sh/acme.sh.log'
#LOG_LEVEL=1

AUTO_UPGRADE='1'

#NO_TIMESTAMP=1


UPGRADE_HASH='afacdfcb95e063325d8f01ebc8daa57322307d92'
DEFAULT_ACME_SERVER='https://acme-v02.api.letsencrypt.org/directory'
SAVED_CF_Key='**********保密'
SAVED_CF_Email='**********保密'
USER_PATH='/root/.vscode-server/bin/b7886d7461186a5eac768481578c1d7ca80e2d21/bin/remote-cli:/root/.nvm/versions/node/v16.19.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games'

安装证书

所谓安装,其实就是把获取到的证书挪个地方。cloudflare界面上获取的证书可以放在服务器上的一个目录里,例如我是放在/root/cert_cf里:

1
2
3
/root/cert_cf
|-CERTIFICATE
|-KEY

据我观察,这样安放好证书之后就可以不动了,以后cloudflare会自动为这两个文件续签。

如果证书是用acme.sh获取的,那么它应该已经存在于目录/root/.acme.sh中了。此时还需要一条指令:

1
2
3
4
5
6
7
acme.sh --installcert -d example.com \

--key-file /root/cert/example.com.key \

--fullchain-file /root/cert/example.com.fullchain.cer \

--reloadcmd "service nginx force-reload"

这条指令会自动把获取的证书挪到目录/root/cert/中,随后用service nginx force-reload自动更新nginx服务使用的证书。如果acme.sh是采用dns方式获取证书的,随后也将和cloudflare一样定期更新证书。每次更新之后都会遵照这条安装指令将证书挪到/root/cert/并重载nginx服务。

nginx使用证书

后边在配置nginx服务器时,将其证书位置写成上述目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl;
server_name www.jixinlong.top; # 填写绑定证书的域名
ssl on;
ssl_certificate /root/cert_cf/CERTIFICATE;#源服务器上的证书,由cloudflare签发,2037年7月9日到期。
ssl_certificate_key /root/cert_cf/KEY;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 按照这个套件配置
ssl_prefer_server_ciphers on;
# return 500;

location / {
root /root/blog/public/; # 站点目录
index index.html index.htm;
# autoindex on;
charset utf-8;#目录里有中文,加上这句
}
}

然后用nginx -t命令检查一下,没有问题就service nginx force-reload重新加载nginx,并尝试从外部访问网址。如果访问不通,可能还需要在cloudflare上设置加密模式为“完全(严格)”:
cloudflare加密模式

参考