2013-10-11 39 views
0

我對使用http/certs/etc很新穎。我有自己的hostnameVerifier爲apache httpclient設置。 (試圖讓儘可能證書FQDN還是內部對我們的域名FQDN不只要匹配 - 不,我知道最好的 - 但是有總比沒有好)javax.net.ssl.SSLPeerUnverifiedException:嘗試創建session.getPeerCertificateChain()時沒有通過身份驗證

它工作正常的大多數我都與測試的服務器,但也有一對夫婦在那裏我得到

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

當我嘗試

session.getPeerCertificateChain(). 

我能夠查看證書就好了,當我去在Firefox相同的鏈接。

下面是該方法的完整代碼。

@Override 
public void verify(String arg0, SSLSocket arg1) throws IOException 
{ 
    String certFQDN = null; 

    SSLSession session = arg1.getSession(); 
    javax.security.cert.X509Certificate[] certs = session.getPeerCertificateChain(); 
    if (certs.length > 0) 
    { 
     String name = certs[ 0 ].getSubjectDN().getName(); 
     for (String s : name.split(",")) 
     { 
      String part[] = s.split("="); 
      if (part[ 0 ].trim().equals("CN")) 
      { 
       certFQDN = part[ 1 ].trim(); 
      } 
     } 
    } 
    else 
    { 
     throw new IOException("Could not find certificate chain."); 
    } 


    if (!certFQDN.substring(certFQDN.length() - 11).equals(".domain.com")) 
    { 
     throw new SSLException("Not an internal host: " + certFQDN); 
    } 
} 
+1

「*力圖讓FQDN不只要匹配的IP他們指出,匹配*的」:這其實容易受到中間人攻擊(通過DNS)。 – Bruno

+0

這是當前使用的代碼的一個進步,它允許這些服務器所在的主域的任何子域。如果沒有我們自己的公司,這個代碼的使用非常有限。如果我可以讓所有服務器管理員獲得他們的證書,我可以進一步收緊。在此之前 - 這是我能做的最好的。現在我想到了,儘管...如果有人在控制DNS,檢查FQDN的匹配比檢查IP是否匹配要好。如果他們控制DNS不能欺騙他們是他們想要的任何服務器名稱?我完全相信你比我更瞭解這一點,我只是想明白。 :) – glyphx

+2

嗯,不是真的。如果有MITM,適當的主機名驗證的目的是防止MITM。如果你認爲沒有一個,那麼沒有問題。如果有MITM,他可以欺騙你的反向DNS請求。如果你想要阻止MITM攻擊,那麼在中途進行攻擊是毫無意義的。 – Bruno

回答

0

@覆蓋公共無效驗證(字符串爲arg0,SSLSocket的ARG1)拋出IOException異常{

arg1.getSession();

javax.security.cert.X509Certificate [] certs = session.getPeerCertificateChain();

] .getSubjectDN()。getName();

))

);

] .trim()等於( 「CN」))

] .trim();

找不到證書鏈 「);

certFQDN.length() - 11).equals(」 .domain.com 「))

內部主機:」 + certFQDN);

}

相關問題