SSL配置是websphere security中很重要的一部分,具体详细阅读下面内容。
http://www.ibm.com/developerworks/websphere/techjournal/0612_birk/0612_birk.html
这里重点分析两个问题:KeyStore和TrustStore的区别以及如何使用websphere的ssl配置。
一. KeyStore和TrustStore的区别
- TrustStore主要用于存放public certificate,即公钥。而公钥一般是被标准CA机构签发的,故IBM websphere称之为Signer Certiificate,故名思议被签过名的证书。公钥很常见,当你用浏览器打开一个https时得到的证书一般都是公钥。
- KeyStore主要用于存放personal certificate,即私钥。因为私钥一般是由服务商提前通过其他途径提供给你的,且一般该证书只是提供给你一个用户,用于识别用户身份,故IBM websphere称这为personal certificate,不能共享给别的用户。
- TrustStore中的证书用于信任服务器的证书,如果服务器的证书在TrustStore中那么会被信任。注意在Java中,如果服务器的证书并不在TrustStore中,但如果它的签名方是一个标准的CA机构那么Java也是会接受的。
- KeyStore中的证书用于“双向校验”(详细关于双向检验的解决请看上一篇)中的服务器检验客户的过程,即在握手过程中服务器会要求客户端提供证书,那么客户端就会从KeyStore中但找相应证书并发送给服务器检验。
- 注意,两者都是一个文件(websphere的web console中会显示keystore是哪个文件)。并且keystore里也可以存放signer certificate而truststore里也可以存放personal certificate,只是keystore里的signer certificate在握手过程中不会被检索,而truststore中的personal certificate在握手过程中也不会被用到。一种特例就是你把KeyStore和TrustStore指向同一个文件,那么该文件中的signer
certificate和personal certificate在握手时都会被用到,当然用在不同的步骤。
二. websphere中如何使用ssl配置
- websphere的admin console中有一个专门的"ssl configuration"项目,用于配置ssl,你可以新建一个"ssl configuration"项并给它一个对你有意义的名字,在其中你可以指定KeyStore和TrustStore分别是什么,另外还可以在QoF中配置SSL协议(如TLSv1, SSLv2等,默认是TSL_SSL),可用的加密算法等。
Quality of Protection panel for SSL configurations
- 把你在上一步中添加的SSL配置绑定到websphere的一个域上,如cell,node或app server上,注意绑定后按范围由大到小继承,那cell上的ssl配置会被继承到node上,除非node上自己配置了一个ssl configuration。
SSL configuration panel
- 在绑定ssl configuration时,注意一下Inbound和Outbound的区别。Inbound表示当前的websphere上的应用充当服务器,别的外部应用来连。而Outbound则表示当前websphere上的应用作为客户端去连接外部服务器。
Overview of the centrally-managed topology view
到此为止,SSL配置已经完全可以被websphere上的应用使用了。但是在使用时又会有两种情况,一种是websphere上的应用完全不管SSL握手的建立,调用一个Java API去要求websphere建立一个SSL连接,那么websphere就会找到Inbound或Outbound上的SSL配置,然后完成SSL握手后返回给websphere上的应用。在这种方式下,SSL连接的建立对应用来说是透明的,所有需要用到的证书库(包括keystore和truststore)都提前在ssl配置中设置好。
另一种方式则是由应用自己主导SSL连接的建立,通常的方式是调用Oracle Java制定的标准接口,SSLContext.getInstance(String)来完成。注意这种方式建立的SSL连接是绕过了websphere层而直接跟JVM交互,要求建立SSL连接。这种方式下,上面提到的在websphere中的SSL配置是不会被用到,所以需要自己指定KeyStore和TrustStore,而JDK也提供了接口,只要设置下面几个system property即可:
javax.net.KeyStore
javax.net.KeyStorePassword
javax.net.KeyStoreType
javax.net.TrustStore
javax.net.TrustStorePassword
javax.net.TrustStoreType
下图表示了这两种使用方法的区别。