给站点配上 HTTPS:证书、混合内容和那个红色警告

米阳 2022-8-13 1 8/13

站点跑起来之后第一件事就是上 HTTPS。现在浏览器对 http 页面直接标“不安全”,搜索引擎也把 https 当排名因素。

拿证书

用免费证书就够了,90 天有效期。面板里一键申请,或者用 acme.sh:

curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue -d mi-blog.cn -d www.mi-blog.cn --webroot /www/wwwroot/mi-blog.cn

--webroot 方式会在网站根目录写验证文件,不占用 80 端口,比 standalone 模式安全——后者要临时停掉 Nginx。

配置 Nginx

server {
    listen 443 ssl http2;
    server_name mi-blog.cn;

    ssl_certificate     /path/fullchain.pem;
    ssl_certificate_key /path/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    add_header Strict-Transport-Security "max-age=31536000" always;
}

server {
    listen 80;
    server_name mi-blog.cn;
    return 301 https://$host$request_uri;
}

HSTS 那行要谨慎:一旦下发,浏览器会在有效期内强制 https,调试时想临时回退会很麻烦。确认 443 稳定了再加。

自动续期

~/.acme.sh/acme.sh --install-cert -d mi-blog.cn \
  --key-file       /www/server/panel/vhost/cert/mi-blog.cn/privkey.pem \
  --fullchain-file /www/server/panel/vhost/cert/mi-blog.cn/fullchain.pem \
  --reloadcmd      "nginx -s reload"

装完之后会有一个 cron 每天检查,到期前自动续。曾经忘了配这个,第 91 天全站证书过期,浏览器直接拦截,赶紧补上。

混合内容:最讨厌的问题

页面变 https 之后,正文里的图片还是 http://,浏览器会拦截或给警告。三处都要改:

UPDATE wp_options SET option_value = REPLACE(option_value,'http://mi-blog.cn','https://mi-blog.cn')
WHERE option_name IN ('siteurl','home');

UPDATE wp_posts SET post_content = REPLACE(post_content,'http://mi-blog.cn','https://mi-blog.cn') WHERE post_type='post';

还有主题设置、小工具里的图片地址存在 wp_postmeta,也要扫一遍。改完清缓存才生效。

检查清单

  • 首页、文章页、后台都无警告图标
  • 图片、CSS、JS 的请求全是 https
  • http 访问 301 跳到 https
  • 证书链完整(用 SSL Labs 测一下 A 以上)

整套做完大概一小时,之后基本不用管。唯一要记住的是续期,配好自动续期就不用记了。

- THE END -

米阳

8月13日20:25

最后修改:2022年8月13日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论