需求场景:
本站早在建站之初就跟随潮流启用了站点的https协议,无奈当时申请的SSL证书是startcom的已经被多方拉入黑名单,目前已经停止发放,造成的结果就是苹果手机等一些浏览器屏蔽我的https站点,所以一直以来就开启了http和https两种直接访问方式,后面也没有过多折腾,这次更换工作,迁移了站点,做了不小改动,借此把SSL证书的遗留问题折腾起来。
配置https,确认环境允许的情况下,首先要考虑自然就是选择哪家的SSL/TLS CA证书,作为一个个人小站点,第一准则就是必须免费的 。开始大嘴想选择“Let's Encrypt”一个公共且免费SSL的项目,口碑非常不错,但是无奈在安装过程中总是报解析错误,折腾半天无果,考虑可能是本地主机监听服务端口做了DNAT的原因最终放弃。由于大嘴域名是从阿里购买,作为业界牛逼的大佬,阿里自然有相应的产品,这里大嘴最终便选用了阿里的云盾证书的一款免费证书—— Symantec的免费型DV SSL。
♥阿里云免费DV SSL证书+全站https
一、申请阿里免费DV SSL证书
如上图所示,我们找到阿里控制台云盾证书服务界,选择此类型的证书,立即购买即可,为期一年。
返回我的证书,找到刚才购买的证书,在进度一栏选中“补全”,按照订单进度流程进行证书审核申请。
接下来就是填写证书申请的相关信息,按照引导填写即可,最终完成状态如上图“已签发”,并下载证书。
这里博主是lamp的apache环境,所以下载适用apache的证书文件,如下图:
可以直接参考阿里提供资料:填写审核资料步骤
其中在申请证书时需要填写粘贴csr文件内容,因为我这里是需要线下自己使用,所以需要自己生成私钥key文件和证书申请密钥csr文件,生成的方法大嘴这里使用的是openssl工具。
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout server.key -out server.csr
执行命令生成CSR文件。其中:
- -new 指定生成一个新的CSR。
- -nodes 指定私钥文件不被加密。
- -sha256 指定摘要算法。
- -keyout 生成私钥文件。
- -newkey rsa:2048 指定私钥类型和长度。
生成文件后,“cat server.csr”查看证书申请密钥文件内容并复制粘贴到申请信息页面。当然也可以使用keytool工具生成密钥文件。
以上可以参考阿里提供资料:如何制作CSR文件
二、配置apache https SSL证书
下载好了证书,是一个****.pem的文件。
上传到生成密钥的目录,直接mv重命名crt后缀即可:
# mv 1413432512351.pem server.crt
把crt和之前生成的key、csr文件一起放在apache的配置的conf目录下。
因为站点http服务是部署在普通用户下,配置一下文件的权限:
# chown oxblog:oxblog server.*
# chmod 644 server.*
再apache的配置文件httpd.conf中启用ssl模块并引用ssl配置文件:
#vim httpd.confLoad
Module ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
然后在apache的SLL配置文件httpd-ssl.conf中配置https监听443服务:
<VirtualHost _default_:443>
# General setup for the virtual host
DocumentRoot "/opt/apache/htdocs"
ServerName oxblog.cn
ServerAdmin you@example.com
ErrorLog "/opt/apache/logs/error_log"
TransferLog "/opt/apache/logs/access_log"
SSLEngine on
......
再配置引用证书密钥文件的参数:
(在上面的虚拟主机配置标签内,也可以直接找到下面参数修改):
# vim ../extra/httpd-ssl.conf
......
SSLCertificateFile "/opt/apache/conf/server.crt"
SSLCertificateKeyFile "/opt/apache/conf/server.key"
......
最后重启下httpd服务即可:
# service httpd -k stop
# service httpd -k start
到此,如果不出意外,恭喜您,您的小站已经可以https访问了。
三、全站https及SSL优化。
上面虽然我们开启了https协议的服务,但是http仍然可以访问,但如果我们关闭了http服务,对一些搜索引擎,或是某IE浏览器,对https并不是很友好,另外很多人在直输站点url的时候并不会习惯敲打https头的,所有很多时候还是有必要提供http服务的角色,但又想全站只能都走https的传输协议,如此我们有必要做一些配置:
①、启用wordpress的后台强制https
因对大嘴站点使用的wordpree搭建,对于wp来说有两个参数,可以让登陆页面和后台管理强制走https协议。
vim wp-config.php
/** Sets up WordPress vars and included files. */
define('FORCE_SSL_ADMIN', true); <强制后台https>
define('FORCE_SSL_LOGIN', true); <强制登陆https>
define('WP_POST_REVISIONS', 5); <允许登陆错误重试5次>
②、后台配置常规选项配置wp-url和站点url为https的
如此很多wp页面调用url函数的内链才是https的超链接,配置如下图:
老版本上可能还要修改多媒体的上传路径和URL为https,目前新版本则不用了。
③、检查主题文件是否有http开头的超链接
可以进入主题目录,使用grep命令检测一下:
#grep -ri http: ./
当然不是所有的http都要修改,如果是外部链接的,斟酌处理即可,但凡支持https,都尽量更改一下。
④、http重定向到https实现全站https
为了解决上述问题,可以做301重定向,如此当朋友访问http的url时,会自动跳转到https协议,从而实现全站https。
要做重定向有很多种方法,常见的主要有两种:Apache模块 mod_alias的 Redirect 和 RedirectMatch命令、使用mod_rewrite重写URL方式。
前两种方法都很简单,直接在httpd.conf文件中添加即可。(也可以写到.htaccess文件中)
博主这里就使用的如下代码:(注意"https://oxblog.cn/"的最后一个"/"一定不要忘记)
Redirect permanent "/" "https://oxblog.cn/"
当然也可以如下:(permanent也可以写成301)
RedirectMatch permanent ^/(.*) https://oxblog.cn/$1
下面是重写URL的方式:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(.*)$ https://%{SERVER_NAME}/$1 [L,R]
⑤、禁用ssl2、ssl3、tls1.0、tls1.1版本
为了提高PCI DSS支付卡行业安全标准以及使用更安全的协议,目前注意使用的是TLS1.2和TLS1.3版本。
ssl2、ssl3、tls1.0、tls1.1几个版本目前来说已经是不安全的,需要从配置中排除:
#vim httpd-ssl.conf
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
除此之外我们还可以排除几个不安全的加密算法套件:
SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!LOW:!aNULL:!eNULL
配置完以上,记得重启httpd服务哦。更多安全加固,可以参考:
(今天的分享就到这里,如果您有高见或好的分享,记得留言哦!)
很赞
@fakin
我更喜欢lets证书
@鸟叔 嗯呢,lets确实很好用,而且可以配置自动续期永久生效,本来是要使用它的,总是报错,下次再研究
学习一下,弄阿里的证书去,哈哈
@清风夜独醉 可以的,免费的,大平台,值得信赖。