2012-08-03 85 views
0

我有一個tomcat-hibernate-hsqldb設置,我想使用SSL來保護我的應用程序和hsqldb之間的數據傳輸。但是,我需要預先安裝可在任何部署中使用的證書。我不想爲每個新的部署站點使用新的證書。對於這一點,如果我只是使用自簽名證書問題,任何隨機的通用名稱,然後在Tomcat中安裝的信任存儲相同的證書,然後我得到這個異常在hsqldb中禁用主機名驗證

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 
     })); 
    } 
} 

有沒有辦法以某種方式繞過這個機制和禁用主機名驗證?

回答

0

在hsqldb論壇上提出同樣的問題,並且知道沒有解決方法。你唯一能做的就是註釋掉調用verify方法的代碼,然後重建jar。我仍然困惑爲什麼hsqldb沒有使用HostnameVerifier(http://docs.oracle.com/javase/6/docs/api/javax/net/ssl/HostnameVerifier.html),這會使寫起來更容易一個自定義主機名驗證器。