wordpress站升级HTTPS


现在越来越多的网站服务要求https,比如百度收录,微信小程序等等。今天抽空把博客升级了下,把过程记录下来,主要有这么几步:

  1. 准备ssl证书
  2. 设置证书自动续期
  3. 配置nginx或者apache支持https
  4. 更新wordpress配置和内链
  5. 重定向http到https
  6. 测试SSL支持

一、准备ssl证书

现在基本上都是用的Let’s Encrypt免费证书,虽然只有90天有效期,但是续期很方便。官方给出的工具之一是开源软件certbot,支持基于ssh的平台(mac,linux)。

1.1 下载certbot

1
git clone https://github.com/certbot/certbot

1.2 申请证书

1
2
3
cd certbot
# 命令格式如下,举个栗子
./letsencrypt-auto --nginx certonly -d www.chaoswork.cn -d chaoswork.cn

运行后会自动安装和升级依赖,并安装ssl证书。
需要注意一下几个问题:

  1. 该工具主要由python编写,通过pip包管理工具下载各种组件。pip默认源为国外地址,可能导致下载失败,所以最好切换为国内源。切换pip源
  2. 配置certonly,只下载安装证书,需要自己配置nginx或apache等http服务;如果不配置certonly,certbot会自动更新nginx配置ssl。
  3. 若不指定--nginx, certbot会提示用户选择nginx或者apache或其他http服务,并自动搜索配置文件;若报错找不到nginx或apache配置,则可以手动指定,对于nginx,指定的选项为:--nginx-server-root=/path/to/nginx/conf

运行完成后会生成四个证书文件:

1
2
3
4
/etc/letsencrypt/live/www.chaoswork.cn/fullchain.pem
/etc/letsencrypt/live/www.chaoswork.cn/privkey.pem
/etc/letsencrypt/live/www.chaoswork.cn/cert.pem
/etc/letsencrypt/live/www.chaoswork.cn/chain.pem

实际上,我们用两个证书文件就行了,一个是带私钥的文件,一个是带公钥的文件。

2. 设置证书自动续期

证书续期很简单,certbot自带功能。证书快到期后,到certbot源码目录下执行:

1
./certbot-auto renew --post-hook "systemctl reload nginx"

执行成功后证书就自动更新了, 并且会自动更新nginx配置并重启nginx。

要设置自动更新,可以利用linux中的cron服务。cron是linux自带的定时任务程序。对于certbot,配置cron job,每两个月的第一天执行证书续期任务:

1
2
#minute hour day month day_of_week    command
0 0 1 */2 * /letsencrypt/certbot-auto renew --post-hook "systemctl reload nginx"

【注意】: cron job里面需要用绝对路径。

3. 配置nginx或者apache支持https

直接以一个例子来说明,可以将其中ssl部分拷贝过去,并更改证书路径就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80 default; #默认监听80的HTTP端口;
listen 443 ssl; #确保Nginx监听HTTPS的443端口

# SSL证书配置
ssl_certificate /etc/letsencrypt/live/www.chaoswork.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.chaoswork.cn/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

root /alidata/www/myblog;
index index.html index.htm;

server_name chaoswork.cn www.chaoswork.cn;
}

【注意】:为了安全性,只使用TLS协议,包括TLSv1.0,TLSv1.1,TLSv1.2,禁止 SSL 协议。

配置后重启nginx,wordpress应该就可以同时通过https和http访问了,但是还有些工作要做。

4. 更新wordpress配置和内链

4.1 修改wordpress后台配置中的地址改为https版本。

wordpress后台配置https
通过上面的设置,绝大部分导航中的链接就由wordpress系统自动改为HTTPS版本。对于正文中的内部链接还需要手工修改。

4.2 修改内链地址。一般有两种方法:

  • 直接更新数据库。
    1
    update wp_posts set post_content = replace(post_content, "http://www.chaoswork.cn/","https://www.chaoswork.cn/")
  • 利用wordpress提供的api来重写链接。在使用的主题(themes)的目录下的 function.php加入如下代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //转换http为https
    function change_ssl_main ($content){
    $siteurl = get_option("siteurl");
    $upload_dir = wp_upload_dir();
    $content = str_replace( "http:".strstr($siteurl, "//"), "https:".strstr($siteurl, "//"), $content);
    $content = str_replace( "http:".strstr($upload_dir["baseurl"], "//"), "https:".strstr($upload_dir["baseurl"], "//"), $content);
    return $content;
    }
    function change_ssl(){
    if(is_ssl()){
    ob_start("change_ssl_main");
    }
    }
    add_filter("get_header", "change_ssl");
    修改完了,可以在检查下源码如php,html,js,css等文件中,是否还有本站的http连接,再修改过来。

5. 重定向http到https

一切都修改完了,http就可以永久重定向到https了。nginx重定向有多种写法,举例如下:

  1. 使用rewrite指令:
    1
    2
    3
    4
    # rewrite写法
    if ($scheme = http ) {
    rewrite ^(.*)$ https://$host$1 permanent;
    }
  2. 使用return指令:
    1
    2
    3
    4
    # rewrite写法
    if ($scheme = http ) {
    return 301 https://$host$request_uri;
    }
    对于重定向,推荐用return写法,性能比rewrite更优。

6. 测试SSL支持

证书配置好了,我们可以利用一些第三方网站测试下自己网站的SSL支持情况。一个比较好的网站是:
SSL Server Test
支持程度达到B以上就可以了。