discuz x3.2 启动SSL

这是一篇别的地方看到的文章,把所有需要修改的地方都说了,很有借鉴意义,这里就转载过来做个记录

————————————————————————————————————————————–

Discuz! X3.2 本身对 HTTPS 的支持很有限,程序本身支持,但还有很多地方需要调整和修改的。
站点全部链接默认 HTTPS ,无任何 HTTP 链接通过 301 跳转到 HTTPS 。 浏览器显示绿色安全标志,无“不安全内容”提示。

具体来说,我们需要从以下 6 个方面来实现我们最终的效果。

服务器前端程序的配置
一般来说,大家多使用 Nginx 作为前端程序,关于 Nginx 开启 HTTPS 的教程,网上有很多教程,可以参考这篇文章:

https://aotu.io/notes/2016/08/16/nginx-https/
Discuz 判断服务器是否使用 SSL 的修补和完善
 Discuz 判断服务器是否使用 SSL 的代码不适合 Nginx+CGI 的情况,即 PHP-FPM 。这个时候我们需要修改以下文件:
 Discuz 采用 $_SERVER[‘ HTTPS ’] 的方式来判断 SSL ,但是因为服务器 架构问题( nginx+php-fpm ),无法采用这种方式识别,所以需要对 Discuz 程序进行一些调整(使用 $_SERVER[‘ SERVER_PORT ’] 来判断)。 source/class/discuz/discuz_application.php (约第 187 行处): 查找:
 $_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
 修改为:
 $_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
uc_server/avatar.php (约第 13 行处):
 查找:
 define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
 修改为:
 define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443

除去非 HTTPS 内容避免提示”不安全内容“
Source/plugin/manyou/Service/DiscuzTips.php ,最后的那段 JS 加载脚本删除就行。
非楼主层如果有点评,那么点评者头像不是 HTTPS 开头,也需要修改一个文件来适配: template/default/forum/viewthread_node_body.htm (约 180 行),搜索 div class=”psta vm”>,将下面一行注释掉或者删除。
打开浏览器,使用开发者工具或者查看源码逐一排查加载的非 HTTPS 资源并修改。

后台设置的修改完善
在后台还有一些设置,可能会干扰 https 的使用
后台 >全局 > 站点 URL ,改为 https 开头的
后台 > 站长 > UCenter 设置 > UCenter 访问地址,修改为 https 开头的
UCenter 后台 > 应用管理 > 应用的主 URL ,修改为 https 开头。修改后可能会显示通讯失败,如果 UC 和论坛程序安装在同一机器,此失败可无视,实测可以和 UC 正常通讯不影响(测试是否正常通讯程序的 Bug ),如果 UC 和论坛程序不在一台机器上,有可能不能通讯。 另外在 后台 > 全局 > 域名设置 中的一些设置也可能使 https 失效,如果更新缓存后论坛默认连接还是 HTTP ,请删除 后台 > 全局 > 域名设置 > 应用域名 > 默认 里面的默认域名(一般去 forum.php 尾巴这里会有内容,为了 HTTPS 请删除)。

模板的调整
主要在模板的 foot.html 以及 header.html 等文件中,使用工具逐一排查模板文件中写死的 HTTP 链接,修改为 HTTPS 。

数据库的调整
在论坛这种交互社区中,经常回复发帖时会有出现主域名的链接,在没有 HTTPS 之前,链接都是 HTTP 开头,这个时候,我们需要修改数据库,运行下面的 mysql 命令更新数据库,将 HTTP 替换为 HTTPS :
进入 DZ 后台:站长 – 数据库 – 升级

UPDATE pre_forum_post SET message=REPLACE(message,’http://www.repaik.com‘,’https://www.repaik.com‘);
请将 www.repaik.com 替换为自己的域名

需要注意的是,出于安全考虑, Discuz 后台默认情况下禁止 SQL 语句直接执行,只能使用常用 SQL 当中的内容,如果想自己随意书写 SQL 升级语句,需要将程序文件 config/config_global.php 当中的$_config[admincp][runquery] 设置修改为 1 。

Nginx 安装SSL 以及其中的一些安全问题

以前都是图省事,直接使用cpanel 安装SSL,确实简单方便。现在除了两个server还在使用WHM 以外,其余的已经全部使用LNMP 架构了。

今天下午直接在nginx安装SSL,安装倒不麻烦,麻烦的是安装完成以后的安全隐患。

Nginx 在配置中就需要两个文件,一个是private key,这个是在生成CSR的时候一起生成的;另外一个是certification,这个就需要用生成的CSR 去一些SSL 服务商请求certificate

大概流程:

  1. 在服务器上使用Openssl 或者网上的一些工具,生成CSR 以及private Key. 建议使用在线工具直接生成2048 bits 的CSR 和 Private key,可以使用如下两个网站.

 

https://www.digicert.com/easy-csr/openssl.htm

https://www.thesslstore.com/ssltools/csr-generator.php

 

    2. 找一个txt 文档保存好CSR 以及private key

    3. 用生成的CSR 去SSL 服务商那里请求证书,这里建议使用rapidssl,来自于geotrust,便宜快速高效

    4. 等到rapidssl 把证书通过email 的形式发给你的时候,你就可以开始在nginx上安装SSL了

    5. 在nginx 的安装目录下,如果你是通过源代码编译的话,一般就是/usr/local/nginx, 建立一个SSL 文件,把通过email 得到的证书保存为ssl.crt, 把private key 保存为ssl.key

    6. 如果你使用rapidssl 的话,你还得把下载rapidssl intermediaCA certificate, 可以点击这里下载:https://knowledge.rapidssl.com/support/ssl-certificate-support/index?page=content&actp=CROSSLINK&id=INFO1548

使用SO28616

   7 在同一个目录下,把Intermediate CA certificate 保存为intermediate.crt, 然后把这个intermediate.crt 加在ssl.crt 后面才算完成整个证书

   cat intermediate.crt >> ssl.crt

   8 到目前为止,所有的准备工作都算完成,下一步就是配置nginx了,这个很简单,按照nginx 的官方文档

 

http://nginx.org/en/docs/http/configuring_https_servers.html

 

   主要是添加一下三个参数:

   listen XX.XX.XXX.XX:443 ssl;

   ssl_certificate /usr/local/nginx/ssl/ssl.crt;
   ssl_certificate_key /usr/local/nginx/ssl/ssl.key;

 

然后重新启动nginx 即可

一定不要忘记检查一下你的ssl 的安装是否正确: 

https://cryptoreport.rapidssl.com/checker/views/certCheck.jsp

这个网址会清楚的告诉你你安装的SSL 的安全隐患,其中比较著名的就是需要关闭SSLv3,也很简单, 在你的server 或者http block 里面加入如下命令即可:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # omit SSLv3 because of POODLE (CVE-2014-3566)