nginx 下使用 wosign 免费的 SSL 证书

0x00 前言

前几天在 hostloc 上看到有免费的 SSL 个人证书申请,能装13的东西果断不能错过呀。本以为给网站配置 SSL 是一件比较简单的事,结果还是折腾一番才弄好,下面就写一下这个过程。

据论坛上的大牛们说,wosign 的根证书已经加到了 Microsoft 和 Mozilla中,意味着它颁发的证书几乎支持所有的 PC 和移动端,不会显示“证书不受信任”,听起来好屌的样子。

0x01 申请证书

Wosign 免费 SSL 证书的申请地址

证书的审核还算挺快的,下午5点交的申请,30分钟后 wosign 就发来成功的邮件。

1

取回证书后,我们会得到一个压缩包。用预设的密码解开后,会有3个 zip 包。

2

这里我们需要的是中间的压缩包key+crt.zip。解压后取出里面的public.crtprivate.key,然后把它们上传到 VPS 一个不能被 web 访问的地方。

0x02 nginx 开启 SSL

接下来需要修改 nginx 的配置文件,开启 SSL 服务:

server {

    listen  443 ssl;
    server_name hack0nair.me;

    ssl_certificate      /usr/local/nginx/conf/ssl/public.crt;  #证书路径
    ssl_certificate_key  /usr/local/nginx/conf/ssl/private.key; #私钥路径

    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers  on;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    location / {
        root   /usr/local/nginx/html/hack0nair.me;
        index  index.html;
    }
}

保存文件后,让 nginx reload 一下就可以使用 https 访问了。

0x03 合并 wosign 的根证书

虽然我们现在可以使用 https 进行访问了,但是大部分浏览器会显示证书不被信任,如下图:

3

这是因为签发这张证书的 CA 不在你的机器上,于是我们需要把 wosign 的根证书与我们的证书进行合并。

首先把根证书下载到 VPS 上:

wget https://www.wosign.com/Root/Bundle_DV_St.crt

然后进行证书合并:

cat Bundle_DV_St.crt >> public.crt

由于 wosign 的证书默认没有预留换行,所以直接 cat 合并是不够的,我们还要修改一下。

-----END CERTIFICATE----------BEGIN CERTIFICATE-----改为:

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

就是在它们之间加个换行。

重启一下 nginx 就成功啦。

4

0x04 强制使用 https 访问网站

既然网站已经支持 https,为了让大家都看到,要把80端口的请求都跳转到443上。一开始我想让 nginx 同时监听80和443端口,果断sb了。正确的方法是借用 nginx 的rewrite规则。

server {
    listen 80;
    server_name hack0nair.me www.hack0nair.me;
    rewrite ^(.*)$  https://hack0nair.me$1 permanent;
}

当然还有别的方法,如error 497等。

还有一个问题,申请证书的时候用的是根域名hack0nair.me,而 wosign 的证书不同时验证 www 和不带 www,所以我们要让https://www.hack0nair.me的请求跳到https://hack0nair.me。解决方法很简单,只需要在listen 443后面加一条rewrite规则:

server {

    listen  443 ssl;
    server_name  www.hack0nair.me hack0nair.me;

    if ($host = 'www.hack0nair.me') {
       rewrite ^/(.*)$ https://hack0nair.me$1 permanent;
    }

    ...

}

这样所有带 www 的请求就都跳到不带 www 去了。

0x05 让页内资源支持 https

一般来说,完成上面的步骤 https 访问就没有什么问题了。但因为网站原来引用的外部资源都是使用 http 协议,chrome 会进行这样的提示:

5

因此我们要让页内资源都走 https 协议。方法一般有三个:

  1. 最简单就是把所有的 http 改为 https 了。这样做的坏处是,如果网站要改回去 http,又要再修改一遍。

  2. 如果是 JavaScript 内部的引用,可以通过判断当前 URL 使用的协议来决定使用什么协议。

    (document.location.protocol == 'https:' ? 'https:' : 'http:')

  3. 使用相对 URL 无缝切换 HTTP 和 HTTPS。我们可以省略 Scheme 部分去来引用资源,如:

  
<img src='http://hack0nair.me/assets/img/biu.png' />

<img src='//hack0nair.me/assets/img/biu.png' />

</code></pre></figure>

使用第二种引用方式的话,就由浏览器决定采用哪种协议了,降低了代码复杂性。以上这种省略Scheme部分的相对路径的写法在 IE7、IE8、Firefox、Chrome、Opera 以及 Safari 中均测试通过。

0x06 后记

很蛋疼的是,多说评论框引用的 JavaScript 内有部分资源没采用 https 协议,导致加载了评论框的页面都如图5所示,坑啊~

« 返回