最近遇到的一个问题是,在更换了https的加密协议后(从ssl更换到tls),之前的post请求总是返回400 bad request这样的问题。网上搜罗了一下,有很多人遇到同样的400 bad request,但是各自的具体情况不尽相同,因此没有找到有效的解决方法。
先说一下遇到的情况,对于某一个post请求,在postman中访问没有问题,但是在java代码中使用httpclient按照原先使用正常的方式去做请求,返回的response为一个null,没有其他具体信息,很难追溯。没有办法,只能一步一步跟进调试,一直跟到org.apache.http.impl.execchain包下MainClientExec.class这个类中,并且可以看到请求是正常发送出去,但是收到的response是null。由于对https的了解不是很足,起初怀疑是不是由于更换到tls后握手出现问题,于是调整org.apache.http这个包下的日志等级为debug,可以看到连接是正常建立,因此排除握手的问题。
2020-03-19 16:10:35,119 [org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:423)]-[DEBUG] Secure session established 2020-03-19 16:10:35,119 [org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:424)]-[DEBUG] negotiated protocol: TLSv1.