在 hsqldb 中禁用主机名验证

Posted

技术标签:

【中文标题】在 hsqldb 中禁用主机名验证【英文标题】:Disable hostname verification in hsqldb 【发布时间】:2012-08-03 09:30:52 【问题描述】:

我有一个 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】:

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

【讨论】:

以上是关于在 hsqldb 中禁用主机名验证的主要内容,如果未能解决你的问题,请参考以下文章

cloudflare自定义主机主机名状态待定啥意思

寻找主机名/机器名验证的正则表达式/代码

Firebase电话身份验证中的“找不到主机名匹配”错误(使用离子)

验证调用 API 的服务器的主机名

根据 Google Play 商店在应用程序中正确的主机名验证器

NTLM 身份验证 - 在 PHP 中获取 Windows 登录名、域和主机