最近在工作对接中发送https请求交互时遇到了一个坑,因为同样的http请求代码与其他公司对接都没问题,而与个别公司对接却发生了一个很不可思议的问题.
发送请求时总是无法连接上服务器,httpclient提示peer not authenticated错误。网上查了很多基本确定是服务器拒绝握手通信,导致只有客户端请求而服务器不应答。
之后总结了下:发送https请求时如果遇到这个问,因为对接方有一个安全机制频繁请求会有那么个别两次被拒绝握手是因为我们的请求被认为是一种攻击行为,其实不然。这个没办法解决,之后间隔几秒以后再去请求就会没问题。
那么问题来了,一直都返回peer not authenticated这个就不是简单的问题了。我在网上搜查了很久,扫荡了几个stackoverflow的文章,之后自己做检查问题。因测试环境正常而正式环境不正常那么就有内容可以进行对比了。
首先在测试类中加入这句话
System.setProperty("javax.net.debug","ssl,handshake");
这句话可以打印我们请求的具体内容信息以便于作对比
当我发送请求打印信息如下
荧光色的是随机数用于握手成功后服务器端的加密等操作
可以看到有个TLSv1 这是因为我是jdk1.6支持的最高级别的就是这个当然jdk1.8可以支持TLSv1.2
服务端接收到以后会和我进行握手认证通信
Cipher Suite: SSL_RSA_WITH_RC4_128_MD5 这句话是服务器采用了客户端加密套件中所支持的加密套件组后运行通信后续会打印很多内容并且客户端会获得信息 。如果和护短没有看到*** ServerHello, 开头的首先查看是否是网络限制,排除完自身网络问题以后那么在看请求后发现的返回信息
如果是peer not authenticated那么可以考虑服务器端与客户端所支持的加密套件中没有通过的或者说服务器端没有进行向下兼容导致不理会低版本jdk的请求信息。这时需要让服务器端的人去进行检查配置然后对向下兼容并检查套件是否支持。如果全部都检测过了,那么在此请求会发现请求成功。