无80和443端口下申请域名SSL证书
文章目录
- 无80和443端口下申请域名SSL证书
- SSL 证书申请的方式
- 通过 DNS 申请 SSL 证书
- 获取个人域名
- acme.sh 方式
- certbot 方式
最近在捣鼓家用的小型服务器,搭好之后就发现许多服务如果只是 HTTP 来访问太不安全,因此琢磨来琢磨去还是选择搞一个 SSL 证书升级到 HTTPS 更安全。
但是问题来了:以前申请的时候,都是用 acme.sh 或者 certbot 通过 nginx 配置来申请 SSL 证书,但是家用宽带会屏蔽 80 和 443 端口的流量。
为了解决这个问题,我在谷歌搜了不少资料,终于找到了不通过这两个端口申请 SSL 证书的解决方案。
SSL 证书申请的方式
这一章主要简述一下 DV(Domain Validation) 的 SSL 证书的三种申请方式。以下文段取自维基百科的翻译:
域名验证证书(DV SSL)的唯一标准是证明对域名的whois记录、DNS记录文件、电子邮件或虚拟主机账户的控制。通常情况下,对域名的控制是通过以下方式之一来确定的。
- 对发给域名whois详情中的电子邮件联系人的电子邮件的回应
- 对发给域名中知名管理联系人的电子邮件的回应,例如(admin@,postmaster@,等等)。
- 发布一个DNS TXT记录
- 发布一个由自动证书颁发系统提供的非授权码
域验证(DV)的证书与扩展验证(EV)的证书不同,因为这是签发证书的唯一要求。特别是,域名验证的证书并不保证任何特定的法律实体与该证书有联系,即使域名可能意味着一个特定的法律实体控制着该域名。
通过 DNS 申请 SSL 证书
从上面可见,要想在端口受限的情况下完成 SSL 的申请,最简单的方法就是使用 DNS 方式。
获取个人域名
在申请 SSL 证书前,必须要先获得一个域名。这一步就八仙过海,各显神通,读者自行百度解决。
acme.sh 方式
参考自 acme.sh 说明。
使用 acme.sh 的 DNS 认证方式的好处是,你不需要任何服务器,不需要任何公网 ip,只需要 dns 的解析记录即可完成验证。坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
假设 hello.mydomain.com 是待申请的域名。则发起 DNS 申请的命令为:
acme.sh --issue --dns -d hello.mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名 DNS 管理面板中添加这条 txt 记录即可。不会这一步的小伙伴可以多百度一下。
等待解析完成之后, 重新生成证书:
acme.sh --renew -d hello.mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
此外,如果是常见的 DNS 服务商,例如 cloudflare、dnspod、cloudxns、godaddy 和阿里云之类的,可以通过 acme.sh 的 dnsapi 实现自动证书更新。
certbot 方式
和 acme.sh 类似,certbot 也可以通过这种方式完成 DNS 的 SSL 证书申请。参考自 Using Certbot Manually for SSL certificates。
安装 certbot 后,输入下面命令开始进行 DNS chanllenge:
certbot certonly –manual -d hello.mydomain.com
然后一路跟着 prompt 提示,最后也要到 DNS 服务商处增加 TXT 记录,即可获得证书。
但是不好运的是,certbot 不支持阿里云的自动更新,sad。