Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)
单域名证书的生成可以 参考这里。
acme.sh 项目中文文档
Let’s Encrypt 在 18 年 1 月份推出了 ACME v2,支持通配符域名证书,对小网站、个人站长的友好度进一步增加。
常用的两种安装方式对比
ACME 协议支持的验证协议一般有两种:
- http 验证:必须有可以正常运行的服务器和公网 IP。验证时,需要在你的网站根目录下放一个文件来验证域名所有权,完成验证后就可以生成证书了。
- dns 验证:不需要服务器和公网 IP。只需要为域名添加一条 txt 解析记录来验证域名所有权。
Let’s Encrypt 通配符证书的两种安装方式:
- acme.sh:对于 http 验证,会自动在网站根目录生成验证文件, 然后自动完成验证,最后自动删除验证文件。对于 dns 验证,如果域名解析商提供 API,则可以自动借助这个 API 通过工具添加 txt 记录完成验证(如果不提供 API 则无法自动化,目前腾讯云、阿里云都支持)。此外,还会自动生成更新域名的定时任务。
- certbot-auto:对于域名验证这一步,需要手工操作。且更新域名的定时任务也需要自己写。
通过 acme.sh 获取通配符域名证书
acme.sh 的所有相关文件(包括安装文件、申请到的证书等)都在 ~/.acme.sh/ 这一个目录中。
安装 acme.sh
在线安装
curl https://get.acme.sh | sh
或者:
wget -O - https://get.acme.sh | sh
从 Git 安装
下载项目并安装:
git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh
./acme.sh --install
更多高级安装方式可以 参考这里。
安装过程包含 3 个动作:
- 创建并复制
acme.sh到你的家目录$HOME:~/.acme.sh/。所有的证书都会放到这个目录中 - 创建别名:
acme.sh=~/.acme.sh/acme.sh - 创建每天的定时任务检查证书,如果快要到期了会自动更新
定时任务示例:
0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
验证
安装完成后,需要重新打开终端,acme.sh 命令才能生效。
root@v1:~# acme.sh -h
生成证书
http 方式
acme.sh 会自动在网站根目录生成验证文件, 然后自动完成验证,最后自动删除验证文件。
需要指定域名和域名对应的网站根目录:
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
对于 nginx 服务器,acme.sh 还可以智能的从 nginx 配置中自动完成验证,不需要指定网站根目录:
acme.sh --issue -d mydomain.com --nginx
域名获取后,需要手动修改 Nginx 配置文件。
如果没有运行任何 web 服务,80 端口是空闲的,那么 acme.sh 可以运行为 webserver,临时监听 80 端口,完成验证:
acme.sh --issue -d mydomain.com --standalone
dns 方式
如果域名解析商提供 API,则可以自动借助这个 API 通过工具添加 txt 记录完成验证。
- 对于阿里云:
# 替换成从阿里云获取的 API 参数
export Ali_Key="666"
export Ali_Secret="888"
# 换成自己的域名
acme.sh --issue --dns dns_ali -d kikakika.com -d *.kikakika.com
- 对于腾讯云:
# 替换成从 DNSPod 获取的 API 参数
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
# 换成自己的域名
acme.sh --issue --dns dns_dp -d kikakika.com -d *.kikakika.com
- 对于其他平台,可以 参考这里
DNS 生效需要一段时间,acme.sh 设置的是等待两分钟。
acme.sh 会保存 API 参数并生成定时任务,用于每天验证证书是否即将过期,并及时更新。下面是通过 crontab -e 看到的新增的定时任务:
16 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
安装证书
证书生成后,需要把证书 copy 到真正需要用它的地方。
默认生成的证书都放在安装目录 ~/.acme.sh/ 下,但是请不要直接使用。而是使用 --installcert 命令安装证书。
使用 --installcert 命令安装证书
使用 --installcert 命令安装证书时,证书文件会被复制到相应的位置:
acme.sh --installcert -d kikakika.com \
--key-file /etc/nginx/ssl/kikakika.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl reload nginx.service"
示例:
[root@VM_139_74_centos ~]# acme.sh --installcert -d kikakika.com \
> --key-file /etc/nginx/ssl/kikakika.key \
> --fullchain-file /etc/nginx/ssl/fullchain.cer \
> --reloadcmd "systemctl reload nginx.service"
[Tue May 22 16:35:20 CST 2018] Installing key to:/etc/nginx/ssl/kikakika.key
[Tue May 22 16:35:20 CST 2018] Installing full chain to:/etc/nginx/ssl/fullchain.cer
[Tue May 22 16:35:20 CST 2018] Run reload cmd: systemctl reload nginx.service
[Tue May 22 16:35:20 CST 2018] Reload success
当证书更新以后,reloadcmd 中的命令会被自动调用,让服务器加载更新后的证书。
--installcert 命令可以携带很多参数,来指定目标文件。这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用。
注意,对于 Nginx,需要通过
systemctl reload nginx.service来重新加载证书。
配置 Nginx
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer,而非 /etc/nginx/ssl/<domain>.cer,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
我将所有流量统一导入 https://www.kikakika.com,示例如下:
server {
listen 443 ssl;
server_name www.kikakika.com;
index index.html;
root /home/kikakika/www;
ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/kikakika.key;
ssl_session_timeout 5m;
}
server {
listen 80;
server_name www.kikakika.com;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name kikakika.com;
return 301 https://www.kikakika.com$request_uri;
}
server {
listen 443 ssl;
server_name kikakika.com;
return 301 https://www.kikakika.com$request_uri;
}
更新 acme.sh
手动升级 acme.sh 到最新版:
acme.sh --upgrade
可以通过 --auto-upgrade 开启自动升级:
acme.sh --upgrade --auto-upgrade
关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
吊销证书
如果申请好的证书不需要了,可以手动进行吊销
acme.sh --revoke -d kikakika.com -d *.kikakika.com
示例:
[root@VM_139_74_centos ~]# acme.sh --revoke -d kikakika.com -d *.kikakika.com
[Fri Jun 8 15:50:40 CST 2018] Try domain key first.
[Fri Jun 8 15:50:45 CST 2018] Revoke success.
常见问题
遇到问题不要慌,通过 --debug 2 选项可以直接在终端上显示详细日志:
acme.sh --issue --debug 2 --dns dns_dp -d kikakika.com -d *.kikakika.com
域名 API 需要登录正确的解析平台开启
问题描述:获取证书一直失败,分析日志发现有“The login token ID is invalid”这么一句话:
...
[Tue May 22 14:43:48 CST 2018] Http already initialized.
[Tue May 22 14:43:48 CST 2018] _CURL='curl -L --silent --dump-header /root/.acme.sh/http.header --trace-ascii /tmp/tmp.LzYzrZRjvQ -g '
[Tue May 22 14:43:48 CST 2018] _ret='0'
[Tue May 22 14:43:48 CST 2018] response='{"status":{"code":"10002","message":"The login token ID is invalid","created_at":"2018-05-22 14:43:50"}}'
[Tue May 22 14:43:48 CST 2018] invalid domain
[Tue May 22 14:43:48 CST 2018] Error add txt for domain:_acme-challenge.kikakika.com
[Tue May 22 14:43:48 CST 2018] pid
[Tue May 22 14:43:48 CST 2018] No need to restore nginx, skip.
[Tue May 22 14:43:48 CST 2018] _clearupdns
[Tue May 22 14:43:48 CST 2018] skip dns.
[Tue May 22 14:43:48 CST 2018] _on_issue_err
[Tue May 22 14:43:48 CST 2018] Please check log file for more details: /root/.acme.sh/acme.sh.log
...
后来查找资料才发现,腾讯云和 DNSPod 是两个独立的平台。对于腾讯云上的域名,域名解析并不在腾讯云,仍然需要登录 DNSPod 开启 API:
登录 DNSPod 添加 API 后,这次就显示“Action completed successful”了。然后等待 120 秒,等 DNS 解析生效:
[Tue May 22 14:54:12 CST 2018] _postContentType
[Tue May 22 14:54:12 CST 2018] Http already initialized.
[Tue May 22 14:54:12 CST 2018] _CURL='curl -L --silent --dump-header /root/.acme.sh/http.header --trace-ascii /tmp/tmp.rkflZDBcOD -g '
[Tue May 22 14:54:13 CST 2018] _ret='0'
[Tue May 22 14:54:13 CST 2018] response='{"status":{"code":"1","message":"Action completed successful","created_at":"2018-05-22 14:54:15"},"record":{"id":"361406913","name":"_acme-challenge","status":"enabled","weight":null}}'
[Tue May 22 14:54:13 CST 2018] Sleep 120 seconds for the txt records to take effect
通配符域名申请的证书,不支持根域名
问题描述:对 *.kikakika.com 申请了通配符域名,但是在访问 https://kikakika.com 是时候出问题。
解决办法:必须在申请证书时同时指定根域名 kikakika.com 和通配符域名 *.kikakika.com 两个域名,这样生成的证书才是完整的通配符证书:
acme.sh --issue --debug 2 --dns dns_dp -d kikakika.com -d *.kikakika.com
下面是导致出问题的申请通配符证书的命令:
acme.sh --issue --debug 2 --dns dns_dp -d *.kikakika.com
Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)的更多相关文章
- IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)
IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一.HTTPS 协议介绍 1,什么是 HTTP ...
- Let's Encrypt这个免费的证书签发服务
使用的是Let's Encrypt这个免费的证书签发服务,按照这里的教程一步步照着来,很快就完成了. 迁移过程总体来说比较顺利,只是遇到了两个不大不小的坑.一个是域名的跳转问题,迁移完成以后对于所有h ...
- 【转】IIS - 自动申请、部署Let's Encrypt的免费SSL证书
IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一.HTTPS 协议介绍 1,什么是 HTTP ...
- 申请免费通配符证书(Let's Encrypt)并绑定IIS
申请免费通配符证书(Let's Encrypt)并绑定IIS 2018-05-25 18:01 by Giant Liu, 800 阅读, 4 评论, 收藏, 编辑 什么是 Let’s Encrypt ...
- 申请免费通配符证书(Let's Encrypt)并绑定IIS(转载)
本文转载自https://blog.csdn.net/qq_41608008/article/details/80491447 什么是 Let's Encrypt? 部署 HTTPS 网站的时候需要证 ...
- docker获取Let's Encrypt永久免费SSL证书
一 起因 官方的cerbot太烦了,不建议使用 还不如野蛮生长的acme.sh,而这里介绍docker运行cerbot获取Let's Encrypt永久免费SSL证书 二 选型 cerbot的证书不会 ...
- Nginx 实现 HTTPS(基于 Let's Encrypt 的免费证书)
SSL / TLS加密会为您的用户带来更高的搜索排名和更好的安全性. Let’s Encrypt 是一个认证机构(CA).它可以提供免费证书,并且已经被大多数浏览器所信任.另外,通过工具 Certbo ...
- 获取 Let's Encrypt 免费通配符证书实现Https
说明 3月14日,Let's Encrypt的执行董事Josh Aas对外宣布,他们的通配符证书正式上线,用户可以基于此特性轻松部署/开启所有子域名的HTTPS功能. Let's Encrypt 是国 ...
- 实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题
最近需要https这里看到一份不错的博客,收录一下! Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla.Cisco.Akamai.IdenTrust ...
随机推荐
- Java集合:Collection、List、Set、Map、泛型
1.集合的理解和好处 2.集合的框架体系图 ★ 3.Collection接口的特点和使用 ★ 4.List和Set接口的特点和使用★ 5.List接口的实现类学习★ 6.Set接口的实现类学习★ 7. ...
- [BNDSOJ] #1106代码
#include<bits/stdc++.h> using namespace std; ]; ][]; int n; bool check(int i,int j) { ]==]==]= ...
- 前端校招知识体系之css
本文将从以下四个方面展开介绍: 选择器 样式表继承 css3部分特性 BFC css选择器优先级策略 先附上个链接:css选择器参考手册 内联>id>class=属性选择器=伪类选择器&g ...
- python面向对象的三大特征--多态
#什么是多态:由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同 #多态体现在由一个类实例化出多个对象,这些对象执行相同的方法时,执行的过程和结果不一样--不同的对象调用相同的方法 #多态的概 ...
- Kconfig的简单例子
https://cloud.tencent.com/developer/article/1431908 使用Kconfig时,需要注意的地方 1.在Kconfig中定义的配置宏,前缀都没有" ...
- [python 学习] requests 库的使用
1.get请求 # -*- coding: utf-8 -*- import requests URL_IP = "http://b.com/index.php" pyload = ...
- flask之Twitter Bootstrap
一:Twitter Bootstrap是什么? 1.开源框架:提供用户页面组件. 2.可以创建整洁且具有吸引力的网站,并且网站能兼容所有现代的Web浏览器. 特点: Bootstrap 是客户端框架, ...
- R语言里面的循环变量
for (i in 1:10) { print("Hello world") } 以上这条命令执行完之后,变量i会被保存下来!并且,i的值将是10. 程序中有多处循环的时候要非常注 ...
- 032:DTL常用过滤器(1)
为什么需要过滤器: 在DTL中,不支持函数的调用形式‘()’,因此不能给函数传递参数,这将有很大的局限性:而过滤器其实就是一个函数,可以对需要处理的参数进行处理,并且还可以额外接受一个参数(也就是说: ...
- 小记:web安全测试之——固定session漏洞
今天因为项目背景需要,需要检测web接口是否一些安全隐患. 无奈于从未掌握有系统的渗透性知识,只好根据个人对网络协议和 web 的理解,做一些探索,最终发现了一个session fixation at ...