SSL客户端不验证证书

来源:互联网 发布:it helpdesk面试题 编辑:程序博客网 时间:2024/04/30 08:59

以前用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证书数组。

0 0