文章目录
- 介绍
- 申请(免费)域名
- 创建(自签)证书
- 创建(免费)证书
- 自动续签
- 安装 acme.sh
- 生成证书
- 安装(copy)证书
- Cloudflare 泛播
- 引用链接
- 相关链接
介绍
申请(免费)域名
申请ssl证书首先需要域名
免费域名提供商
- https://duckdns.org/ 问题:不支持CNAME
- https://dynv6.com/ 问题:不支持CNAME到其他顶级域名
- https://www.dynu.com/(⭐️推荐⭐️) 功能全问题:必须指定IPV4,无法仅指定IPV6(2022年4月11日 可以禁用ipv4)
- … (提供ddns服务的通常都提供免费域名)
选好域名后就是把域名与服务器地址绑定。(搜索:域名绑定、ddns)
💡免费申请的域名一般没法更改 DNS 服务商,支持的功能玩法也有限。因此,真心建议(没有任何利害关系)花点钱买个域名(fun、top、域名10年才200,2023年03月01日),再将其托管在 cloudflare 下,可以体验到 CND 加速和 DNS 代理。(就非常安心)
上面的步骤弄好就可以生成ssl证书了。
ssl证书分两种:有自签的、服务商提供的。证书如果是自签的一般浏览器都不认(就算加入“根证书信任”都不认,ie除外…),且服务提供商有免费证书提供,所以不推荐使用自签,推荐使用服务商提供的证书。
下面记录两种证书创建流程。
创建(自签)证书
OpenSSL 是一个多功能的命令行工具,可以用于 PKI(Public Key Infrastructure,公钥基础设施)和 HTTPS(HTTP over TLS)相关的大量任务。
创建证书: 💡系统了解 openssl 命令使用看 🔗这里
# 💡找个地方管理证书
$ mkdir /root/cert
$ cd /root/cert
# 💡生成csr文件
# ⚠️需要声明 2048 长度。否则用默认的 1024 长度会卡壳。see
$ openssl req \
-newkey rsa:2048 -nodes -keyout sslserver.key \
-out sslserver.csr
# 💡生成crt文件
openssl x509 -req -days 365 -in sslserver.csr -signkey sslserver.key -out sslserver.crt
查看证书信息:
为nginx.conf添加证书位置:
ssl_certificate /etc/ssl/certs/testcert.crt;
ssl_certificate_key /etc/ssl/certs/testcert.key;
创建(免费)证书
免费的ssl证书供应商
- freessl.cn(1年)(⭐️推荐⭐️)
- letsencrypt.org(3个月)
- https://yundun.console.aliyun.com(1年) 阿里云(chrome不认的、且限额20个)
以 freessl.cn 为例 (域名提供商使用 dynv6.com)
点击“创建免费的SSL证书”
认证类型选择“DNS”、CSR生成选择“我有CSR”,然后把自签名中的.csr文件内容考入文本框
然后点击“点击创建”
到 dynv6.com 后台对应的域名下添加一条TXT记录
回到 freessl.cn 点击 “点击验证”
通过后会获得证书的下载链接,把证书下下来部署到服务器即可
(这里验证不通过是因为dynv6对CNAME的实现有点反人类。改用dynu.com作为ddns提供商,重新跑一次流程,在那里设置CNAME就没问题了)
描述:dynv6对CNAME的实现问题 会自动在Contant后面加上域名 比方说,我需要填写 CNAME 主机记录: _660aaaaaaaaaaaaaaaaaaaa 记录值: 8AEaaaaaaaaaaaaaa.TTDrp19dx1.trust-provider.com 填写完后是 CNAME 主机记录: _660aaaaaaaaaaaaaaaaaaaa 记录值: 8AEaaaaaaaaaaaaaa.TTDrp19dx1.trust-provider.com.lawsssssssssssss.dynv6.net 然后就没法认证通过
自动续签
以 freessl.cn 为例(免费且可以认证通配域名)
流程同上面的申请证书,申请完后会获得脚本
acme.sh --issue -d xxxxxxxxxxx.xxx.xxx --dns dns_dp --server https:xxxxxxxxxxxxxxxxxxxxxxxxxxxx
在使用脚本前,需要先配置好脚本 acme.sh 的运行环境。
参考:ACME v2证书自动化快速入门https://blog.freessl.cn/acme-quick-start/
安装 acme.sh
配置的脚本都写好了,就下面一句代码
curl https://get.acme.sh | sh -s email=my@example.com
# 脚本会有如下改动
# 1. 把所有需要的文件放入 ~/.acme.sh/
# 2. alias acme.sh=~/.acme.sh/acme.sh
# 3. 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
自动构建的定时脚本(如果是root用户,位置在 /etc/crontab/root)
48 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
# --cron Run cron job to renew all the certs.
# --home <directory> Specifies the home dir for acme.sh.
生成证书
acme.sh 实现了 acme 协议支持的所有验证协议,运行下面脚本就能完成 dns 验证.
acme.sh --issue -d xxxxxxxxxxx.xxx.xxx --dns dns_dp --server https:xxxxxxxxxxxxxxxxxxxxxxxxxxxx
# --issue Issue a cert.
# -d, --domain <domain.tld> Specifies a domain, used to issue, renew or revoke etc.
# --dns [dns_hook] Use dns manual mode or dns api. Defaults to manual mode when argument is omitted.
# See: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
下面是脚本日志
# 创建key
[Mon Apr 11 20:00:57 CST 2022] Using CA: https://acme.freessl.cn/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrw
[Mon Apr 11 20:00:59 CST 2022] Create account key ok.
[Mon Apr 11 20:01:01 CST 2022] Registering account: https://acme.freessl.cn/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrw
[Mon Apr 11 20:01:04 CST 2022] Registered
[Mon Apr 11 20:01:05 CST 2022] ACCOUNT_THUMBPRINT='xxxxxxxxxxxxxxxxxxxxxxxxxxx7w'
[Mon Apr 11 20:01:05 CST 2022] Creating domain key
[Mon Apr 11 20:01:07 CST 2022] The domain key is here: /root/.acme.sh/*.xxxxxxxxxxxxxxxxxxxx.com/*.xxxxxxxxxxxxxxxxxx.com.key
# 完成DNS认证
[Mon Apr 11 20:01:07 CST 2022] Multi domain='DNS:*.xxxxxxxxxxxxxxxx.com,DNS:xxxxxxxxxxxxxxxxxx.com'
[Mon Apr 11 20:01:07 CST 2022] Getting domain auth token for each domain
[Mon Apr 11 20:01:48 CST 2022] Getting webroot for domain='*.xxxxxxxxxxxxxxxxxxx.com'
[Mon Apr 11 20:01:48 CST 2022] Getting webroot for domain='xxxxxxxxxxxxxxx.com'
[Mon Apr 11 20:01:48 CST 2022] *.xxxxxxxxxxxxxxxxxxx.com is already verified, skip dns-01.
[Mon Apr 11 20:01:48 CST 2022] xxxxxxxxxxxxxxxxxxxx.com is already verified, skip dns-01.
[Mon Apr 11 20:01:48 CST 2022] Verify finished, start to sign.
# 申请获得证书
[Mon Apr 11 20:01:48 CST 2022] Lets finalize the order.
[Mon Apr 11 20:01:48 CST 2022] Le_OrderFinalize='https://acme.freessl.cn/v2/xxxxxxxxxxxxxxxxxxxxxxx'
[Mon Apr 11 20:01:50 CST 2022] Order status is processing, lets sleep and retry.
[Mon Apr 11 20:01:54 CST 2022] Polling order status: https://acme.freessl.cn/xxxxxxxxxxxxxxxxxxx
[Mon Apr 11 20:02:10 CST 2022] Order status is processing, lets sleep and retry.
[Mon Apr 11 20:02:13 CST 2022] Polling order status: https://acme.freessl.cn/xxxxxxxxxxxxxxxxxxxxxxxxx
[Mon Apr 11 20:02:29 CST 2022] Order status is processing, lets sleep and retry.
[Mon Apr 11 20:02:32 CST 2022] Polling order status: https://acme.freessl.cn/xxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 下载证书
[Mon Apr 11 20:02:45 CST 2022] Downloading cert.
[Mon Apr 11 20:02:45 CST 2022] Le_LinkCert='https://acme.freessl.cn/xxxxxxxxxxxxxxxxxxxxx'
[Mon Apr 11 20:02:48 CST 2022] Cert success.
-----BEGIN CERTIFICATE-----
MIIGHDCCBISgAwIBAgIRAPbbbbbbbbbbbbbbbbbbbcNAQEMBQAw
WTELMAkGxxxxxxxxxxxxxxxxxxxbyIMdu/4u8RVU
gyNPegaaaaaaaaaaaaaaaaaaaaaaNA/VlZPiv5VdWJtDecd3
dUj0ZHvY56PoLpsssssssssssssssssssssssssssssssssssssssssBpH3eq
PmpY3sssssssssssssssssssssssrQ=
-----END CERTIFICATE-----
[Mon Apr 11 20:02:48 CST 2022] Your cert is in: /root/.acme.sh/*.aaaaaaaaaaaaaaaaaaaaa.com/*.aaaaaaaaaaa.com.cer
[Mon Apr 11 20:02:48 CST 2022] Your cert key is in: /root/.acme.sh/*.aaaaaaaaaaaaaaa.com/*.aaaaaaaaaaaa.com.key
[Mon Apr 11 20:02:48 CST 2022] The intermediate CA cert is in: /root/.acme.sh/*.aaaaaaaaaaaaaaaaaaaaaa.com/ca.cer
[Mon Apr 11 20:02:48 CST 2022] And the full chain certs is there: /root/.acme.sh/*.aaaaaaaaaaaaaaaaaaa.com/fullchain.cer
安装(copy)证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.
正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:
Nginx example:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
# -i, --install-cert Install the issued cert to apache/nginx or any other server.
# --install-cert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.
#
# 问题:
# 1. 据测试, reload 并不会重新加载证书, 所以用的 force-reload)
# 2. ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer
# 而非 /etc/nginx/ssl/<domain>.cer
# 否则 SSL Labs 的测试会报 Chain issues Incomplete 错误
# 3. 详细参数请参考:
# https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.
问题:openwrt报错 “/root/.acme.sh/acme.sh: line 5785: service: command not found”
参考:https://github.com/acmesh-official/acme.sh/issues/4031
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "/etc/init.d/nginx reload"
--debug 2 | logger
Cloudflare 泛播
使用 Cloudflare 泛播可以隐藏我们的服务器真实地址,从而避免被 DDoS 直接攻击,也能实现 CDN 加速的效果(能保证200ms不多不少)。
配置步骤: 配置过程中,我们服务器和 Cloudflare 服务器的配置: https://senjianlu.com/2021/11/cloudflare-ssl-tls/ 脚本: https://gist.github.com/LawssssCat/f9f2d3ca980e757c26ef5bd4a70f7284
引用链接
- 常用的四种免费证书申请方式
相关链接
- 工具
- SSL 检测:https://myssl.com/