全站切换到HTTPS
很早就想顺应时代的潮流,把网站切到HTTPS,但是无奈条件不成熟,未能成行。
好在现在时机和条件都成熟:
阿里云提供免费的SSL证书,申请非常方便。
七牛CDN,开始支持自定义域名+HTTPS方式,当然也提供免费的证书。
社会化评论没了,不用再考虑其是不是支持HTTPS方式调用了。
申请证书
网站有2个域名需要申请证书:
主站:phxsun.com
CDN:cdn.cnsunnet.com
申请地址在:阿里云 -> 管理控制台 -> 安全(云盾)-> 证书服务
选择右上角的购买证书,选择“免费型DV SSL”购买2个。然后在“我的订单”里把两个域名的信息补全。
这其中需要进行域名验证,推荐使用文件的方式验证,把指定文件传到指定目录并保证可访问就好了,不会影响线上运行。而DNS的方式是通过添加同名TXT记录实现的,会和CNAME记录冲突,导致无法进行验证,除非把CNAME记录停掉,那么网站就要挂一阵子了。
提交审核后,等待大概一个小时左右就能成功。能够在“我的订单”列表中看到下载按钮。阿里云非常良心的帮我们准备好了适用于各大HTTP服务器的证书格式。在这里选择了Apache适用的证书下载。
下载的包里有这么4个文件:
CDN证书设置
在七牛后台进入 SSL证书服务 页面,选择上传自有证书。这里有三个字段需要填写:
备注名:这个随意,用于标识而已。我这里取名为“CDN”。
证书内容:这部分内容,就是下载的证书包中,[数字].pem文件的内容
证书私钥:对应下载的的证书包中,[数字].key文件的内容
成功提交后,在对应的存储空间中添加自定义域名,选择HTTPS方式,选择使用刚才添加的证书。
然后就静静的等待配置生效(大概一个小时左右吧),原先的资源就能用HTTPS方式来访问了。
主站证书设置
先检查下Apache的SSL模块是否被启用。若没有,使用 sudo a2enmod ssl 来开启。
在服务器Apache目录下建立一个cert的文件夹,将证书包解压并上传到其中。在实际中只用了三个文件:
public.pem
chain.pem
[数字].key
在 sites-available 中新增一个站点配置 blog-ssl,大概如下(具体路径处理过了)
<VirtualHost *:443> ServerName phxsun.com DocumentRoot /webpath/ <Directory /webpath/> Options -Indexes Order allow,deny allow from all </Directory> SSLEngine on SSLProtocol all -SSLv2 -SSLV3 SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM SSLHonorCipherOrder on SSLCertificateFile /apachepath/cert/cert1/public.pem SSLCertificateKeyFile /apachepath/cert/cert1/xxx.key SSLCertificateChainFile /apachepath/cert/cert1/chain.pem ErrorLog /logpath/error-ssl.log CustomLog /logpath/access-ssl.log combined </VirtualHost>
然后启用该站点:sudo a2ensite blog-ssl
并重启Apache:sudo service apache2 restart
https://phxsun.com 就可以访问啦。
HTTP切换至HTTPS
现在需要强制将HTTP的访问跳转到HTTPS上。修改原先的站点配置,加入跳转的规则,并重启Apache:
RewriteEngine on RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^(www\.)?phxsun.com RewriteRule (.*) https://phxsun.com%{REQUEST_URI} [L,R=301]
这样,就在浏览器输入 phxsun.com 的时候就会自动到 https://phxsun.com 了。原先被搜索引擎收录的页面,也会做对应的跳转。可以点这里测试下:http://phxsun.com/about
至此,大功告成。
Apache多站SSL配置冲突问题
后来在启用另外一个站点的SSL配置时出现了冲突,提示:
[warn] _default_ VirtualHost overlap on port 443, the first has precedence
并且实际也只有一个站点的SSL生效。
这显然不科学,按道理Apahce2.2以上的版本是支持多站SSL的。后来发现是Apache默认配置的一个坑。需要对 /apachepath/ports.conf 中 mod_ssl.c 的配置进行修改。
<IfModule mod_ssl.c> NameVirtualHost *:443 Listen 443 </IfModule>
重启Apache,问题解决。两个站点都可用HTTPS访问。