当前位置: 首页 > 知识库问答 >
问题:

Spring RestTemplate I/O错误:没有对等证书

许照
2023-03-14

我总是在尝试获取https资源时得到相同的错误:

org.springframework.web.client.ResourceAccessException: I/O error: No peer certificate; nested exception is javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

我有一个运行应用程序的自签名虚拟主机,应用程序在HTTP上运行良好,但我需要HTTPS

mRestTemplate = new RestTemplate();
mRestTemplate.getMessageConverters().add(new GsonHttpMessageConverter());
mRestTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

final ResponseObject responseObject = mRestTemplate.postForObject(APP_URL, requestObject, ResponseObject.class);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);

SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);

client = DefaultHttpClient(conMgr, params);

final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setHttpClient(client);

mRestTemplate = new RestTemplate();
mRestTemplate.setRequestFactory(factory);

我尝试了这个解决方案,但没有成功,也犯了同样的错误

  1. 获取所有必需的证书(root和任何中间CA)
  2. 使用keytool和BouncyCastle提供程序创建密钥库并导入证书
  3. 在android应用程序中加载密钥存储库并使用它进行安全连接不要使用标准java.net.ssl.HttpSurlConnection进行安全连接。使用Apache HttpClient(版本4 atm)库,该库已经内置在Android中。它构建在java连接库之上,在我看来,它更快、模块化更好、更容易理解。

共有1个答案

杨安歌
2023-03-14

在使用RESTTemplate进行任何Http请求之前,运行下面的方法。这对我管用。

public void trustSelfSignedSSL() {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {

                public void checkClientTrusted(X509Certificate[] xcs,
                        String string) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] xcs,
                        String string) throws CertificateException {
                }

                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] arg0, String arg1)
                        throws java.security.cert.CertificateException {
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] arg0, String arg1)
                        throws java.security.cert.CertificateException {

                }
            };
            ctx.init(null, new TrustManager[] { tm }, null);
            SSLContext.setDefault(ctx);
        } catch (Exception ex) {
            throw new RuntimeException("Exception occurred ",ex)
        }
    }
 类似资料:
  • 问题内容: 将其插入运行Android 2.3的模拟器中,而不是在4中运行。在4中,它可以完美运行。我正在尝试通过https连接到实时服务器。它使用有效的Thawte证书,在所有浏览器以及Android 3和4中均可正常运行。 如果有人有代码帮助,请谢谢。另外,如果有人对安全解决方法有任何建议,我将不胜感激。我仍在学习,并且已经在这个问题上解决了一个星期。它必须结束,所以我可以继续工作和学习。嗯

  • 问题内容: 我正在尝试做一个简单的HttpGet来读取网页。我在iOS和Android上通过http(而非https)工作。 网址是内部网络IP和自定义端口,因此我可以使用以下路径使用http读取此类内容: 当我尝试使用https时,出现错误。所以我尝试使用此代码: 但这给我一个错误。 我究竟做错了什么?我可以放心地忽略该证书,因为它是一个具有自签名证书的内部网络,但是我无法控制版本,我的应用程序

  • 我使用的是是一款开源的100%纯驱动程序,适用于。 -我有连接池配置下面 有时,我会遇到以下异常情况:无法从sql server获取连接。我不知道为什么? java.sql.SQLExc0019: I/O错误:连接重置由对等:套接字写入错误net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052)net.sourceforge.j

  • 我有一个应用程序jar,我正在使用DefaultHTTPClient类对象调用HTTPS url,但它给出的对等体不是authenticate异常,所以我想使用Keystore对jar进行签名。 根据@Duncan,我可以通过引用这个链接导入JVM中的。cer文件…我使用belloed命令将.cer导入到cacerts中 在此之后,我输入“Y”以信任证书 之后,我运行我的应用程序,但它仍然给我 堆

  • 问题内容: 我正在尝试从中文网站中抓取一些javascript生成的内容。我正在使用Selenium(和Python),因为我无法直接抓取javascript内容。 我得到以下错误: 实际上,我似乎无法在selenium.selenium类中调用任何命令。毫无疑问,我忽略了非常明显的事情。提前致谢。 问题答案: 您只需要。 执行以获取页面上的html元素(最大的元素)。(您可以通过多种方式执行此操

  • 在这个错误之前,它已经给了我另一个“xrange不存在”之类的信息,所以我查找了它,并将nx_shp.py文件中的更改为,这似乎解决了这个问题。 根据我所读到的内容,它可能与Python版本(Python2 vs Python3)有关。