受到我同学@寇世峻 的影响, 我也打算将网站进行SSL加密. 据说SSL加密会会使网站变慢(因为要运算嘛), 但我这仅由我"孤芳自赏"的小网站, 根本不可能跑满服务器的所有性能(刚看了一下系统负载: 0.00 0.00 0.00). 弄个Https不光加强了所谓的"安全", 还可以让服务器稍微多干点活, 更可以提升B格, 何乐而不为呢?


  要使用SSL, 必须首先找到一个靠谱的证书提供商. 虽说可以自己签发证书, 但自己签发的证书并不会被大多浏览器认可. 试想打开我的网站, 浏览器蹦出提示:"您所访问的网站加密证书不被信任"是多么刹风景的事... 况且作为一个非营利的个人博客, 不想投入太多金钱. 如此筛选下来, 可供选择的证书提供商并不多, 但还是有的.
  我选择的证书提供商是StartSSL, 类似的免费提供商还有Let's Encrypt. 相同点是它们都有靠谱的免费证书发放, 不同点是StartSSL申请比较麻烦(对比Let's Encrypt而言), 但证书有效期为1年. 而Let's Encrypt申请简单, 证书有效期却只有3个月. 我选择StartSSL的主要原因是我同学@寇世峻 的推荐, 而且我也不是那么愿意每隔3个月去折腾一次(尽管网上有自动续期脚本).
  注册和申请过程对英语稍好的或会用网页翻译的那些人来说问题并不大, 百度上相关的教程也是一搜一大堆, 这里我就不再赘述了. 附两个参考教程: 教程1, 教程2.
  要注意的是, 在生成的整个过程中, 这四个文件需要注意保存:

  • 登录证书: 凭借这个证书, 可以免用户名密码登录StartSSL官网. 如果不慎丢失, 就需要重新注册或找回密码了.
  • CSR: 由软件生成的证书签发请求文件, 是获得Crt文件的关键.
  • Key: 密钥文件, 需要上传至服务器
  • Crt: 证书文件, 需要上传至服务器

  先将Key和Crt文件上传到服务器(具体位置没特殊要求, 我这里上传到了 /usr/local/nginx/certs/8023.moe/ 下), nginx的配置文件也需做少许修改, 这台服务器使用的是lnmp.org一键安装包安装的lnamp环境. Nginx配置文件为 /usr/local/nginx/conf/vhost/8023.moe.conf :

server
    {
        listen 80;
        #listen [::]:80;
        server_name 8023.moe *.8023.moe;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/8023.moe;

        if ( $host != '8023.moe' ) {
            rewrite "^/(.*)$" http://8023.moe/$1 permanent; 
        } 

        #error_page   404   /404.html;
        include proxy-pass-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log off;
    }

修改要点:

  • listen 443; 监听https所访问端口443
  • ssl on; 开启SSL
  • ssl_certificate /usr/local/nginx/certs/8023.moe/1_8023.moe_bundle.crt; Crt证书路径
  • ssl_certificate_key /usr/local/nginx/certs/8023.moe/8023moe.key; 密钥路径
  • rewrite ^/(.*)$ https://8023.moe/$1 permanent; 重写至带https的页面.

改完了是下面这样:

server
    {
        listen 443;
        #listen [::]:80;
        server_name 8023.moe *.8023.moe;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/8023.moe;

        if ( $host != '8023.moe' ) {
            rewrite "^/(.*)$" https://8023.moe/$1 permanent; 
        } 

        ssl on;
        ssl_certificate /usr/local/nginx/certs/8023.moe/1_8023.moe_bundle.crt;
        ssl_certificate_key /usr/local/nginx/certs/8023.moe/8023moe.key;

        #error_page   404   /404.html;
        include proxy-pass-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log off;
    }

server
    {
        listen 80;
        #listen [::]:80;
        server_name 8023.moe *.8023.moe;
        rewrite ^/(.*)$  https://8023.moe/$1 permanent; 
    }

  经过这么一番修改, 访问首页发现浏览器的网址栏旁边已经多了红色的小锁, 但后台不能登录, 页面也是乱的一团糟.
  先解决后台问题: 修改Typecho根目录下的 config.inc.php , 文件首行添加 define('__TYPECHO_SECURE__',true); 以启用Typecho的https支持.
  如此, 后台可以登录而且访问几乎任何一个非https页面都可以跳转到带https的页面了.
  但网页样式丢失的问题还没解决: 网页所引用的图片/CSS/Js等静态文件依旧是以http的方式请求, 浏览器默认不但不会加载, 而且会提示"网页试图加载不安全的元素".
  解决方法简单粗暴: 登录后台, 手动将所有的绝对链接改为相对链接. 比如将 http://8023.moe/blog/75.html 改成 /blog/75.html ; http://8023.moe/usr/uploads/2016/07/3164008524.jpg 改为 /usr/uploads/2016/07/3164008524.jpg 以此类推... 这样, 不管我以后怎么换域名或取消https, 都不用再折腾了. (当年我咋那么想不开用了绝对路径呢QAQ...).

  好了, 再次打开网页, 锁头绿了, 排版对了, 后台也能登录了. 全站https加密到此为止~