SSLException查错经历

异常信息如下:
Http get request IO exception:
javax.net.ssl.SSLException: hostname in certificate didn't match:...

字面意思是,请求的hostname不在当前服务器配置中.最初的想法是那在证书中添加此hostname就是解决办法. 但令人疑惑的是我请求的是http(scheme). 这个scheme不可能报出ssl异常.

对于上述疑惑,我开始根据堆栈查看httpclient代码中处理发生这个异常的过程.

第一遍查看,很自然的使用SSLSocketFactory, 接着进行hostname的验证verifyHostname. 看起来并没有什么不对.

进一步查看,SSLSocketFactory是根据scheme决定的,那么错误肯定在之前,结果发现了DefaultRequestDirector的execute方法. 这个方法逻辑中处理了redirect的问题. 会follow原始uri跟踪到最中的uri并根据这个uri得到socket工厂.

小插曲:
redirect这个思路是中午吃饭找同事聊到的思路,通过chrome上一看真的是从http跳转到https的.

解决办法:

  1. 设置SSLSocketFactory忽略域名验证, 因为是内部服务调用, 开发逻辑少, 采用这种方式
  2. 服务器配置证书,配置方法如下(一般水准的op, 不会帮助你搞定这个问题, so...):
    https://www.ibm.com/developerworks/cn/opensource/os-httpclient/
SSLException查错经历
Share this