概述

现在的网站,你说你没有用SSL,访问地址不是Https,你都不好意思拿出来见人。谷歌推,苹果推,连APP Store都不允许你提交非SSL的网络请求了。网络运营商,三方代理,都对你站的交互数据赤裸裸的记录。所以,配置一个SSL刻不容缓。

问题

说干就干,我们立刻配置一下SSL,嗯,很好,那么我们从哪里开始,于是我想了几个问题。

有免费的吗?

毕竟穷屌丝,那么免费肯定是首先考虑的,所以到哪里去找,谷歌必应大法祭出,找到了人见人爱的 Let's Encrypt 。一看介绍,主打就是免费,好用,安全。

好用吗?

那么好用吗,要是配置步骤繁多,安装困难,学习曲线较高,那就很麻烦了。

索性看了一些人的安装心得,又是安装组件,又是生成证书,又是配置验证服务,创建账号等等。这些步骤真是太麻烦了,难道就只能这样了吗?突然,出现了一个叫 acme 的好东东,它能够简化配置,让你很快就拥有自己的SSL,不管你信不信,我是信了。

安全吗?

最后安全吗?怎么知道安全不安全,又一个好东西出现了,ssllabs.com 可以检测你的结果,我的网站结果看看吧,评级还行,后面还有更多的优化空间。

middle

实施

环境

我的服务器环境是

  • Ubuntu 14.04
  • Nginx
  • NodeJS

所以应该关注的自然是Nginx的配置和反向代理,以及Ubuntu下的指令。

安装acme.sh

详细的安装文档可以参看acme.sh的github网站,也有中文说明。这里只是把我操作的相应的情况列出来。

curl https://get.acme.sh | sh

通过上述命令即可安装acme.sh。
然后通过

source .bashrc。

即可载入命令acme.sh。

申请证书

现在我们可以申请证书了,通过命令

acme.sh --issue  -d mydomain.com   --nginx

即可生成证书,生成的证书会在 "/home/user/.acme.sh/mydomain.com" 中。接下来我们要拷贝证书到一个网站需要用到的位置。不建议在nginx中直接引用这个文件夹下的文件,原因是我们等会会配置一个自动更新证书的任务,这个任务会定期续约证书,也即是说这个位置的证书可能会改变,直接改变使用中的文件可能会引起不必要的问题,所以我们会有一个脚本来拷贝证书和重启Nginx。

拷贝证书

上面已经讲述了证书不能直接使用的问题,但是拷贝也不要人工拷贝,这样更新程序是不知道你拷贝的具体位置的,那它还怎么自动玩呢?所以我们要使用下面的命令来拷贝。

acme.sh --installcert -d mydomain.com \
               --keypath       /home/ubuntu/www/ssl/mydomain.key  \
               --fullchainpath /home/ubuntu/www/ssl/fullchain.cer \
               --reloadcmd     "sudo service nginx force-reload"

命令中的 "mydomain" 修改为自己的网站地址, "/home/ubuntu/www/ssl" 也是一个配置的地址,你可以自己确定一个目录位置,当然前提是这个目录位置存在且有权限。

配置证书

证书拷贝完成之后,我们就要在Nginx中配置证书了。这里就不啰嗦了,直接上配置

 ...
  server {
    listen 443 ssl;
    ssl_certificate         /home/ubuntu/www/ssl/fullchain.cer;
    ssl_certificate_key     /home/ubuntu/www/ssl/mydomain.key;

    # ...
  }
 ...

然后保存测试,不出意外的,已经OK了。遗留了几个问题,看官们自己处理了:

  • 让所有的http访问都转到https访问,这里需要Nginx进行一个配置
  • 这样的配置在ssllabs.com中得不到高分,也就是安全性不足,需要增加安全配置和改进

配置自动更新证书

最后由于let's encrypt的免费证书是90天的,所以到期了我们得让它能够自动续约,那么只需要在crontab中配置一下即可。

0 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null

上面的 "/home/ubuntu/.acme.sh" 自行修改位置

总结

并没有坑

安装的过程很顺,很美好,全程10分钟不到,基本按照acme.sh的指南操作下来即可。

That's all