禁用hsqldb中的主机名验证

时间:2012-08-03 09:30:53

标签: java security ssl jdbc hsqldb

我有一个tomcat-hibernate-hsqldb设置,我想使用SSL来保护我的应用程序和hsqldb之间的数据传输。但是,我需要预先安装可在任何部署中使用的证书。我不想为每个新部署站点使用新证书。为此,如果我只是使用自签名证书发布到任何随机公共名称,然后在tomcat的信任存储区中安装相同的证书,那么我得到此异常

 java.net.UnknownHostException: Certificate Common Name[random name] does not match host name[192.168.100.10] 

我需要在此设置中禁用主机名验证,但我在网上找到的所有信息都指向禁用HttpsURLConnection的机制。 我相信hsqldb在文件

中有自定义代码
org.hsqldb.serverHsqlSocketFactorySecure

这是方法,它执行此操作:

protected void verify(String host, SSLSession session) throws Exception {

    X509Certificate[] chain;
    X509Certificate   certificate;
    Principal         principal;
    PublicKey         publicKey;
    String            DN;
    String            CN;
    int               start;
    int               end;
    String            emsg;

    chain       = session.getPeerCertificateChain();
    certificate = chain[0];
    principal   = certificate.getSubjectDN();
    DN          = String.valueOf(principal);
    start       = DN.indexOf("CN=");

    if (start < 0) {
        throw new UnknownHostException(
            Error.getMessage(ErrorCode.M_SERVER_SECURE_VERIFY_1));
    }

    start += 3;
    end   = DN.indexOf(',', start);
    CN    = DN.substring(start, (end > -1) ? end
                                           : DN.length());

    if (CN.length() < 1) {
        throw new UnknownHostException(
            Error.getMessage(ErrorCode.M_SERVER_SECURE_VERIFY_2));
    }

    if (!CN.equalsIgnoreCase(host)) {

        // TLS_HOSTNAME_MISMATCH
        throw new UnknownHostException(
            Error.getMessage(
                ErrorCode.M_SERVER_SECURE_VERIFY_3, 0,
                new Object[] {
            CN, host
        }));
    }
}

有没有办法绕过这种机制并禁用主机名验证?

1 个答案:

答案 0 :(得分:0)

在hsqldb论坛上问了同样的问题,并且知道没有解决方法。你唯一能做的就是注释掉调用verify方法的代码,然后重建jar。我仍然感到疑惑为什么hsqldb没有使用HostnameVerifier(http://docs.oracle.com/javase/6/docs/api/javax/net/ssl/HostnameVerifier.html),这会让它更容易编写自定义主机名验证程序。