我对使用 http/certs/etc 还是很陌生。我为 apache httpclient 设置了自己的 hostnameVerifier。(试图让 FQDN 不匹配,只要证书 FQDN 仍然在我们的域内部 - 不是我所知道的最好的 - 但总比没有好)
它适用于我测试过的大多数服务器,但有几个我得到了
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 );
}
}