您的位置:首页 > 其它

SSL客户端不验证证书

2017-01-02 20:39 99 查看
以前用C#写了个程序,连接SSL的服务器,其中涉及到证书验证。在C#中,提供了X509证书的验证回调,也就是说我们可以通过这个回调实现我们自己的证书验证过程。最近有把程序用Java重写的打算,就在网上找关于Java中SSL的资料,通过查看javax.net.ssl的相关文档,找到方法如下:

public static void SslSocket() throws Exception {
SSLContext context = SSLContext.getInstance("SSL");

// 初始化
context.init(null,
new TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

}

public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

}

public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
},
new java.security.SecureRandom());
SSLSocketFactory factory = context.getSocketFactory();
SSLSocket sslSocket = (SSLSocket) factory.createSocket("localhost", 443);
OutputStream output = sslSocket.getOutputStream();
InputStream input = sslSocket.getInputStream();

byte[] bytes = "hello".getBytes();
output.write(bytes);
output.flush();

byte[] buf = new byte[1024];
int len = input.read(buf);
String ss = new String(buf, 0, len);
System.out.println(ss);
}

X509证书信任管理器类的实现及应用

在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。

接口X509TrustManager有下述三个公有的方法需要我们实现:

void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException

该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。

void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException 

该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。

X509Certificate[] getAcceptedIssuers() 

返回受信任的X509证书数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: