我對使用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);
}
}
「*力圖讓FQDN不只要匹配的IP他們指出,匹配*的」:這其實容易受到中間人攻擊(通過DNS)。 – Bruno
這是當前使用的代碼的一個進步,它允許這些服務器所在的主域的任何子域。如果沒有我們自己的公司,這個代碼的使用非常有限。如果我可以讓所有服務器管理員獲得他們的證書,我可以進一步收緊。在此之前 - 這是我能做的最好的。現在我想到了,儘管...如果有人在控制DNS,檢查FQDN的匹配比檢查IP是否匹配要好。如果他們控制DNS不能欺騙他們是他們想要的任何服務器名稱?我完全相信你比我更瞭解這一點,我只是想明白。 :) – glyphx
嗯,不是真的。如果有MITM,適當的主機名驗證的目的是防止MITM。如果你認爲沒有一個,那麼沒有問題。如果有MITM,他可以欺騙你的反向DNS請求。如果你想要阻止MITM攻擊,那麼在中途進行攻擊是毫無意義的。 – Bruno