现在越来越多的网站服务要求https,比如百度收录,微信小程序等等。今天抽空把博客升级了下,把过程记录下来,主要有这么几步:
- 准备ssl证书
- 设置证书自动续期
- 配置nginx或者apache支持https
- 更新wordpress配置和内链
- 重定向http到https
- 测试SSL支持
一、准备ssl证书
现在基本上都是用的Let’s Encrypt免费证书,虽然只有90天有效期,但是续期很方便。官方给出的工具之一是开源软件certbot,支持基于ssh的平台(mac,linux)。
1.1 下载certbot
1 | git clone https://github.com/certbot/certbot |
1.2 申请证书
1 | cd certbot |
运行后会自动安装和升级依赖,并安装ssl证书。
需要注意一下几个问题:
- 该工具主要由python编写,通过pip包管理工具下载各种组件。pip默认源为国外地址,可能导致下载失败,所以最好切换为国内源。切换pip源
- 配置
certonly
,只下载安装证书,需要自己配置nginx或apache等http服务;如果不配置certonly
,certbot会自动更新nginx配置ssl。 - 若不指定
--nginx
, certbot会提示用户选择nginx或者apache或其他http服务,并自动搜索配置文件;若报错找不到nginx或apache配置,则可以手动指定,对于nginx,指定的选项为:--nginx-server-root=/path/to/nginx/conf
。
运行完成后会生成四个证书文件:
1 | /etc/letsencrypt/live/www.chaoswork.cn/fullchain.pem |
实际上,我们用两个证书文件就行了,一个是带私钥的文件,一个是带公钥的文件。
2. 设置证书自动续期
证书续期很简单,certbot自带功能。证书快到期后,到certbot源码目录下执行:
1 | ./certbot-auto renew --post-hook "systemctl reload nginx" |
执行成功后证书就自动更新了, 并且会自动更新nginx配置并重启nginx。
要设置自动更新,可以利用linux中的cron服务。cron是linux自带的定时任务程序。对于certbot,配置cron job,每两个月的第一天执行证书续期任务:
1 | #minute hour day month day_of_week command |
【注意】: cron job里面需要用绝对路径。
3. 配置nginx或者apache支持https
直接以一个例子来说明,可以将其中ssl部分拷贝过去,并更改证书路径就可以了。
1 | server { |
【注意】:为了安全性,只使用TLS协议,包括TLSv1.0,TLSv1.1,TLSv1.2,禁止 SSL 协议。
配置后重启nginx,wordpress应该就可以同时通过https和http访问了,但是还有些工作要做。
4. 更新wordpress配置和内链
4.1 修改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加入如下代码:修改完了,可以在检查下源码如php,html,js,css等文件中,是否还有本站的http连接,再修改过来。
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");
5. 重定向http到https
一切都修改完了,http就可以永久重定向到https了。nginx重定向有多种写法,举例如下:
- 使用rewrite指令:
1
2
3
4# rewrite写法
if ($scheme = http ) {
rewrite ^(.*)$ https://$host$1 permanent;
} - 使用return指令:对于重定向,推荐用return写法,性能比rewrite更优。
1
2
3
4# rewrite写法
if ($scheme = http ) {
return 301 https://$host$request_uri;
}
6. 测试SSL支持
证书配置好了,我们可以利用一些第三方网站测试下自己网站的SSL支持情况。一个比较好的网站是:
SSL Server Test。
支持程度达到B以上就可以了。