Let’s Encrypt/HTTPS配置记录

前几天收到Let’s Encrypt public beta的邮件,所以就尝试了下ssl+https+http/2。

Let’s Encrypt 配置

首先,我之前遇到过Error creating new authz 的错误,就一直没有尝试,后来发现v2ex上有人通过设置NS记录解决了问题(虽然文中说要设置MX记录,但是我只更换了NS记录到CloudFlare),生效时间可能是24h。

不过由于cf会友好地将所有流量切换到它的反代服务器,所以需要关闭此特性;另外,也需要关闭cf中HTTPS的开关,由自己的主机来处理HTTPS请求(所以我仅仅是将cf作为一个DNS服务器而已)。

另外有一个坑:由于我用的是nginx,letsencrypt这个客户端程序需要自己接受80端口的请求来验证服务器身份,所以需要临时关闭nginx。

最后开始生成服务器证书:

第一步:将letsencrypt项目clone到特定目录下:

git clone https://github.com/letsencrypt/letsencrypt.git /opt/letsencrypt

第二步:cd到该目录,然后执行如下命令生成证书:

./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory certonly

依次填写邮箱、域名后,会在 /etc/letsencrypt/live/<domain>/ 目录下生成证书(nginx只用到fullchain.pem和privkey.pem)

注:此命令一定要添加–server选项,否则生成的证书并不被浏览器信任。

证书都已经生成,接下来配置nginx。

nginx配置

注:如果要开HTTP/2的话,就必须要添加nginx mainline的repo了:

[nginx]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

首先,我们必须再添加https的server,基本上就是listen配置变为listen 443 ssl http2;(顺便打开HTTP/2)。

至于证书路径,添加两个配置:

ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;

为了开启HSTS,请添加如下选项:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

另外,不要忘记在http站点的配置中添加到https站点的跳转:

location / {
	return 301 https://$server_name$request_uri;
}

好,至此为止,nginx部分完成。如果在这个时候你打开网站,会发现仍然有很多资源是走的http,很多浏览器都会对此进行警告。这就需要我们在WordPress上进行配置了。

WordPress配置

注:此段主要参考自https://css-tricks.com/moving-to-https-on-wordpress/

首先,在首页生成的文章列表,会受到site address影响,所以必须修改此选项,既将图中的两个都改为https:

general-settings

此外,还有三个SQL用来修改现有文章中的http链接引用:

替换双引号的图片链接:

UPDATE wp_posts 
SET    post_content = ( Replace (post_content, 'src="http://', 'src="//') )
WHERE  Instr(post_content, 'jpeg') > 0 
        OR Instr(post_content, 'jpg') > 0 
        OR Instr(post_content, 'gif') > 0 
        OR Instr(post_content, 'png') > 0;

替换单引号的图片链接:

UPDATE wp_posts 
SET    post_content = ( Replace (post_content, "src='http://", "src='//") )
WHERE  Instr(post_content, 'jpeg') > 0 
        OR Instr(post_content, 'jpg') > 0 
        OR Instr(post_content, 'gif') > 0 
        OR Instr(post_content, 'png') > 0;

替换iframe的链接:

UPDATE wp_postmeta 
SET meta_value=(REPLACE (meta_value, 'iframe src="http://','iframe src="//'));

剩下的事情就是看浏览器的console中有没有其他资源引用了http资源,比如我的blog就是因为之前的fedora release counter导致请求http页面了。

Leave a Reply

Your email address will not be published. Required fields are marked *

98 − 97 =