javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

时间:2021-07-25 05:02:16

客户端向服务器发送数据时,份两种情况,SSL单向验证和SSL双向验证

1.SSL单向验证时

代码如下:

  1. import java.io.IOException;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.apache.commons.httpclient.HttpClient;
  5. import org.apache.commons.httpclient.HttpException;
  6. import org.apache.commons.httpclient.HttpStatus;
  7. import org.apache.commons.httpclient.NameValuePair;
  8. import org.apache.commons.httpclient.methods.PostMethod;
  9. import org.apache.commons.httpclient.params.HttpClientParams;
  10. import org.apache.commons.httpclient.params.HttpMethodParams;
  11. import org.apache.commons.logging.Log;
  12. import org.apache.commons.logging.LogFactory;
  13. public class ClientSendData {
  14. static Log log = LogFactory.getLog(ClientSendData.class);
  15. private String Url;
  16. // 初始化数据
  17. public ClientSendData() {
  18. Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
  19. }
  20. public String sendData(String data) {
  21. String receivedData = null;
  22. try {
  23. Map<String, String> paramsData = new HashMap<String, String>();
  24. paramsData.put("data", data);
  25. receivedData = send(Url, paramsData);
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. return receivedData;
  30. }
  31. public static String send(String url, Map<String, String> paramsMap) {
  32. String result = null;
  33. PostMethod postMethod = null;
  34. HttpClient httpClient = new HttpClient();
  35. httpClient.getParams().setParameter(
  36. HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
  37. postMethod = new PostMethod(url);
  38. if (paramsMap != null && paramsMap.size() > 0) {
  39. NameValuePair[] datas = new NameValuePair[paramsMap.size()];
  40. int index = 0;
  41. for (String key : paramsMap.keySet()) {
  42. datas[index++] = new NameValuePair(key, paramsMap.get(key));
  43. }
  44. postMethod.setRequestBody(datas);
  45. }
  46. HttpClientParams httparams = new HttpClientParams();
  47. httparams.setSoTimeout(60000);
  48. postMethod.setParams(httparams);
  49. try {
  50. int statusCode = httpClient.executeMethod(postMethod);
  51. if (statusCode == HttpStatus.SC_OK) {
  52. result = postMethod.getResponseBodyAsString();
  53. log.info("发送成功!");
  54. } else {
  55. log.error(" http response status is " + statusCode);
  56. }
  57. } catch (HttpException e) {
  58. log.error("error url=" + url, e);
  59. } catch (IOException e) {
  60. log.error("error url=" + url, e);
  61. } finally {
  62. if (postMethod != null) {
  63. postMethod.releaseConnection();
  64. }
  65. }
  66. return result;
  67. }
  68. public static void main(String[] args) {
  69. ClientSendData t = new ClientSendData();
  70. t.sendData("测试SSL单项连接,向服务端发送数据!");
  71. }
  72. }

可能出现的异常

1.java.net.ConnectException: Connection refused: connect

服务器没有启动

2 .javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

服务端的证书是不可信的。解决办法见这篇文章 http://zhuyuehua.iteye.com/blog/1102347

3.java.net.SocketException: Software caused connection abort: recv failed

这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。

4.org.apache.commons.httpclient.NoHttpResponseException

这一般是服务端防火墙的原因。拦截了客户端请求。

另外,当服务端负载过重时,也会出现此问题。

5.javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。服务端验证客户端证书时,发现客户端没有证书,然后就断开了握手连接。

2.SSL双向验证时

双向验证时,暂时不知道如何用HTTPCLIENT发送数据,如需要双向验证时发送数据,参考我另外的文章。另外,有知道HTTPCLIENT如何在双向验证时发送数据的,恳请指教。