介绍
Let’s Encrypt 是国外的一个公共的免费的 SSL 项目,由 Linux 基金会托管,由 Mozilla、思科、AKamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便互联网 http 过渡到 https。
准备
- 服务器
- 域名
- 能理解的大脑
安装 acme.sh
Let’s Encrypt官网:https://letsencrypt.org
由于官方文档使用流程很复杂,不适合大部分人使用,为了简化流程,这里使用脚本实现
GitHub:https://github.com/acmesh-official/acme.sh
进入到你的服务器,执行命令:
1 | curl https://get.acme.sh | sh |
普通用户和root用户都可以安装使用,安装脚本其实是进行了如下操作:
- 会把
acme.sh
安装到你所执行命令用户的用户目录下:~/.acme.sh/
。 - 会创建 bash 的 alias,方便你的使用:alias acme.sh=~/.acme.sh/acme.sh。
- 会自动为你创建
cronjob
脚本,每天零点自动检测所有的证书,如果某证书快过期需要更新,则会自动更新该证书。
安装过程不会污染已有的系统任何功能和文件,所有后续的修改都将限制在安装目录中:~/.acme.sh/
。
验证域名并生成证书
acme.sh
实现了 acme
协议支持的所有验证协议,通常一般有几种方式验证域名:HTTP文件验证 和 DNS验证 等,具体验证方式可查阅github文档。
方式一:HTTP文件验证(不推荐)
1 | acme.sh --issue -d congm.in -d *.congm.in -w /home/webroot |
注意:对于通配符证书需要加
-d 域名 -d *.域名
两个参数-w
即webroot,为该域名
通过http所访问到的本地目录上面这段过程将会在/home/webroot
创建一个.well-known
的文件夹,同时Let’s Encrypt
将会通过你要注册的域名去访问那个文件来确定权限,它可能会去访问http://congm.in/.well-known
这个路径,验证成功会自动清理。
方式二:DNS-API验证(推荐)
通过DNS服务器提供 Key 和 secret 实现自动验证,详情看DNS API。
例如,在阿里云解析的域名,请前往阿里云官网查看具体创建方法。控制台中申请子账号 API Token 并执行命令:
1 | export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" |
1 | acme.sh --issue -d congm.in -d *.congm.in --dns dns_ali |
其他域名解析平台具体执行命令参考dnsapi
注意:对于通配符证书需要加
-d 域名 -d *.域名
两个参数Ali_Key
和Ali_Secret
将会保存在~/.acme.sh/account.conf
执行上述命令后,证书文件将会自动申请被存放在~/.acme.sh/
对应的域名文件夹中,如:~/.acme.sh/congm.in
。后续acme.sh
将会自动更新该文件夹内的证书。
部署nginx
参考:acme.sh说明
拷贝证书
1
2
3
4acme.sh --install-cert -d congm.in \
--key-file /etc/nginx/ssl/congm.in.key \
--fullchain-file /etc/nginx/ssl/congm.in.cer \
--reloadcmd 'service nginx force-reload'注意:通过该命令可将
~/.acme.sh/congm.in
内的证书copy到指定位置/etc/nginx
为nginx服务器实际的地址(可修改为自己服务器对应的地址)service nginx force-reload
为nginx重启命令(可修改为自己服务器对应的命令),force-reload
会重载证书,后续acme.sh
签发了新证书后就自动完成该拷贝过程。配置nginx
Nginx-Conf
1
vim /etc/nginx/conf.d/congm.in.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# http(80) -> https(443/ssl)
server {
listen 80;
server_name congm.in;
rewrite ^(.*)$ https://$host$request_uri;
}
# congm.in
server {
listen 443;
server_name congm.in;
include ssl/congm.in.ssl.conf;
location / {
# todo
}
}SSL-Conf
1
vim /etc/nginx/ssl/congm.in.ssl.conf
1
2
3ssl on;
ssl_certificate ssl/congm.in.cer;
ssl_certificate_key ssl/congm.in.key;