WordPress 博客启用 https 2018-10-30 / 70 次 / 快抢沙发 /

网站启用 https 是大势所趋。

本文是 AppX 系列中的一篇。AppX 系列是 @ifeegoo 个人移动互联网学习、工作和生活的提炼与总结的文章系列。更多内容请关注:
AppX @ifeegoo https://www.ifeegoo.com/appx.html

现在越来越多的浏览器会对网站是否启用 https 有更加严格的区分对待,最显而易见的没有启用 https 网站,会有如下显示:你的网站是不安全的。

your-connection-to-this-site-is-not-secure

接下来我们就为自己的 WordPress 博客启用 https。启用 https,首先需要 SSL 证书。这个有免费的,也有付费的。付费的也不是很贵,更有保障一些,所以我推荐购买付费的。当然,无论是付费还是免费,启用 https 的步骤都是一样的。

由于我的 WordPress 博客是用的是 CentOS 系统,我这边推荐大家去 www.appnode.com 购买 SSL 证书,同时你可以附带一起购买他们家的 Linux 服务器管理面板,对于新手来说,可视化的操作,非常方便。

appnode-website-overview

我们注册登录之后,去到 SSL 证书 -> 购买证书 -> 证书品牌:COMODO -> 证书系列:PositiveSSL -> 支持域名:单域名(如果你有多个域名就选择多域名) -> 购买时长:两年 -> 勾选同时购买 AppNode VIP 版序列号。一起总价才 240 元两年。

appnode-ssl-certificate-purchase

去到我的证书页面,上面显示你刚才购买的 SSL 证书状态:等待签发。

appnode-my-ssl-certificate

去到我的证书页面,上面显示你刚才购买的 SSL 证书状态:等待签发。点击 开始签发证书:订单类型 -> 全新签发,认证方式 -> 邮箱认证(也可以选择 HTTP 文件认证/DNS 认证)

appnode-ssl-certificate-request

主要看第三步:点击 CSR 生成工具,填写好相关的信息,没有打 * 的可以不用填写,注意:所有的地方请填写英文,中文可能会出现问题。我这边由于之前已经申请过了针对 ifeegoo.com(包含 www.ifeegoo.com)的证书,现在再次申请另外一个单个二级域名对应的 SSL 证书。

appnode-ssl-certificate-request-csr-build

填写好相关的信息之后,点击生成证书,会自动帮你填充请求数据,然后进入到下一步:生成证书。这个时候网站会自动的给你生成一个包含: api.ifeegoo.com.csr 和 api.ifeegoo.com.key 的两个文件的 zip 包,csr 文件是用来向证书机制请求证书的文件, .key 是自己保留的私钥文件。这两个文件自己都保存好!

appnode-ssl-certificate-request-csr-build-success

在生成证书页面,我们核对好相关的信息是否正确,然后填写好联系人信息,勾选上协议,然后点击提交申请即可!

appnode-ssl-certificate-comodo-request

注意:认证邮箱一定不能错,并且需要保证邮箱可以接收到邮件。之前我申请了一个针对 www.ifeegoo.com 域名的 SSL 证书,只需要填写 ifeegoo.com 就好,www.ifeegoo.com 是默认包含支持的。所以认证邮箱那一栏是生成的 admin@ifeegoo.com,我原本就配置了自己的域名邮箱(推荐大家使用 QQ 邮箱中的域名邮箱来配置)@ifeegoo.com,我只需要追加一个 admin 的用户就好了。这个地方系统默认生成诸如 admin@api.ifeegoo.com 的二级域名邮箱,也没有关系,可以通过免费的腾讯企业邮箱来配置你的二级域名邮箱,非常的方便,我之前尝试用 QQ 邮箱的域名邮箱来配置二级域名邮箱,一直都没有成功,但是通过腾讯企业邮箱一下子就配置成功了!

提交申请了之后我们可以看到你当前证书的进度处于:域名所有权验证中。

appnode-ssl-certificate-request-comodo-for-single-domain

证书官方会向需要验证的域名邮箱 admin@api.ifeegoo.com 邮箱发送一封邮件:

comodo-ssl-certificate-request-verification-email

我们复制好邮件中的校验码,点击 here 处的链接,输入校验码,点击 next,提示校验码输入成功,就 OK 了!

comodo-ssl-certificate-request-domain-control-validation

我们去到 AppNode 的后台,可以看到订单状态:签发成功。并且出现了下载证书的显示。

appnode-ssl-certificate-request-comodo-finished

注意:有的时候,证书签发机构 comodo 会单独发送一封包含以下四个证书文件的 .zip 包给你,那这个和在 AppNode 下载的这个单个的证书有什么区别呢?

api_ifeegoo_com.crt
COMODORSADomainValidationSecureServerCA.crt 
COMODORSAAddTrustCA.crt 
AddTrustExternalCARoot.crt 

AppNode 下载的这个单个的证书其实就是包含了以上四个证书的合成证书,如果你没有这个合成的证书,只有以上四个证书,我们可以在 CentOS 包含当前四个文件目录底下运用文件合成命令合成这个证书:

$ cat api_ifeegoo_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl.bundle.crt

请注意合成的顺序!我们得到重要的合成证书:ssl.bundle.crt 之后,准备好之前的 .csr 证书申请文件和私钥文件 .key。将这三个文件放到 /etc/ssl/private/ 目录底下:

appnode-ssl-certificate-info-folder

为了更安全考虑,我们通过在 /etc/ssl/private/ 目录底下用命令来生成一个 .pem 文件:

openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

接下来,我们要去 nginx 配置文件配置相关的参数,我们先来看看最终的一个配置,代码中高亮的部分是我新追加的,我们一个个来看下:

注意:我这里的例子是用我的博客主域名 www.ifeegoo.com 来演示的。

server {
    listen       80 default_server;
    server_name  _;
    return       404;
}

server {
    listen       80;
    server_name  ifeegoo.com;
    server_name  www.ifeegoo.com;
    rewrite      ^(.*)$ https://$host$1 permanent;
}

server {
      listen 443;
      ssl on;
      ssl_certificate            /etc/ssl/private/ssl.bundle.crt;
      ssl_certificate_key        /etc/ssl/private/ifeegoo.com.key;
      return 500;
}

server {
    listen                     80;
    listen                     443 ssl;
    server_name                ifeegoo.com;
    server_name                www.ifeegoo.com;
    root                       /var/www/ifeegoo.com/;
    index                      index.html index.htm index.php;
    keepalive_timeout          70;
    error_page                 502 /error_pages/502.html;
    error_page                 503 /error_pages/503.html;
    error_page                 504 /error_pages/504.html;
    error_page                 403 /error_pages/403.html;
    error_page                 404 /error_pages/404.html;
    error_page                 500 /error_pages/500.html;
    ssl                        on;
    ssl_certificate            /etc/ssl/private/ssl.bundle.crt;
    ssl_certificate_key        /etc/ssl/private/ifeegoo.com.key;
    ssl_ciphers                'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4';
    ssl_dhparam                /etc/ssl/private/dhparam.pem;
    ssl_prefer_server_ciphers  on;
    ssl_protocols              TLSv1.2 TLSv1.1 TLSv1;
    ssl_session_cache          shared:SSL:10m;
    ssl_session_timeout        10m;
    add_header                 Strict-Transport-Security max-age=31536000;
    add_header                 X-Content-Type-Options nosniff;
    rewrite                    ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;

    if (!-e $request_filename) {
        rewrite  ^.+?(/wp-.*) $1 last;
        rewrite  ^.+?(/.*\.php)$ $1 last;
        rewrite  ^ /index.php last;
    }

    location ~ ^/.+\.php {
        fastcgi_index            index.php;
        fastcgi_split_path_info  ^(.+\.php)(.*)$;
        fastcgi_param            SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param            PATH_INFO $fastcgi_path_info;
        fastcgi_param            QUERY_STRING $query_string;
        fastcgi_param            REQUEST_METHOD $request_method;
        fastcgi_param            CONTENT_TYPE $content_type;
        fastcgi_param            CONTENT_LENGTH $content_length;
        fastcgi_param            SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param            REQUEST_URI $request_uri;
        fastcgi_param            DOCUMENT_URI $document_uri;
        fastcgi_param            DOCUMENT_ROOT $document_root;
        fastcgi_param            SERVER_PROTOCOL $server_protocol;
        fastcgi_param            GATEWAY_INTERFACE CGI/1.1;
        fastcgi_param            SERVER_SOFTWARE nginx/$nginx_version;
        fastcgi_param            REMOTE_ADDR $remote_addr;
        fastcgi_param            REMOTE_PORT $remote_port;
        fastcgi_param            SERVER_ADDR $server_addr;
        fastcgi_param            SERVER_PORT $server_port;
        fastcgi_param            SERVER_NAME $server_name;
        fastcgi_param            REDIRECT_STATUS 200;
        fastcgi_param            PHP_VALUE open_basedir=$document_root:/tmp/:/proc/:/var/lib/php-fpm/;
        fastcgi_pass             127.0.0.1:9000;
    }

    location ~* \.(js|css|jpg|gif|png|bmp|swf)$ {
        expires  30d;
    }
}

我们先看看在原有的 server 上新追加的配置信息:

# 监听 443 SSL 端口
listen                     443 ssl;
# 设置超时
keepalive_timeout          70;
# 启用 SSL
ssl                        on;
# 配置 SSL 证书
ssl_certificate            /etc/ssl/private/ssl.bundle.crt;
# 配置 SSL 证书私钥
ssl_certificate_key        /etc/ssl/private/ifeegoo.com.key;
# 配置 SSL 证书加密算法
ssl_ciphers                'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4';
# 配置 dhparam
ssl_dhparam                /etc/ssl/private/dhparam.pem;
ssl_prefer_server_ciphers  on;
# 配置支持的加密协议
ssl_protocols              TLSv1.2 TLSv1.1 TLSv1;
# 配置 SSL Session 缓存
ssl_session_cache          shared:SSL:10m;
# 配置 SSL Session 超时
ssl_session_timeout        10m;
# 强制启用 https
add_header                 Strict-Transport-Security max-age=31536000;
add_header                 X-Content-Type-Options nosniff;

新追加的 server 的作用:

# 这个是将任何以 http 形式访问本站的链接跳转至 https 链接形式访问。
server {
    listen       80;
    server_name  ifeegoo.com;
    server_name  www.ifeegoo.com;
    rewrite      ^(.*)$ https://$host$1 permanent;
}

# 这个是禁止 https://IP 形式访问网站。
server {
      listen 443;
      ssl on;
      ssl_certificate            /etc/ssl/private/ssl.bundle.crt;
      ssl_certificate_key        /etc/ssl/private/ifeegoo.com.key;
      return 500;
}

注意:在你设置 将任何以 http 形式访问本站的链接跳转至 https 链接形式访问 之前,请先处理原有的基于域名 URL 访问的单独管理程序的 https 启用,比如我也安装了 AppNode Linux 面板管理程序,这个链接直接跳转到了 https 形式访问,由于之前并未在管理后台启用 https 访问,就导致 https 链接的形式无法访问,我们在后台启用 https 形式访问,配置相关证书即可。

wordpress-settings-https-url

配置好了 nginx 相关参数之后,我们重启 nginx 服务,然后在 WordPress 后台设置中,将你的博客主页 URL,由原来的 http 修改成 https,就会发现可以以 https 形式访问自己的 WordPress 博客了,并且任何 http 的链接访问也跳转到了 https,IP 地址也禁止访问了!

personal-blog-ifeegoo-enable-https

有时候你会发现虽然你的网站配置了 https 访问,浏览器还是提醒你:You connection to this site is not fully secure,这个网站的链接并不是全部安全的!这个时候,一般来说是你原来 WordPress 内部的 http 链接没有转换成 https,我们可以在 WordPress 管理后台:外观 -> 编辑 -> 模板函数的顶部,追加以下代码片段:

<?php
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");
	}
}

如果你发现以上操作之后,浏览器上还是会对你当前访问的页面有感叹号提示,我们就要针对单个页面排查,最简单的方式就是通过浏览器查看当前页面的源码,直接搜索 http://,当然这种方法不一定能够找到深层嵌套的 http 访问,如果这个找不到,我们可以通过全局的文件搜索关键词,如果还找不到,就通过关联内容来查找,确认当前页面是否有加载 http 的内容。我这边就遇到了一个很坑的问题:我的博客主题中有一个地方通过 JavaScript 调用载入了一个 http 链接的图片,网页中可以看到确实载入了这个 http 链接的图片,但是我从网站全局查找就是没有发现这个 http 的地方,后来才看到这段 JavaScript 代码被加密了,通过解密终于看到了相关的链接,找到对应的位置,将加密之后对应的 http 链接位置删除或者替换掉,整个网站通过 Chrome 浏览器 https 访问,就显示一个正常锁的图标!通过 FireFox 浏览器 https 访问,显示的是一个绿色的锁!大功告成!

Tips:网站文本内容中包含 http://,并不影响,因为这个 http:// 的文本,并没有真正去加载!

personal-blog-wordpress-https-enable-firefox-status

再次温馨提醒,请自行保存好: 证书申请文件 + 证书私钥文件 + 合并之后的总证书文件。

打赏
本博客所有文章如无特别注明均为原创。复制或转载请以超链接形式注明转自ifeegoo 的个人博客,原文地址《WordPress 博客启用 https
上一篇: « 下一篇: »
暂无相关文章

> 添加新评论

Copyright © ifeegoo 的个人博客 Time is limited, less is more! / 粤ICP备15109713号-1 / Theme by Hang & Ben / WordPress / 知识共享许可协议