1. 问题描述


今天用Apache搭建好PC端服务器后,用Chrome测试,打开http://www.baidu.com/时出现了如下的错误: 



2. 错误原因

经试验发现,对于firefox和IE不会出现上述问题。或者会出现安全警告,但是可以选择信任而继续访问页面。但是对于chrome浏览器则不可以。

原因在于,chrome浏览器新加入了HSTS策略(见上图红色圈)。使用HSTS策略是chrome加入的新特性,使用该策略的网站,会强制浏览器使用HTTPS协议与该网站通信。

HTTPS和HTTP的区别在于,用HTTPS协议时传输的数据是加密的(TSL和SSL),而用HTTP传输时是明文传输。

具体来说,HTTPS协议对传输内容使用的是对称加密算法,也即通信双方使用相同的密钥。但是对于密钥分发过程则使用的是公钥加密。但是我如何确认服务器不是别人伪造的呢?——我需要验证他的身份,即验证他的公钥。在服务器给我提供的证书中,有他声明的公钥Kp1,也有第三方用第三方自己的私钥(Ks0)加密服务器公钥(Kp1)后的密文(Ck1)。假如我相信第三方的身份是真实可信的,那么我用第三方的公钥(Kp0),解密服务器的被第三方加密的公钥,和服务器直接发给我的公钥比较。如果相同,则验证成功;不同则验证失败。
数学公式:证书构成(Kp1, Ck1, Kp0) ,其中Ck1==Eks0(Kp1),若Kp1 == Dkp0(Ck1)则验证成功。

这里一个重要的假设是我相信第三方,也即我相信证书是有效的(证书还包含其它信息来供大家确定是否有效,上段描述只是简化)。然而这里我自己搭建的服务器所提供的证书并不被chrome所信任,所以验证失败。

造成证书不受信的可能的情况有:
1. 第三方证书没有及时更新
2. 第三方服务器不安全
3. 证书不是由可信第三方颁布

3. 解决方法

在chrome的地址栏里输入 chrome://net-internals/#hsts,把localhost从HSTS中删除,如下图:

Delete domain

Input a domain name to delete it from the HSTS set (you cannot delete preloaded entries):

Domain:  

Query domain

Input a domain name to query the current HSTS set:

Domain:  

Not found