原来写过一篇文章《记录两个免费HTTPS服务商》里面记录了三个免费的证书提供商。 其中沃通的证书好像已经不能用了,不过最近的一年中:阿里云,腾讯云,百度云等都接入了国外的某家证书提供商,以提供免费的证书服务。
通过国内的云服务商提供的证书服务,大都有一年到两年的服务期限,这类操作大多为中文界面,切流程简单,就不做过多说明,本篇文章主要对:开源的letsencrypt证书申请作简要的记录。
letsencrypt 是一个开源的免费证书服务,由国际很多知名厂商共同提倡组建的一个组织,其主页上提供了这些厂商的名称和logo。
一、letsencrypt 介绍
由于其是一个开源组织,旨在推动https技术的推广,所以其开放了https证书申请的整个流程所需要的接口(文档),并以开放的形式提供给开发者,所以据此,产品了大批各种语言的证书申请工具。在那里,你可以看到由各种语言:Bash,C,Go,PHP,Python,java…… 所编写的证书申请和部署工具。
本篇文章主要介绍基于Bash(Shell)的 acme.sh
二、acme.sh 介绍
github的主页上提供了一个基本的安装使用说明(中文版),在那里你能查看到基本的使用和安装流程,。
acme.sh
是一个shell脚本工具集,其提供了一个自动化:证书的申请,认证,安装,以及证书的自动更新。
acme.sh
提供两种方式生成证书:基于http的文件验证;和基于dns的txt解析。本文主要介绍基于http的文件验证方式,dns的验证,请查阅:生成证书部分。
三、acme.sh 安装
curl https://get.acme.sh | sh
或者
wget -O - https://get.acme.sh | sh
安装的主要过程:
- 下载 最新的压缩包
Downloading https://github.com/Neilpang/acme.sh/archive/master.tar.gz
- 解压到
~/.acme.sh
- 设置别名,就是在
~/.bashrc
中引入acme.sh.env
,后者中设置了别名。 - 配置
crontab
,在crontab中加入17 0 * * * "/home/dingdayu/.acme.sh"/acme.sh --cron --home "/home/dingdayu/.acme.sh" > /dev/null
这是一个自动化的安装过程,如果你需要了解更多的安装,可以查看作者的安装说明
四、验证并生成证书
工具提供了两种验证协议,这里是http文件验证
在进行下面的验证之前,你需要准备好:
[x] 已完成域名指向
[x] 创建域名主目录(可选,否请选方案一)
[x] 已配置基于http的访问(可选,否请选方案一)
1、方案一
若没有配置nginx或Apache的http访问:
acme.sh --issue -d www.mydomain.com --standalone
--standalone
命令,会临时启一个80
端口以供通过验证,如果80端口已经被占用,则不推荐使用这种方案。
1、方案二 (我采用的方案)
acme.sh --issue -d www.mydomain.com --webroot /home/wwwroot/www.mydomain.com/public/
这里的前提,域名
www.mydomain.com
已经指向并可访问/home/wwwroot/www.mydomain.com/
目录了,请特别注意laravel
和thinkphp
等框架的public
,--webroot
所提供的目录,一定是可以通过http直接访问的目录。
切记在执行命令前,通过浏览器访问域名,验证是否成功,方便后续排错。
acme.sh
会自动生成到webroot
目录下验证目录,并在验证通过后,将验证文件删除。
五、安装证书
1、命令安装
acme.sh
提供了一种自动安装证书的命令 --installcert
:
acme.sh --installcert -d mydomain.com \
--key-file /etc/nginx/ssl/mydomain.key \
--fullchain-file /etc/nginx/ssl/mydonain.cer \
--reloadcmd "service nginx force-reload"
其中 --reloadcmd
是用来指定在配置完成后 执行nginx配置重载的命令,作者在文档中特别提出service nginx reload
并不会重载证书,但是我用 nginx -s reload
的时候是会重载的,这里备注下,不知是否是service
的差别。
我并没有使用上面的自动安装的方法,而是用的手动配置,这样才能更好的配置
2、手动配置 (我采用的方案)
在第四步中,验证通过后会生成秘钥,并发送到letsencrypt
进行签发,然后导出 .key
和 .cer
等文件。在最后会在控制台输出具体的存放路径,并以绿色字体显示以示提醒。
官方的自动安装证书的命令中,存在备份相关证书的操作,这里可以自行备份。
为了方便的使用cron的更新脚本,这里并没有对路径进行copy,你可以copy到其他路径配置,在cron中增加reloadcmd
命令copy更新证书文件。
根据上面的证书路径,配置nginx
# 在80端口监听server同级,增加一个新的server
server {
listen 443;
ssl on;
ssl_certificate /home/dingdayu/.acme.sh/anyingwxapp.xyser.com/anyingwxapp.xyser.com.cer;
ssl_certificate_key /home/dingdayu/.acme.sh/anyingwxapp.xyser.com/anyingwxapp.xyser.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
root /data/wwwroot/anyingwxapp/public;
server_name anyingwxapp.xyser.com;
index index.html index.htm index.php;
# 下面的等同80端口的相关转发策略
location = /50x.html {
root html;
}
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
安装完成后,重启nginx
sudo nginx -s reload
(是否需要sudo
,请更加实际情况添加)
六,验证https访问
通过https://www.mydomain.com
访问,查看是否正常。 如果不正常,则排查http://www.mydomain.com
是否正常,若http正常,则表明443端口监听出错。
另外记得防火墙的问题,在开启443监听后,将iptable
或firewall
防火墙,开启443端口;这里不再详细介绍。