一、问题

一个通过 Let's Encrypt 配置SSL证书的站点出现了 https 访问错误,chrome 拦截信息为:

因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复...

该服务器配置了多站点 https ,其中只有一个站点出现了该错误。

服务器基本配置信息如下:

  • oneinstack 配置的 php 运行环境
  • nginx 代理 apache

首先我想到的问题是证书自动续费,因此我强制进行了 renew,强制更新及自动续期参照我之前的文章:

发现没什么用,续期是没有问题,都是 success,但是站点访问依旧存在问题。

二、解决

在解决上述问题的时候,我看了这篇文章:

这篇文章是介绍如何使用 Let's Encrypt 配置 SSL 证书的,没有提到我上面出现的这种情况。

不过我发现了一个有趣的问题:

oneinstack 在使用 let's encrypt 配置证书的时候,还是生成了 crt 和 key 两个文件,并没有使用 pem

关于不同文件后缀的区别,请参照:

因此我怀疑是我的 crtkey 文件出现了错误,因此,我直接参考 老左 的方式,在 nginx 和 apache 的配置中使用了 pem 文件,而不是 crt 和 key ,没想到竟然成功了。。。

贴一下前后 nginx 配置的不同(只包含ssl部分):

之前 oneinstack 自动配置的部分内容(crt 和 key):

    ssl_certificate /usr/local/nginx/conf/ssl/demo.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/demo.com.key;

更改之后采用 pem 进行配置:

    ssl_certificate /etc/letsencrypt/live/demo.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/demo.com/privkey.pem;

apache 的配置也需要更改,同样的只是将这两个文件路径分别换掉。

更改之后重启 apache 和 nginx 即可。

Let's Encrypt 生成的 pem 文件默认是存放在 /etc/letsencrypt/live/ 中的,里面有不同的域名代表的文件夹,使用 fullchain.pemprivkey.pem 即可。

三、后续

经过验证,确实发现,之前的 crt 和 key 文件是出现了问题,但是问题原因我并不是很清楚,但是将 crt 和 key 直接换成 pem 之后没有任何的问题。