之前在『IIS 7 为多个域名绑定证书』一文中介绍了如何申请免费的泛域名证书并在服务器上绑定了 SSL 证书,但是如果需要做微信小程序,根据微信小程序的官方开发文档,HTTPS 证书还需支持 TLS 1.2 版本。
TLS 是什么?
TLS(Transport Layer Security,安全传输层协议)用于在两个通信应用程序之间提供保密性和数据完整性。
诶这不是跟 SSL(Secure Socket Layer,安全套接层)很像吗?
SSL 是基于 HTTPS 下的一个协议加密层,起初是因为 HTTP 在传输数据时使用的是明文(虽然说 POST 提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患 Netscape 公司推出了 SSL 安全套接字协议层,SSL 是基于 HTTP 之下 TCP 之上的一个协议层,是基于 HTTP 标准并对 TCP 传输数据时进行加密,所以 HPPTS 是 HTTP+SSL/TCP 的简称。
由于 HTTPS 的推出受到了很多人的欢迎,在 SSL 更新到 3.0 时,IETF 对 SSL 3.0 进行了标准化,并添加了少数机制(但是几乎和 SSL 3.0 无差异),标准化后的 IETF 更名为 TLS 1.0,可以说 TLS 就是 SSL 的新版本3.1。
TLS 与 SSL 连接过程其实无任何差异。
SSL 与 TLS 两者所使用的算法是不同的,SSL 使用的是 MAC 哈希算法,TLS 使用的是 RFC-2104 定义的 HMAC 算法,两者差异是在填充字节与密钥之间一个使用的是连接运算,一个使用的是异或运算,MAC 和 HMAC 在取值范围也是不同的,但是安全度是相同的。
SSL 可以分为两个协议,SSL 记录协议(SSL Record Protocol)为 TCP 协议在通信提交数据时提供数据封装、压缩、加密等基本操作,SSL 握手协议(SSL Handshake Protocol)建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
TLS 与 SSL 的两个协议工作方式与 SSL 是一样的。
SSL 所使用的版本为 3.0,版本号也为 3.0.x(x 代表未知数因为 SSL 还在更新),而 TLS 版本为 1.0,但版本号却为 SSL 3.1.0。
TLS 增加了许多新的报警代码,比如解密失败(decryption_failed)、记录溢出(record_overflow)、未知 CA(unknown_ca)、拒绝访问(access_denied)等,但同时也支持 SSL 协议上所有的报警代码。
简单来说,TLS 就是在 SSL 的基础上做了少许升级。
抛书包抛了这么久,还是回到项目问题上,由于微信小程序需要支持 TLS 1.2,那么只在服务器上绑定了普通的 SSL 证书,就会导致小程序无法正常运行。
要解决这个问题,首先要确定操作系统环境是否支持 TLS 1.2,参考一下表格:
之前在『IIS 7 为多个域名绑定证书』里也提到,我们服务器的环境是 Windows Server 2008 R2 Enterprise,刚好可以支持 TLS 1.2。
根据网上的说法,十分简单,进入服务器修改注册表即可,于是我把对应注册表的值进行修改。
然后重启 IIS,结果发现并没有成功支持 TLS。
搜寻其他解决方法,找到了一款面向小白的 GUI 工具——『IIS Crypto』。
『IIS Crypto』是一个图形化的 TLS 设置工具。
在服务器上安装好『IIS Crypto』,打开,虽然是全英文的界面,但是看见那几个关键词就大概知道怎么操作了。
它默认已经帮我勾选好 TLS 的三个版本,虽然小程序的官方文档要求最好支持 TLS 1.2 以上的版本,但这里并没有更高版本的选项,不过并不要紧,我们只要能到达 1.2 的版本就够了,当然为了兼容部分旧 Android 机型,把 1.0 和 1.1 的版本也勾上。
然后点击「Apply」,会弹出一个提示框。
仔细阅读提示的内容,发现要求 reboot computer,重启 IIS 的话是没什么问题,但是重启服务器的 Computer,会不会出现什么问题呢,咨询了后端工程师,得到的回复是的确有可能会导致一些不确定的异常,作了一定的衡量之后,既无对策了,就重启吧!
于是重启后进行检测,使用『GETSSL』的「SSL安装检测工具」检测结果如下:
为了进一步确认,我还找了一个国外的网站进行二次检测,『Qualys SSL Labs』的「SSL Server Test」检测结果如下:
不过「SSL Server Test」的检测结果相对来说比较慢,不知道是需要检测的条目比较多还是什么原因,毕竟我也不是很懂其他条目的作用。
所以最终结果是,TLS 终于设置成功了。
过后想一想,其实之前修改注册表的方法应该也是可以的,只不过我按照网上的说法只是重启了 IIS,而没有重启服务器 Computer,所以导致修改的注册表没有生效,当然也没有验证这个想法,总不能在生产环境中去试验这些东西吧。