5.1.2 自定义信任管理器
自定义的信任管理器类需要实现X509TrustManager接口,并且要实现该接口的3个方法,方法的介绍如下。
1)checkClientTrusted()方法:该方法用于检查客户端的证书,若不信任则抛出异常。由于我们不需要对客户端进行认证,可以不做任何处理。
2)checkServerTrusted()方法:该方法用于检查服务器端的证书,若不信任则抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以不做任何处理,即一个空的方法实现,由于不会抛出异常,它就会信任任何证书。
3)getAcceptedIssuers()方法:返回受信任的X509证书数组。
下面我们创建一个信任管理器类MyX509TrustManager,让它信任任何服务器端证书,实现代码如下:
- import java.security.cert.CertificateException;
- import java.security.cert.X509Certificate;
- import javax.net.ssl.X509TrustManager;
- /**
- * 信任管理器
- *
- * @author liufeng
- * @date 2013-10-17
- */
- public class MyX509TrustManager implements X509TrustManager {
- // 检查客户端证书
- public void checkClientTrusted(X509Certificate[] chain, String authType) throws
- CertificateException {
- }
- // 检查服务器端证书
- public void checkServerTrusted(X509Certificate[] chain, String authType) throws
- CertificateException {
- }
- // 返回受信任的X509证书数组
- public X509Certificate[] getAcceptedIssuers() {
- return null;
- }
- }
下面是使用MyX509TrustManager类发送HTTPS请求的示例:
- // 创建SSLContext对象,并使用我们指定的信任管理器初始化
- TrustManager[] tm = { new MyX509TrustManager() };
- SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
- sslContext.init(null, tm, new java.security.SecureRandom());
- // 从上述SSLContext对象中得到SSLSocketFactory对象
- SSLSocketFactory ssf = sslContext.getSocketFactory();
- URL url = new URL(requestUrl);
- HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
- conn.setSSLSocketFactory(ssf);
注意 在本书中,凡是涉及发送HTTPS请求的,均采用上面定义的MyX509TrustManager类来实现,让它信任所有服务器端证书。上述示例是针对SUN JVM,如果在IBM JVM下运行会报错,需要进行相应的调整。