伟明部落格

利用letsencrypt certbot获取HTTPS证书(DNS方式)

--发布于 2022-04-28 09:07:28

前天在阿里云上新开了一个OSS的Bucket,把之前的图片都转存过去了。想着测试一下的时候,输入图片的网址,一键Enter,傻眼了。之前是直接在浏览器中显示图片的,现在的是直接下载了。我还是想要回之前显示图片的效果啊。

之后,查了一下阿里云OSS的文档,说:为了安全性,现在新开的Bucket打开图片链接默认操作是下载图片,而不是之前的预览图片,要预览图片的话,需要绑定自己的域名。

于是乎,就将自己的一个域名CNAME到OSS的外网链接那里去,然后通过自己的域名访问OSS的图片,就可以直接显示了,而不了下载了。

原以为事情就这么结束了,但是我将那张图片的链接放到一个网页那里的时候,用Chrome浏览器打开网页的时候,图片竟然加载不出来了。

看了报错,明白了。我的网页是https的,而用自定义域名加载OSS图片的协议是http的,然后Chrome浏览器就自动将协议从http升级为https,而我的自定义域名没有证书,是不支持https的,导致加载不出来,报错net::ERR_CERT_COMMON_NAME_INVALID。那就尴尬了!

进入正题

看来需要给那个域名配备https证书了,但我现在的域名CNAME到阿里云OSS服务器上了,不是指向我的服务器,那就不能用Http Challenge了(这些Challenge是为了确保你是域名的所有者)。想起以前曾经用过DNS Challenge,主要针对服务器不受自己控制的场景。上网查了一翻,用certbot进行DNS Challenge获取证书的命令如下

certbot -d <你的域名> --manual --preferred-challenges dns certonly

然后会输出

意思就是叫你新开一个_acme-challenge.xfile-1.example.com的DNS TXT记录,将记录值填写为XWXw开头的那串字符串,确保DNS TXT记录生效后才按Enter键。于是,在DNSPOD上按照它的要求填写

再用dig命令检查DNS TXT记录,发现立即生效了,返回之前那个certbot命令那里痛快地按下Enter键,输出了一串信息,说生成了公钥和私钥了。

cd到那个密钥文件的目录去看一下,发现有4个pem文件

[root@vultr]# ls
cert.pem  chain.pem  fullchain.pem  privkey.pem  README

在那个README文件中有说各个文件的用途

`privkey.pem`  : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem`    : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem`     : will break many server configurations, and should not be used
                 without reading further documentation (see link below).

中文
| 文件名           | 文件作用   |
| ----            | ----     | 
|cert.pem         | 服务端证书 |
|chain.pem        | 浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书|
|fullchain.pem    | 包括了cert.pem和chain.pem的内容 |
|privkey.pem      | 证书的私钥 |

然后打开阿里云OSS的管理后台,选择应用的Bucket => 传输管理 => 域名管理 => 证书托管,选择【自定义上传】那一part。

然后将fullchain.pem的内容复制到上面对话框的【公钥】部分,将privkey.pem的内容复制到【私钥】部分,再点击上传。在OSS管理的页面,查看一下证书详情

配置完成,自定义OSS域名就可以通过https方式来访问了。

--更新于 2023-03-09 10:51:41