5.1.1 两种解决方法
访问Web应用的编程接口基本上都封装了SSL,使得访问HTTPS和访问HTTP一样简单。JSSE(Java Secure Socket Extension,Java安全套接扩展)是一个SSL和TLS的纯Java实现,可以透明地提供数据加密、服务器认证、信息完整性等功能,通过JSSE可以很容易由编程实现对HTTPS站点的访问。
客户端在连接SSL服务器时,SSL服务器会将自己的证书链交给客户端验证,如果在证书链中发现存在无效的证书,客户端会立即终止连接。客户端的TrustStore文件保存着被客户端所信任的服务器的证书信息,JSSE正是根据TrustStore文件决定是否信任服务器端的证书。在JSSE中有一个默认的信任管理器类,它负责决定是否信任服务器端的证书,它的处理规则如下:
1)如果系统属性javax.net.sll.trustStore指定了TrustStore文件,那么信任管理器就去JRE安装路径下的lib/security/目录中寻找、使用这个文件来校验证书。
2)如果系统属性没有指定TrustStore文件,它就会去JRE安装路径下寻找默认的TrustStore文件,这个文件的相对路径为lib/security/jssecacerts。
3)如果jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么默认的TrustStore文件就是cacerts。
客户端访问HTTPS链接时,有两种方法能够让JSSE信任HTTPS服务器端的安全证书:
●将HTTPS服务器端的安全证书导入到客户端的TrustStore文件中;
●实现自定义的信任管理器类。
第一种方法相对安全,但需要手工导入服务器端证书,如果服务器端证书经常变化,则非常不方便;第二种方法能够避免手工导入证书的问题,相对比较灵活,但在编码实现信任管理器类时要特别小心,否则可能留下安全隐患。