【问题标题】:Perform RestTemplate with external TSL使用外部 TSL 执行 RestTemplate
【发布时间】:2018-08-18 00:04:36
【问题描述】:

我正在尝试使用一个可用的公共 REST 端点,如在 http 中作为 SSL https://jsonplaceholder.typicode.com/posts/1 返回一个非常简单的 json。

我已将我的 RestTemplate 配置为:

@Configuration
public class RestTemplateConfig {

    @Value("${https.remote.proxy.host}")
    private String PROXY_URI;

    @Value("${https.remote.proxy.port}")
    private int PROXY_PORT;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        Proxy proxy = new Proxy(Proxy.Type.HTTP,
        new InetSocketAddress(PROXY_URI, PROXY_PORT));
        requestFactory.setProxy(proxy);

        return new RestTemplate(requestFactory);
    }
}

我也可以在 chrome 中 https://jsonplaceholder.typicode.com/posts/1 并单击挂锁符号 ⟼ 有效 ⟼ 详细信息 ⟼ 以 jsonplaceholder.cer 的形式复制到文件,并使用 KeyStore 资源管理器复制了 cacerts (JAVA_HOME/jre/lib/security)。

当我做下一步时:

@Autowired
RestTemplate restTemplate;

@RequestMapping(value="test", method = RequestMethod.GET)
    public Post getPost() {
    Post post = restTemplate.getForObject("http://jsonplaceholder.typicode.com/posts/1", Post.class);
    return post;
} 

我收到了成功的回复:

{
    "userId": "1",
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

但是当我对https url 做同样的事情时,我得到了下一个错误:

{
    "timestamp": 1520596009201,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "org.springframework.web.client.ResourceAccessException",
    "message": "I/O error on GET request for \"https://jsonplaceholder.typicode.com/posts/1\": sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
    "path": "/api/v1/sepa/test/"
}

这也来自 Java:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) ~[na:1.8.0_161]
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) ~[na:1.8.0_161]
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[na:1.8.0_161]
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392) ~[na:1.8.0_161]

我错过了什么?执行此测试是因为我必须连接到供应商 API。提前致谢。

【问题讨论】:

  • 代理对我来说也是如此。如果找到答案,可以将其添加到问题中吗?

标签: java rest ssl spring-boot


【解决方案1】:

您的 RestTemplate 似乎有问题。香草RestTemplate 适合我。基本调试程序 - 退出工作,直到它开始工作。缩小问题范围。

        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getRequestFactory().createRequest(new URI("https://jsonplaceholder.typicode.com/posts/1"), HttpMethod.GET).execute();
        System.out.println("Got it");

【讨论】:

  • 我试过了,但是不行。我在代理之外运行相同的代码,即使没有 cacerts 中的证书,它也可以工作。
  • 也许是关于代理配置,现在我更糟糕了。
猜你喜欢
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2012-04-09
  • 2016-06-09
  • 2014-07-15
  • 2012-02-02
相关资源
最近更新 更多