Java安全套接字编程-使用 X509 证书信任管理器

Java安全套接字编程-使用 X509 证书信任管理器

引言

参考文章:http://www.blogjava.net/etlan/archive/2006/06/29/55767.html

在深入了解JSSE之前,需要了解一个有关Java安全的概念:客户端的TrustStore文件。客户端的TrustStore文件中保存着被客户端所信任的服务器的证书信息。客户端在进行SSL连接时,JSSE将根据这个文件中的证书决定是否信任服务器端的证书。

 JSSE中,有一个信任管理器类负责决定是否信任远端的证书,这个类有如下的处理规则:

  1. 如果系统属性javax.net.ssl.trustStore指定了TrustStore文件,那么信任管理器使用这个文件来检查证书。

  2. 如果该系统属性没有指定TrustStore文件,它就会去jre安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。

  3. 如果 jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是cacerts。


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

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

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

  1. void checkClientTrusted(X509Certificate[] chain, String authType) 

    throws CertificateException

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

  2. void checkServerTrusted(X509Certificate[] chain, String authType) 

    throws CertificateException 

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

  3. X509Certificate[] getAcceptedIssuers() 

    返回受信任的X509证书数组。

没有找到一个很好的实践方法,也懒的试了,暂时也不会用。

package ssl6;

import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class MyTrustManager implements X509TrustManager {
    // 相关的 jks 文件及其密码定义
    private final static String TRUST_STORE = "D:/test_client_trust.jks";
    private final static String TRUST_STORE_PASSWORD = "Testpassw0rd";
    X509TrustManager xtm;

    public MyTrustManager() throws Exception {
        // 载入 jks 文件
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(new FileInputStream(TRUST_STORE), TRUST_STORE_PASSWORD.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE");
        tmf.init(ks);
        TrustManager[] tms = tmf.getTrustManagers();
        // 筛选出 X509 格式的信任证书
        for (int i = 0; i < tms.length; i++) {
            if (tms[i] instanceof X509TrustManager) {
                xtm = (X509TrustManager) tms[i];
                return;
            }
        }
    }

    // 服务端检验客户端证书的接口
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        //Leave blank to trust every client
    }

    // 客户端检验服务端证书的接口
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        // Leave blank to trust every server
        try {
            xtm.checkServerTrusted(chain, authType);
        } catch (CertificateException excep) {
            System.out.println(excep.getMessage());
            throw excep;
        }
    }

    // 获取可接受的发行者
    public X509Certificate[] getAcceptedIssuers() {
        //return xtm.getAcceptedIssuers();
        return null;
    }
}

======END======

你可能感兴趣的:(Java安全套接字编程-使用 X509 证书信任管理器)