5.1.2 自定义信任管理器

自定义的信任管理器类需要实现X509TrustManager接口,并且要实现该接口的3个方法,方法的介绍如下。

1)checkClientTrusted()方法:该方法用于检查客户端的证书,若不信任则抛出异常。由于我们不需要对客户端进行认证,可以不做任何处理。

2)checkServerTrusted()方法:该方法用于检查服务器端的证书,若不信任则抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以不做任何处理,即一个空的方法实现,由于不会抛出异常,它就会信任任何证书。

3)getAcceptedIssuers()方法:返回受信任的X509证书数组。

下面我们创建一个信任管理器类MyX509TrustManager,让它信任任何服务器端证书,实现代码如下:

  1. import java.security.cert.CertificateException;
  2. import java.security.cert.X509Certificate;
  3. import javax.net.ssl.X509TrustManager;
  4.  
  5. /**
  6. * 信任管理器
  7. *
  8. * @author liufeng
  9. * @date 2013-10-17
  10. */
  11. public class MyX509TrustManager implements X509TrustManager {
  12.  
  13. // 检查客户端证书
  14. public void checkClientTrusted(X509Certificate[] chain, String authType) throws
  15. CertificateException {
  16. }
  17.  
  18. // 检查服务器端证书
  19. public void checkServerTrusted(X509Certificate[] chain, String authType) throws
  20. CertificateException {
  21. }
  22.  
  23. // 返回受信任的X509证书数组
  24. public X509Certificate[] getAcceptedIssuers() {
  25. return null;
  26. }
  27. }

下面是使用MyX509TrustManager类发送HTTPS请求的示例:

  1. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
  2. TrustManager[] tm = { new MyX509TrustManager() };
  3. SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
  4. sslContext.init(null, tm, new java.security.SecureRandom());
  5. // 从上述SSLContext对象中得到SSLSocketFactory对象
  6. SSLSocketFactory ssf = sslContext.getSocketFactory();
  7.  
  8. URL url = new URL(requestUrl);
  9. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
  10. conn.setSSLSocketFactory(ssf);

注意 在本书中,凡是涉及发送HTTPS请求的,均采用上面定义的MyX509TrustManager类来实现,让它信任所有服务器端证书。上述示例是针对SUN JVM,如果在IBM JVM下运行会报错,需要进行相应的调整。