前几天,无意中用谷歌访问我的博客,发现地址栏有个“不安全”标志,我知道是http浏览模式导致的,但心里就是不舒服,于是决定把全站启用https浏览模式,过程分享如下。
搭建环境:win2008+nginx+mysql
第一步:申请SSL证书
现在可以申请SSL证书的网站很多,但是个人建议用阿里云,速度快,基本30分钟搞定。
流程:在阿里云控制台-产品与服务-安全(云盾)-CA证书服务(数据安全),点击购买证书。购买过程按照阿里云提示一步步进行即可,因为申请的是开发版免费证书,所以一个证书仅支持一个域名认证,不支持通配符。
第二步:安装证书以及配置NGINX
解压申请好的证书包,会有两个文件,一个.pem文件,一个是.key文件。
1)进入nginx的安装目录,增加cert文件夹,把刚刚下载的两个文件上传到cert文件夹中。
2)打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,写入如下代码。
server {
listen 80; 方法一:适应于http和https共存
listen 443 ssl; 方法一:适应于http和https共存
listen 443 ; 方法二:只允许https
ssl on; 方法二:只允许https
server_name liuzhiqiang.net alias www.liuzhiqiang.net;
ssl_certificate 盘符:/路径/Nginx/cert/文件名.pem;
ssl_certificate_key 盘符:/路径/Nginx/cert/文件名.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
......
}
}
网上有的是相对路径,但是实测,一定要绝对路径才行。
这里一定要注意,如果服务器有多个网站,部分需要用80访问,个别的用https访问,那一定要用方法一,并把方法二的代码删除。同理,如果服务器网站都用https访问,就用方法二,把方法一的代码删除。
配置完毕后,重启nginx,做一个单纯的静态页面,测试一下,如果出现绿色小锁,证明证书配置没有问题。效果如下图。
↓
第三步:设置禁止未绑定的域名访问80和443端口
server { listen 80 default_server; server_name _; return 444; } #上面是禁止80的 server { listen 443 default_server; server_name _ ; ssl_certificate 盘符:/路径/Nginx/cert/文件名.pem; ssl_certificate_key 盘符:/路径/Nginx/cert/文件名.key; return 444; } #此段是禁止443的
禁止未绑定的域名访问443,这块最坑,你不能想当然跟禁止80端口设置的一样,一定要给弄个证书,自己去网上随便生成一个,或者就用自己那个证书也行。顺便说下,这块我折腾时间最长,网上有很多教程都是错误的,比如下图坚决不能开启ssl on;(也许80和443不共存是正确的)。
第四步:wordpress开启https
方法一:传统方式将 WordPress 开启整站 HTTPS 协议,一共两步。
1)登录和后台强制开启 SSL,可以通过修改 wp-config.php 文件,直接在文件末尾加入以下两行代码:
define('FORCE_SSL_LOGIN', true); define('FORCE_SSL_ADMIN', true);
或者在确认 WordPress 站点已经开启 https 协议并可以通过 https 访问,那么可以直接登陆后台,通过“设置”中“常规”里面把“WordPress 地址(URL)”、“站点地址(URL)”两个地址的 http 修改为 https 并保存。
2)修改mysql数据库,把数据库中所有http://的地址都改成https://,命令如下:
update 表名 set 字段名 = replace(字段名,'旧网址','新网址')
不过上述方法要直接修改数据库,对于Mysql数据库命令不熟悉的朋友,个人不推荐,搞不好网站直接被毁也是可能的。
方法二:编辑当前主题下的 functions.php 文件,加入以下代码的任意一种:
代码一:HTTPS 绝对链接替换
add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
if( is_ssl() ){
function fanly_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;
}
ob_start("fanly_ssl_main");
}
} |
代码二:HTTPS 相对链接替换
add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
if( is_ssl() ){
function fanly_ssl_main ($content){
$siteurl = get_option('siteurl');
$upload_dir = wp_upload_dir();
$content = str_replace( 'http:'.strstr($siteurl, '//'), strstr($siteurl, '//'), $content);
$content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), strstr($upload_dir['baseurl'], '//'), $content);
return $content;
}
ob_start("fanly_ssl_main");
}
} |
到这里其实基本完工了,不过在检查网站的时候发现一个小问题,就是百度分享不能用了,原因是因为百度不支持https,解决办法如下
代码点击下载,解压得到static文件夹(解压密码:liuzhiqiang.net),上传到网站根目录,把调用百度分享js里边的http://bdimg.share.baidu.com改成https://你得网站。
window._bd_share_config = {
"common": {
"bdSnsKey": {},
"bdText": "",
"bdMini": "2",
"bdMiniList": false,
"bdPic": "",
"bdStyle": "1",
"bdSize": "16"
},
"share": {
"bdSize": 16
}
};
with(document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~ ( - new Date() / 36e5)];
最后别忘了做301永久指向
if ($scheme = http) { return 301 https://$host$request_uri; }
至此应该说大功告成了,效果如下↓
如果在浏览器打开地址栏,未显示绿色小锁图标,那么说明你的网站加载了非SSL引入的资源,比如调用了http://的图片,js等等,请仔细排查。
总结:其实对于个人网站开启https没什么意义,因为增加一个验证证书的环节,反而会导致网页打开变慢,而且部分cdn服务商对https加速是收费的,但是没办法大势所趋,不过我是一个完美主义者,浏览器前面的绿色小锁看着让人还是蛮舒服的。