前言
之前写过一篇 使用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地址 |
---|---|---|---|
aliyun | ali | export Ali_Key="123456" export Ali_Secret="abcdef" | 点击访问 |
aws | aws | export AWS_ACCESS_KEY_ID=123456 export AWS_SECRET_ACCESS_KEY=abcdef | 点击访问 |
cloudflare | cf | export CF_Key="123456" export CF_Email="abc@example.com" | 点击访问 |
dnspod (cn大陆版) | dp | export DP_Id="123456" export DP_Key="abcdef" | 点击访问 |
godaddy | gd | export GD_Key="123456" export GD_Secret="abcdef" | 点击访问 |
linode | linode | export LINODE_API_KEY="123456" | 点击访问 |
namecom | namecom | export Namecom_Username="username" export Namecom_Token="123456" | 点击访问 |
namesilo | namesilo | export 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.key
和fullchain.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
查询
- Server Version 软件版本,nginx使用
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