全站 SSL 在 Google 等网站已经很常见了,一方面可以保护用户向网站提交的数据不被(或者不容易被)第三方窃取,另一方面也可以防止国内某些别有用心的无良运营商劫持会话乱插广告的行为(不知道的人还以为博主在博客里面乱放弹窗广告)。在网络环境日趋恶化,世风日下,人心不古的今天,这种措施是由其重要的。

背景知识:Mixed Content问题

所谓 Mixed Content, 就是 https 页面同时存在 http 和 https资源,某些浏览器默认会拒绝在 https 页面中显示这些“不安全”的 http 内容,就造成某些元素无法加载。Google Chrome会在地址栏做出提示 (如下图,一个带三角形的锁)。mixed_content

 

常用插件/统计服务的兼容

  • 多说:不兼容,会导致Mixed Content问题
  • Google 统计服务:兼容
  • cnzz 统计服务:兼容
  • Google 广告:兼容
  • WP-Touch:兼容

安装 OpenSSL

在 Linux 中,SSL 默认是没有安装的,我们需要在服务器进行以下步骤来配置 SSL 。如果你还没有一个 SSL 证书,你可以到诸如 GoDaddy, NameCheap 等地方去买一个。

yum install mod_ssl openssl

生成私钥。注意,现在很多证书颁发机构都不接受 1024Bit 的私钥了,所以一定要生成 2048Bit 的。

cd /etc/pki/tls
openssl genrsa -out server.key 2048

生成证书请求文件,然后将该文件下载到本地,把它的内容提交到购买 SSL 的网站上,通过认证之后,把收到邮件的附带的证书放到 xxx.crt 文件里面,上传回服务器中(记得上传的路径)。

openssl req -new -key server.key -out server.csr

然后在 Apache 的虚拟主机配置文件中加入一个新的配置文件,需要指定私钥(.key 文件)和证书(.crt 文件)的位置:

NameVirtualHost *:443
<VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile 
[证书的路径]/ca.crt SSLCertificateKeyFile /etc/pki/tls/server.key <Directory [网站目录]> AllowOverride All </Directory> DocumentRoot [网站目录] ServerName yoursite.com </VirtualHost>

记得要重启 Apache

/etc/init.d/httpd restart

添加防火墙例外

iptables -A INPUT -p tcp --dport 443 -j ACCEPT
/sbin/service iptables save
iptables -L -v

这时候应该可以访问 SSL 加密的网站了,如果不行,可以尝试重启 iptables:

service iptables restart

使用 SQL 语句更新数据库

由于启用了全站 SSL,而文章中的图片等资源还是使用的非加密的链接,所以就会导致 Mixed Content 的问题。我们可以按照 WordPress 换博客域名的思路,使用 SQL 语句批量更新文章中的链接。必须在安装 WordPress 的数据库中运行以下的SQL语句,在服务器层面运行是不行的。

更新文章中的链接:

UPDATE wp_posts SET post_content = REPLACE( post_content,  'https://worldtree.net',  'https://worldtree.net' )

更新设置中的链接:

UPDATE wp_options SET option_value = replace(option_value, 'https://worldtree.net', 'https://worldtree.net');

配置301跳转

以下内容来自 iEdon 的文章,该文章介绍了一种判断UA来实行分路301重定向的方法,这种方法对蜘蛛呈现 http 页面,而对普通用户呈现 https 页面。

# BEGIN WordPress
<IfModule mod_rewrite.c>
......
RewriteCond %{HTTP_USER_AGENT} !(baiduspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|robozilla|msnbot|bingbot|360spider|haosouspider|spider|bot) [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
......
# 上面部分要放在 WordPress 固定链接相关的 ReWrite 之前
</IfModule>
# END WordPress

检查主题/插件的设置

某些主题或者插件有自定义 Logo,图标等的功能,要记得更新这些自定义设置的链接,防止出现 Mixed Content。

参考资料

本文参考了以下网站的内容:

http://www.gegehost.com/2009/06/10/wordpress-domain/ [Last cited: 22-04-2015]

http://zww.me/archives/24644 [Last cited: 22-04-2015]

http://wiki.centos.org/zh/HowTos/Https [Last cited: 22-04-2015]

https://www.iedon.com/2015/04/05/430.html [Last cited: 22-04-2015]

http://www.chenxiaomo.com/modify-the-image-address.html [Last cited: 22-04-2015]