[update] 本文于 2017-12-29 进行过一次修订

我以前没有接触过 SSL ,导致签发人生中第一张 SSL 证书的时候,Private Key 是通过第三方生成的,理论上来说这张证书基本上是废了,因为你家门的钥匙都是别人帮你配的,谁知道他有没有留一个副本!所以 Private Key 一定得自己生成。

以下的内容,随随便便搜索引擎便能搜索到更加详细的,我在这里也就不累赘了,大概的说一下一些简单的东西。

SSL 证书有什么用

  • SSL 是一个加密协议,它能保证你的数据在传输的过程中不被截取
  • 它能保证你的网站的内容不被篡改,比如国内的各宽带运营商,强制在你的网站上加 Javascript 代码,投放广告
  • iOS APP 和 小程序 强制要求使用 HTTPS 传输内容

SSL 证书价格怎么样

Let’s Encrypt 已提供免费 SSL 证书签发服务,感谢这个组织推动了整个互联网 HTTPS 化。目前,签发证书的成本其实还是蛮低的。如果你是个人使用,不防试试以下的 CA 签发的证书,如果你是商用,我觉得你应该比我更清楚应该去哪里签。

  • Let’s Encrypt 免费签单域名/多域名证书,有效期较短,3个月。
  • FreeSSL 一个免费提供证书申请服务的第三方网站
  • Comodo PositiveSSL 我在 namecheap.com 签的单域名证书,50多RMB。
  • 各大云服务运营商都提供了免费的 SSL 签发服务

SSL 证书如何申请

在哪家 CA 申请证书都是差不多的流程。你需要准备的是你申请域名的 Private Key 和通过 Private Key 生成的 CSR (CERTIFICATE REQUEST),然后将 CSR 给 CA ,CA 域名审核通过后,将会给你一个 CRT SSL 证书。CSR 起到中间传递的作用,最后部署的时候,真正有用的只有 Private Key 和 CRT

如果你觉得通过命令行生成 Private Key 和 CSR 麻烦的话,我这里推荐一个在线生成的网站,这个网站纯前端生成,无后端服务器,理论上是安全的。

CSR Generator

[!!重点!!] 记得生成之后,要点击下载 ZIP 包,里面含有 Private Key ,把它丢了就没救了。

SSL 证书如何部署

我觉得部署倒是挺简单的,把 私钥 和 域名证书 放在服务器上,配置 Nginx Conf ,reload 完事。

host.conf 相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server
{
listen 443;
# 其他内容
ssl on;
ssl_certificate /etc/ssl/private/ssl.crt;
ssl_certificate_key /etc/ssl/private/ssl.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
}

把 HTTP 强制跳转至 HTTPS

1
2
3
4
5
6
server
{
listen 80;
server_name dearb.me;
rewrite ^ https://$server_name$request_uri? permanent;
}

SSL证书的一些小问题

  • Android 浏览器或某些 PC 浏览器上显示证书不受信任。你需要找到你所申请 CA 的证书及根证书等证书链,放在你的证书 ssl.crt 后面就OK了。证书链补全工具
  • 浏览器上面没有显示绿标,而且灰色小黄标。那是因为你的页面含有 HTTP 协议的元素,全部使用 HTTPS ,就有小绿标了

最后你可以在 SSL Labs 检测你的域名的 SSL 评分已经在各终端的信任情况。