网站启用 https 是大势所趋。
AppX @ifeegoo https://www.ifeegoo.com/appx.html。
现在越来越多的浏览器会对网站是否启用 https 有更加严格的区分对待,最显而易见的没有启用 https 网站,会有如下显示:你的网站是不安全的。
接下来我们就为自己的 WordPress 博客启用 https。启用 https,首先需要 SSL 证书。这个有免费的,也有付费的。付费的也不是很贵,更有保障一些,所以我推荐购买付费的。当然,无论是付费还是免费,启用 https 的步骤都是一样的。
备注:另外目前腾讯云里面可以申请免费的 SSL 证书,可以使用一年的,也不错。大家可以去试试看!
由于我的 WordPress 博客是用的是 CentOS 系统,我这边推荐大家去 www.appnode.com 购买 SSL 证书,同时你可以附带一起购买他们家的 Linux 服务器管理面板,对于新手来说,可视化的操作,非常方便。
我们注册登录之后,去到 SSL 证书 -> 购买证书 -> 证书品牌:COMODO -> 证书系列:PositiveSSL -> 支持域名:单域名(如果你有多个域名就选择多域名) -> 购买时长:两年 -> 勾选同时购买 AppNode VIP 版序列号。一起总价才 240 元两年。
去到我的证书页面,上面显示你刚才购买的 SSL 证书状态:等待签发。
去到我的证书页面,上面显示你刚才购买的 SSL 证书状态:等待签发。点击 开始签发证书:订单类型 -> 全新签发,认证方式 -> 邮箱认证(也可以选择 HTTP 文件认证/DNS 认证)
主要看第三步:点击 CSR 生成工具,填写好相关的信息,没有打 * 的可以不用填写,注意:所有的地方请填写英文,中文可能会出现问题。我这边由于之前已经申请过了针对 ifeegoo.com(包含 www.ifeegoo.com)的证书,现在再次申请另外一个单个二级域名对应的 SSL 证书。
填写好相关的信息之后,点击生成证书,会自动帮你填充请求数据,然后进入到下一步:生成证书。这个时候网站会自动的给你生成一个包含: api.ifeegoo.com.csr 和 api.ifeegoo.com.key 的两个文件的 zip 包,csr 文件是用来向证书机制请求证书的文件, .key 是自己保留的私钥文件。这两个文件自己都保存好!
在生成证书页面,我们核对好相关的信息是否正确,然后填写好联系人信息,勾选上协议,然后点击提交申请即可!
注意:认证邮箱一定不能错,并且需要保证邮箱可以接收到邮件。之前我申请了一个针对 www.ifeegoo.com 域名的 SSL 证书,只需要填写 ifeegoo.com 就好,www.ifeegoo.com 是默认包含支持的。所以认证邮箱那一栏是生成的 admin@ifeegoo.com,我原本就配置了自己的域名邮箱(推荐大家使用 QQ 邮箱中的域名邮箱来配置)@ifeegoo.com,我只需要追加一个 admin 的用户就好了。这个地方系统默认生成诸如 admin@api.ifeegoo.com 的二级域名邮箱,也没有关系,可以通过免费的腾讯企业邮箱来配置你的二级域名邮箱,非常的方便,我之前尝试用 QQ 邮箱的域名邮箱来配置二级域名邮箱,一直都没有成功,但是通过腾讯企业邮箱一下子就配置成功了!
提交申请了之后我们可以看到你当前证书的进度处于:域名所有权验证中。
证书官方会向需要验证的域名邮箱 admin@api.ifeegoo.com 邮箱发送一封邮件:
我们复制好邮件中的校验码,点击 here 处的链接,输入校验码,点击 next,提示校验码输入成功,就 OK 了!
我们去到 AppNode 的后台,可以看到订单状态:签发成功。并且出现了下载证书的显示。
注意:有的时候,证书签发机构 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 证书,这个 ssl.bundle.crt 文件就不用你手动合并了,直接就给你准备好了!
请注意合成的顺序!我们得到重要的合成证书:ssl.bundle.crt 之后,准备好之前的 .csr 证书申请文件和私钥文件 .key。将这三个文件放到 /etc/ssl/private/ 目录底下:
为了更安全考虑,我们通过在 /etc/ssl/private/ 目录底下用命令来生成一个 .pem 文件:
openssl dhparam -out /etc/ssl/private/dhparam.pem 2048
接下来,我们要去 Nginx 配置文件配置相关的参数,我们先来看看最终的一个配置,代码中高亮的部分是我新追加的,我们一个个来看下:
一般情况下,我们可以通过 locate nginx.conf 命令来查找相关的 Nginx 配置文件,不在这个文件中,也是会在相关的目录底下的。
[root@VM_43_216_centos nginx]# locate nginx.conf /etc/nginx/nginx.conf
注意:我这里的例子是用我的博客主域名 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 形式访问,配置相关证书即可。
配置好了 nginx 相关参数之后,我们重启 nginx 服务,然后在 WordPress 后台设置中,将你的博客主页 URL,由原来的 http 修改成 https,就会发现可以以 https 形式访问自己的 WordPress 博客了,并且任何 http 的链接访问也跳转到了 https,IP 地址也禁止访问了!
有时候你会发现虽然你的网站配置了 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:// 的文本,并没有真正去加载!
再次温馨提醒,请自行保存好: 证书申请文件 + 证书私钥文件 + 合并之后的总证书文件。
上一篇: « 如何选择个人博客? 下一篇: Linux 服务器之 CentOS 运维 Tips »