博客使用了椭圆曲线 TLS 证书

心血来潮把博客的证书更新了,加密算法由本来的 RSA-2048 更换为 EC-256。简单来说,HTTPS 通讯初始化的时候,需要在服务器和客户端之间交换一个 TLS 证书,用来验证服务器的身份。

由于每次 HTTPS 通讯时,都需要下载这么一个证书,它的体积在一定程度上决定服务器响应的速度。传统的基于 RSA-2048 算法的证书,有 2048 位即 256 字节大小,而新的 EC-256 算法,则只需要 32 字节。更换之后,一下子就少了 200 多字节,在网络繁忙的时候,可以有效地传输。

EC 或者 Elliptic Curve,中文译为“椭圆曲线”。EC 是一种新的非对称加密算法。EC-256 所提供的安全性相当于 RSA-3072,已经高于传统的 RSA-2048,但只需要 1/8 的体积,性价比很高。

不过博客的速度已经很快了,更换证书的性能提升应该是感受不到了 :P

站点启用 Certificate Transparency

之前一直都以为 Certificate Transparency 这个东东是给 EV 用的,没想到今天看了篇文章,说是个人站点也可以用。于是就去申请了一下。

先简单说说 SSL 证书的安全性。SSL 的机制是一个简单的信任链关系,浏览器并不能区分两个受信任的 CA 对同一域名签发的证书。比如本站的证书是由 DigiCert 签发的,如果另一个 CA 有意或无意也签发了一个对于 leonax.net 的证书,浏览器在访问网站的时候并不知道哪个证书是“真的”,哪个是“假的”。于是如果有两个网站,使用了不同 CA 签发的证书,且都说自己是 leonax.net,那么浏览器都会显示出“安全”的图标。现在 SSL 证书泛滥,部分 CA 为了降低证书申请的门槛,并没有做到严格的域名审核步骤,导致一些恶意分子有机可趁,伪造证书来骗取用户的信任。

简单来说 Certificate Transparency 是一个用于增强 SSL 证书安全性的东西,它可以确保 CA (Certification Authority) 不乱发证书。CT 的做法是通过一个第三方的验证机制,来判断证书的改动有没有出现异常。比如上述情况,会有两个 CA 同时向验证服务器提交信息,或是一个提交了,浏览器却收到了另一个的证书,这样便可以区分出“真假证书”了。

本站的证书是在 DigiCert 申请的。DigiCert 对 Certificate Transparency 的介绍可以看这里。实际上它废话了一堆,只是告诉你要去联系客服开启 CT 即可。于是我就去找了客服,十分钟搞定,当中还绕来绕去说了一些废话,可能是因为美国当地时间是夜里,客服不太清醒的缘故。不过事情也不复杂,很快客服就给我重新签发了证书。拿到新的证书之后,再上传到网站服务器即可。

开启了 CT 之后,在 Chrome 的网站信息中就可以看到类似上图的字样。说是网站已提供有效的 Certificate Transparency 数据。

如何生成 CSR 文件

CSR,Certificate Signing Request,是制作 SSL 证书的必要步骤。一个 CSR 文件中描述了 SSL 证书持有人的信息(如个人姓名或公司名称)、联系地址等,用于验证 SSL 证书和域名是同一个人持有,以确保网站的合法性。

在 Linux 上生成 CSR 文件通常需要用到 OpenSSL 工具,这是一个命令行工具,参数一大堆,对于偶尔用一下的用户来说,可能不太友好。于是 DigiCert 提供了一个在线工具,用于生成 OpenSSL 的命令行,然后再拿去网站主机上运行就可以了。理论上 OpenSSL 一定要在网站所处的主机上运行,即换了主机之后要重新制作一个新的证书,但实践中并不强制这一步骤。

工具截图如下:

示例中我填写了 Google 的信息,请按实际情况修改,各项的含义如下:

  • Common Name: 你的网站域名
    • 如果你购买的是单一域名的 SSL 证名,请填写实际用到的域名,如 leonax.net 或者 www.leonax.net;在 DigiCert 购买的单一域名,填写 www 版本送裸域;
    • 如果购买的是野卡,则填写 *.leonax.net;
  • Organization: 公司名称,如果是个人用户,请填写自己的全名;
  • Department: 部门名称,可不填;
  • City: 所在城市;
  • State / Province: 所在州/省;
  • Country: 所在国家;
  • Key Size: 加密字长,目前常用的是 2048,如果对安全性要求较高,可以选择 4096;

全部填好之后,点击“Generate”即可以生成命令行,把右侧生成出来的一串命令,复制到 Linux 主机上运行即得到一个 CSR 文件。

之后要做的步骤是向 SSL 证书提供商上传这个文件,以获得最终的 SSL 证书,之后再详述。

注:OpenSSL 是一个 Linux 的工具,如果你的主机所用的是 Windows 或其它操作系统,可以在这个页面找到相应的介绍。

本站被强制 HTTPS

坛子兄的提醒,才猛然发现本站已经“被” HTTPS 了。在使用最新版本的 Chrome、Firefox 和 IE 11 访问本站时,浏览器将不允许你使用未加密的链接来访问本站。

原因?因为 Chrome 和 Firefox 分别维护了一份网站列表,当用户访问列表中的网站时,Chrome 和 Firefox 会自动使用 HTTPS 来访问。这项技术被称为 HSTS(HTTP Strict Transport Security)。我在使用 HSTS 之初就知道这个列表的存在,本来以为它们只是针对一些大的热门网站,毕竟收集互联网上所有的网站是不太可能的事情。但很荣幸的是,本站被两份列表都收录了:

Chrome(文件较大,谨慎打开)

Firefox

微软也表示,IE 11 将使用 Chrome 所提供的列表。于是,三大浏览器都将安全地访问本站。

如果想要使用 HSTS,只要在服务器的 HTTPS 输出中添加如下报头(Header)。注意一定要在 HTTPS 中才有效果,在 HTTP 中输出是无效的。

启用 HTTPS 的好处不言而喻,但这份静态的列表不禁让我担心某一天要是本站不支持 HTTPS 了,要撤销也是一件很麻烦的事情。不过现在还不用过分关注这件事,毕竟 HTTPS 是大趋势。

DigiCert,金牌 SSL 证书服务商

刚开始玩博客的时候,我用了 GoDaddy 的服务,因为它家提供了各种各样的服务,域名、主机、建站等,应有尽有,对于初学者来说很方便。但是后来慢慢熟悉了之后,就开始搬离 GoDaddy 了。当然这不是说 GoDaddy 的服务不好,只是它家的服务太多,难免有一些不尽如人意的地方,不如那些专攻某一项业务的商家来得好。

现在我的域名和主机都使用了 Google Cloud、邮件使用 SendGrid 等,在 GoDaddy 只剩下了 SSL 证书。现在要把 SSL 证书也搬出 GoDaddy,这样就可以彻底和它说再见了。

于是我就去研究了一下 SSL 证书的服务商,实际上专门贩卖 SSL 证书的商家也不多,比如顶级的有 Symantec 等、入门级的有 StartSSL、Comodo 等,另外有一些自己有能力签发证书的公司,比如 Google,却不售卖证书,只是自己签了自己玩而已。那么哪一家比较好呢?在比较过程中,我注意到了一家叫做 DigiCert 的公司,它在 SSLShopper 的记录中,有超过 1000 人评价,却获得了几乎满分(4.96 / 5),相比之下,GoDaddy 的得分是 3.07,而 Comodo 只有 2.63 分。当然,这评分可能是刷榜刷出来的。不过这家神奇的公司,它的客户有以下这些:

这还只是前三行,排在后面的知名企业还有 HP、西数、GitHub 等。

从评论中可以看出,DigiCert 以优质的服务出名,24 * 7 不间断的客户支持,快速的证书签发是吸引客户的主要方式。那么它家的客户服务到底有多好?我亲自去体验了一下。

由于我目前所使用的证书还没有到期,不会在短时间内停用 GoDaddy 的服务,因为退款也是件麻烦事。于是我就先去注册了一个合作伙伴的帐号,一来可以接触一下他们的客服,二来如果好用的话,之后可以在博客中推广,顺便赚点提成。

注册完成之后 24 小时内(时差原因),就收到了 DigiCert 的销售专员(Reseller Manager)的邮件,向我询问一些问题。后来我发现他们误解我的身份,大概是我申请表上哪里填错了,他们以为我是以公司的名义代理销售,让我提供一些公司的资料。回邮件解释过之后,也是一天之内就收到了通知,说是审核通过了,也就是我可以开始推广它家的产品了。

这个流程似乎很顺利,也没什么过于吸引人的地方。我以为到这里就告一段落了,相当于签了合同,他们坐等新客户,我坐等推广费就可以了。但实际上还没完。两天之后,收到了客户关系经理(Customer Relations Manager)的邮件,说是要和我电话中聊一聊。这……自从上网以来,我一般都只有在退款的时候才需要打电话去要钱,还没碰到过对方主动要求打电话来的情况。好吧,英文聊天也不是什么难事,电话就电话吧。

电话(会议)进行得也很顺利,对方询问了我博客的情况,问我打算如何推广等等,然后介绍了一下 DigiCert 的情况以及一些常规的推广方式。最后还解答了我的一些疑问,我顺便抱怨了一下 DigiCert 暂时没有提供中文客服的弊端,在中国电商这么发达的时代,不和中文市场搞好关系简直是作死。总体来说,聊得很愉快,给我的感觉是客服很专业,解答问题很耐心,解释全面到位。之后一旦有什么问题,再打电话过去也不会觉得尴尬。

电话的最后,由于我抱怨了没有中文不好推广的问题,这位经理贱贱地送了我一个 EV 证书的邀请码。这枚邀请码可以免费注册一个两年的 EV 证书,价值约 460 美元。为什么要说“贱贱地”呢?因为她知道我是个人用户,自己无法注册 EV 证书,送我的目的大概是让我有足够的动力来推广。所以呢,有需求的同学可以私下联系我,先到先得。

另外,如果 DigiCert 也有提供个人版的 SSL 证书,点这里注册

HTTPS 证书简介

HTTPS,全称是“超文本传输安全协议”,是一种加密的网络通信技术。其中的“安全”,由 TLS(或者 SSL)协议提供。作为用户,我们不必了解 HTTPS、TLS 和 SSL 之间的关系,当我们在谈论网页浏览的时候,这三个术语通常指的是同一个东西。

使用了 HTTPS 加密的网站(比如本站),用户在访问网站的时候,所有的通讯都是被加密的,只有用户的浏览器和网站服务器知道真实的内容,通讯过程中所有的中间节点(路由器、网关等)都无法进行破解,从而保证了浏览过程的安全性。在访问 HTTPS 的网站时,浏览器通常会显示一个绿色或者加锁的图标,表示安全,看一下你的浏览器地址栏,是不是这个样子的?

HTTPS 的工作原理,简单来说就是网站服务器提供了一个证书 A,这个证书可由一个第三方机构的证书 B 来验证其真伪,而这个证书 B 会默认存放在用户的操作系统中。当用户访问网站时,浏览器会获得证书 A 的信息,然后拿本机中已有的证书 B 来验证,如果验证成功,则开始使用证书 A 进行加密通讯。于是,对网站主的要求就是,在一个权威机构获取一个合适的证书。

HTTPS 的证书有分为几类:普通、多域名、通配(Wildcard)、扩展验证以及多域名扩展验证,以下就来一一介绍:

普通证书:只对单一域名有效,在申请的时候需要指定域名,比如本站的证书,就是指定了 leonax.net 作为认证域名,当这个证书用于其它域名如 abc.leonax.net 的时候,浏览器就是给出警告:域名和证书不匹配。

多域名证书:在申请的时候可以指定多个域名,并且域名只对这一系列域名有效。

通配证书:俗称“野卡”。可使用通配符来指定域名,比如 *.leonax.net,这样所有的子域名都可以使用这个证书,适用于子域名多,又不想一个一个单独申请证书的网站。

扩展验证证书:和上述个人证书不同,扩展验证证书只颁发给企业用户,其“扩展验证”的含义就是验证了企业的合法性。有了企业的名声做后盾,这网站的安全性就更上一层楼了。此外,为了突出公司的重要性,浏览器一般会体现出扩展验证证书的公司信息,比如下图是访问 DigiCert 时看到的样子:

多域名扩展验证证书:普通的扩展验证证书只支持单一域名,多域名证书可以提供多个域名的扩展验证。需要注意的是,和上述的个人证书不同,扩展验证证书没有通配证书这一选项。

一个 SSL 证书的有效期通常为一年,最长可以申请到三年,过期之后要去第三方机构续签证书。这个过程是为了避免证书被盗之后的风险,也就是即合证书被盗了,别人也只能使用最多一年时间,从而减少了损失。一些大公司为了安全,只使用有效期为半年的证书。

如果你对 HTTPS 已动心,本站推荐 DigiCert 作为 SSL 证书提供商。

使用 HTTPS 安全上网

Google 前几天发博客称,使用 HTTPS 的站点,在搜索结果中可以提升一定的位置。也就是说,同时支持 HTTP 和 HTTPS 的站点,Google会优先显示HTTPS版本的页面,而你的 HTTPS 页面,也会比其它站点的HTTP页面的权值高。

那 Google 为什么要做出这样的设定呢?很明显,目的就是提高整个网络的安全性,这也是 HTTPS 和 HTTP 的主要差别。在 HTTPS 中,只有域名是公开的,其它部分,包括 URL 的剩余部分、网页的内容、请求登录的密码等,都是经过加密的。

根据 HTTPS 的原理,每次通讯的时候,客户端的浏览器和服务器会先约定好一个密钥,而浏览器或是服务器发出的消息,都会使用这个密钥来加密,也就是说,如果中途有人截获了一段消息,他得到的也是加密之后的内容,而要破解这段内容,不是在有生之年可以做到的事情。于是,HTTPS 的通信是安全的。

不对呀,有那么一种情况,貌似可以破解 HTTPS。比如你在网吧里上网,你要去招商银行检查一下你的存款,于是你访问了招行的主页(https://www.cmbchina.com/)。但是,这个时候,网吧的路由器拦截了这个请求,对你假装自己就是招行的主页,和你建立一个 HTTPS 连接;然后再对招行假装他是你,和招行再建立一个 HTTPS 连接。这样他就让你们以为互相在和对方用 HTTPS 通信,但实际都是在和他通信,他就从中获取了你的帐号密码。这种攻击方法称为“中间人攻击”(Man in the Middle Attack)。

HTTPS 牛x的一点是,它可以防止中间人攻击

防御的方法是,每一个 HTTPS 的站点都有一个对应的证书(Certificate)。证书的意义是说明了站点的 HTTPS 是由一个第三方机构认可的。如果你查看本站的 HTTPS 证书,可以看到它是由一个名为“Go Daddy Secure Certificate Authority - G2”的组织签发的,而这个组织它自己的证书,已经存放在你的电脑里。由于你的电脑信任“Go Daddy”,而“Go Daddy”又证明本站是安全的,于是你的电脑和浏览器就可以安全地和本站通信。至于上述的那个“网吧路由器“,他也可以去“Go Daddy”为“leonax.net”申请一个证书,但是“Go Daddy”颁发证书之前会先验证域名的所有权,而“网吧路由器“显然提供不了所有权的证明,于是他就得不到 HTTPS 的证书。

在得不到证书的情况下,“网吧路由器“可能会伪造一个证书,这样就无法通过浏览器的校验,于是浏览器会显示类似以下的警告:

当看到这样的警告的时候,切记不可继续访问网站,继续访问会带来非常大的安全隐患。

另外,值得一提的是,前几年有人提出了另一种攻击方法,称为 SSL Strip。它的工作原理是,当你访问一个 HTTPS 网站(比如 https://leonax.net)的时候,它会偷偷地把目标地址改成http://leonax.net,即把 HTTPS 偷换成 HTTP,这样显然就不安全了,但问题浏览器也没给出警告,一些糊涂的用户就上当了。如果做得再高级一点,它会换成另一个 HTTPS 的域名,例如 https://leonax.net.xyz.com/。这样实际上是在访问 xyz.com 而不是 leonax.net 了。至于 xyz.com 是干什么的,谁知道呢。

总之,安全使用 HTTPS 要注意两点,一是浏览器的警告,二是域名。如果你正在访问的是 https://leonax.net/ 且没有警告,那一定是安全的了。