前言

之前写过一篇 使用lnmp申请免费SSL证书并自动续期 ,但是前提是使用lnmp一键安装包,最近搭建Nginx+Ws+Tls时没有使用lnmp,所以使用acme.sh申请证书(其实lnmp也是调用了acme.sh的脚本申请的)。顺手记录下来,希望可以帮到大家。

之前那片内容域名是狗爹家的,这次介绍下namesilo家的域名流程,其实都是大同小异。

之所以介绍namesilo是因为他家域名提供永久whois隐私保护。

顺手提供一个1美金优惠码:NAME-DOMAIN

开整

环境

服务器IP:172.245.34.125
操作系统:CentOS 7.8
证书来源:Let's Encrypt
安装脚本:acme.sh v2.8.6
测试域名:qichen.one
网页服务器:Nginx 1.18.0
OpenSSL版本:1.0.2k

PS:Nginx 1.18.0 使用官方源yum安装,安装路径为/etc/nginx,网页存放路径/usr/share/nginx/html
PPS:建议使用OpenSSL 1.1.1d及以上版本,因为低版本不支持TLSv1.3

安装acme.sh

acme.sh的安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中:~/.acme.sh/

根据自己系统选择安装语句:

curl https://get.acme.sh | sh

或者

wget -O -  https://get.acme.sh | sh

运行后最后输出Install success!表示安装成功,也可以输入下面命令查询安装路径:

[root@KsC7 ~]# ls -l ~/.acme.sh/
总用量 216
-rw-r--r--. 1 root root    152 6月   2 02:40 account.conf
-rwxr-xr-x. 1 root root 197214 6月   2 02:40 acme.sh
-rw-r--r--. 1 root root     78 6月   2 02:40 acme.sh.env
drwxr-xr-x. 2 root root   4096 6月   2 02:40 deploy
drwxr-xr-x. 2 root root   4096 6月   2 02:40 dnsapi
drwxr-xr-x. 2 root root   4096 6月   2 02:40 notify

检查~/.acme.sh/目录下是否有acme.sh脚本,且有可执行权限

之后检查别名:

[root@KsC7 ~]# alias
......
alias acme.sh=~/.acme.sh/acme.sh
......

如果有包含acme.sh的内容说明设置正确,如果没有请手动添加别名

echo "alias acme.sh=~/.acme.sh/acme.sh" >> ~/.bash_profile

PS:别名的作用就是无论在哪儿输入acme.sh都可以直接调用该脚本

获取API

参照下表,获取域名所在供应商的API信息

服务商缩写所需API参数申请API地址
aliyunaliexport Ali_Key="123456"
export Ali_Secret="abcdef"
点击访问
awsawsexport AWS_ACCESS_KEY_ID=123456
export AWS_SECRET_ACCESS_KEY=abcdef
点击访问
cloudflarecfexport CF_Key="123456"
export CF_Email="abc@example.com"
点击访问
dnspod (cn大陆版)dpexport DP_Id="123456"
export DP_Key="abcdef"
点击访问
godaddygdexport GD_Key="123456"
export GD_Secret="abcdef"
点击访问
linodelinodeexport LINODE_API_KEY="123456"点击访问
namecomnamecomexport Namecom_Username="username"
export Namecom_Token="123456"
点击访问
namesilonamesiloexport Namesilo_Key="123456"点击访问

本文只列举了比较常用的几家,更多服务商信息及更详细设置方法详见:
https://github.com/acmesh-official/acme.sh/wiki/dnsapi

根据上表提供链接,进入namesilo的api申请页面,IP 1~5可以输入限制访问该ip的设置,输入自己域名所指定的主机ip即可,最后两个勾属于不勾不让继续系列

获取到API Key,保持这个页面不关,马上就会用到它

生成证书

回到VPS主机上,根据上表提供的导入环境变量,将API Key参数导入

[root@KsC7 ~]# export Namesilo_Key="526d97af9c53e4d82988992"

PS:不同域名供应商所需要的变量名不同,请根据自己情况填写,Key也请填写自己的
PPS:因export命令仅限当次登录有效,所以设置完成前尽量保持连接不断开,断开则需要从新导入

按照下面语句格式输入自己内容

acme.sh   --issue   --dns dns_dp   -d "aa.com"  -d "www.aa.com"
# --dns 后面为dns_你的域名供应商的缩写
# -d 后面为域名,尽量使用双引号引起来,可以写多个

比如我是输入

[root@KsC7 ~]# acme.sh --issue --dns dns_namesilo -d "qichen.one" -d "www.qichen.one"
[2020年 06月 02日 星期二 12:26:36 EDT] Getting domain auth token for each domain
[2020年 06月 02日 星期二 12:26:38 EDT] Getting webroot for domain='qichen.one'
[2020年 06月 02日 星期二 12:26:39 EDT] Getting webroot for domain='www.qichen.one'
[2020年 06月 02日 星期二 12:26:39 EDT] Adding txt value: RRwYht8Vnpd5I1MqHGFil1RkgoI3oQfez17OcXlp_mQ for domain:  _acme-challenge.qichen.one
[2020年 06月 02日 星期二 12:26:40 EDT] Successfully added TXT record, ready for validation.
[2020年 06月 02日 星期二 12:26:40 EDT] The txt record is added: Success.
[2020年 06月 02日 星期二 12:26:40 EDT] Adding txt value: e1Au6zZe4y_KTrd2SH2ZCuKbtFaYU4vNhlM9AIEEbhQ for domain:  _acme-challenge.www.qichen.one
[2020年 06月 02日 星期二 12:26:42 EDT] Successfully added TXT record, ready for validation.
[2020年 06月 02日 星期二 12:26:42 EDT] The txt record is added: Success.
[2020年 06月 02日 星期二 12:26:42 EDT] Let's check each dns records now. Sleep 20 seconds first.
......

脚本会自动添加txt解析记录,用于验证域名所有权,我省略的部分就是不停的自动验证的过程……

同时在namesilo的dns解析页面可以看到已经添加了两条txt记录:

耐心等待脚本验证txt解析生效……

最终效果如图

安装证书

生成的证书默认存放在~/.acme.sh/目录下,请不要直接使用此目录配置nginx,建议单独存放

使用--installcert命令将证书复制到任意目录,证书更新以后也会存放到相同目录下

这里我选择存放到nginx安装目录下的ssl目录中,大家根据自己习惯存放即可

首先要确认nginx的安装路径,如果自己知道的可以跳过

[root@KsC7 ~]# find / -type f -name nginx.conf
/etc/nginx/nginx.conf

创建ssl目录

[root@KsC7 ~]# mkdir /etc/nginx/ssl

使用--installcert命令安装证书

acme.sh --installcert -d qichen.one -d www.qichen.one --key-file /etc/nginx/ssl/qichen.one.key --fullchain-file /etc/nginx/ssl/fullchain.cer

PS:qichen.one.keyfullchain.cer这两个文件尽量不要改名,尤其是fullchain.cer

配置nginx

在配置nginx之前,还需要做一件事,就是生成一个迪菲-赫尔曼密钥,听着名字就高大上,百科自行了解下。也是为了证书更安全些,当然也可以不做这一步,毕竟http不也一直用着么……

[root@KsC7 ~]# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
# /etc/nginx/ssl/dhparam.pem 为完整路径,填写自己的
# 2048 为位数,越大越安全

这里推荐一个ssl的配置文件生成工具,是mozilla的开源项目,就是firefox那个公司……

https://ssl-config.mozilla.org/

  • Server Software 选择你的软件(Nginx)
  • Mozilla Configuration 支持的TLS版本

    • Modern 为仅支持TLSv1.3 (注:TLSv1.3要求你的OpenSSL版本不低于1.1.1)
    • Intermediate 支持TLSv1.2 TLSv1.3
    • Old 支持TLSv1 TLSv1.1 TLSv1.2 TLSv1.3
  • Environment 环境

    • Server Version 软件版本,nginx使用nginx -v查询
    • OpenSSL Version openssl版本,可以使用openssl version查询
  • Miscellaneous 其他

    • HTTP Strict Transport Security 就是仅支持https,在server 80加了个301重定向,这里我们为了不和已经存在的server 80冲突,不暂时用它的,等都搞定了再设置http跳转https
    • OCSP Stapling 这个其实是可以提高SSL握手效率的,但是还没有搞明白它需要不需要更新,以及acme.sh可以自动更新不,所以先暂时不开启,研究明白了再写一篇好了……

PS:这里的OpenSSL要选择高版本(如:1.1.1d),因为版本低了下面配置不会加入TLSv1.3,省的以后升级了openssl还要回来改……

得到配置文件后,在listen [::]:443 ssl http2;的下面增加如下字段:

    server_name qichen.one www.qichen.one;
    index index.html index.htm index.php default.html default.htm default.php;
    root /usr/share/nginx/html/;
  • server_name 主机名,就是上面申请时-d的域名
  • index 跳转主页文件,一般index.php和index.html即可
  • root 网站存放目录

PS:网站存放位置不确定的可以使用find / -type d -name html查询

把得到的配置文件加入到nginx的配置文件中即可

如果之前没有设置过任何443相关的配置,建议单独新建一个配置文件ssl.conf存放到nginx.conf(默认配置文件)中include字段设置的目录下(nginx.conf一般在nginx安装目录下,找不到也可以find查找下)

全设置好了输入nginx -t检查配置文件

[root@KsC7 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

输出一个ok,一个successful,表示配置文件没有问题,输入systemctl restart nginx重启nginx

测试https访问你的网站……

顺手SSL Labs测试下安全性等级。

其他补充

http请求跳转到https

找到配置文件中的server 80字段,我的环境是/etc/nginx/conf.d/default.conf

长成这样

server {
    listen       80;
    server_name  localhost qichen.one www.qichen.one;
......

或长成这样

server {
    listen 80 default_server;
    listen [::]:80 default_server;
......

都没关系,在listen下面加上

return 301 https://$host$request_uri;

(请注意这里是或!不是和!是或!不是和!是或!不是和!)

rewrite ^(.*) https://$host$1 permanent;

定时更新证书

先要确认你的定时任务进程已启动且开机自动运行

[root@KsC7 ~]# systemctl list-unit-files | grep crond | grep enabled
crond.service                                 enabled 

如果有输出结果,且为enabled,则已经设置自动启动定时任务了,就不用管了

如果没有内容(请首先确认你不是CentOS 6),那么输入下面的命令启动定时任务并设置成开机自启动

[root@KsC7 ~]# systemctl start crond
[root@KsC7 ~]# systemctl enable crond

查看定时任务

[root@Ksc7 ~]# crontab -l
39 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

如果有关于acme.sh内容的定时任务,说明已经设置成功了,只要确认定时任务自动运行就不用管它了

PS:该定时任务的意思是,每天0:39,自动检查证书是否到期,如有需要自动更新证书

如果没有该定时任务,可能是因为没装crond或没运行导致的,输入yum install crontabs -y来安装,并按上面方法设置成自启动

然后输入crontab -e,按照上面的格式手动添加一条即可

关于acme.sh的配置文件

如果你是按照正常流程使用acme.sh脚本并可以成功通过https访问的话

你的API Key记录在~/.acme.sh/account.conf

你的证书存放地址记录在~/.acme.sh/YOURDOMAIN/YOURDOMAIN.conf

关于更新脚本

手动更新脚本

acme.sh --upgrade

设置自动更新脚本

acme.sh  --upgrade  --auto-upgrade

取消自动更新

acme.sh --upgrade  --auto-upgrade  0

其他

更多高级设置或功能请参考官方手册:https://github.com/acmesh-official/acme.sh/wiki

最后

因为我的openssl版本比较低,而nginx设置中开启了TLSv1.3,所以测试我才得了个B……

咱搞不到A+,怎么也得搞到A吧!(其实生成配置文件时不选择Old,是可以到A的,不过折腾这么久不支持TLSv1.3怎么行……)

下篇文章介绍升级OpenSSL好了……

Enjoy it!

参考资料:
https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E

Last modification:March 26th, 2021 at 10:20 am
If you think my article is useful to you, please feel free to appreciate