全站切换到HTTPS

很早就想顺应时代的潮流,把网站切到HTTPS,但是无奈条件不成熟,未能成行。

好在现在时机和条件都成熟:

  • 阿里云提供免费的SSL证书,申请非常方便。

  • 七牛CDN,开始支持自定义域名+HTTPS方式,当然也提供免费的证书。

  • 社会化评论没了,不用再考虑其是不是支持HTTPS方式调用了。


申请证书

网站有2个域名需要申请证书:

  • 主站:phxsun.com

  • CDN:cdn.cnsunnet.com

申请地址在:阿里云 -> 管理控制台 -> 安全(云盾)-> 证书服务 

选择右上角的购买证书,选择“免费型DV SSL”购买2个。然后在“我的订单”里把两个域名的信息补全。

这其中需要进行域名验证,推荐使用文件的方式验证,把指定文件传到指定目录并保证可访问就好了,不会影响线上运行。而DNS的方式是通过添加同名TXT记录实现的,会和CNAME记录冲突,导致无法进行验证,除非把CNAME记录停掉,那么网站就要挂一阵子了。

提交审核后,等待大概一个小时左右就能成功。能够在“我的订单”列表中看到下载按钮。阿里云非常良心的帮我们准备好了适用于各大HTTP服务器的证书格式。在这里选择了Apache适用的证书下载。

下载的包里有这么4个文件:

cert.png


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访问。