Отключить проверку имени хоста в 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
        }));
    }
}

Есть ли способ обойти этот механизм и отключить проверку имени хоста?


person Ashish    schedule 03.08.2012    source источник


Ответы (1)


Задал тот же вопрос на форумах hsqldb и узнал, что для этого нет обходного пути. Единственное, что вы можете сделать, это закомментировать код, вызывающий метод проверки, а затем пересобрать банку. Я все еще озадачен, почему hsqldb не использовал HostnameVerifier (http://docs.oracle.com/javase/6/docs/api/javax/net/ssl/HostnameVerifier.html), что упростило бы написание настраиваемый верификатор имени хоста.

person Ashish    schedule 05.08.2012