利用letsencrypt certbot获取HTTPS证书(DNS方式)
前天在阿里云上新开了一个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方式来访问了。