java - 通过Rest Template访问第三方服务器时双向身份验证如何工作

标签 java spring rest ssl curl

我正在尝试使用 POST 请求和 Spring Rest 模板访问第三个服务。当我使用 Curl 命令进行尝试时,我得到了完美的响应。

curl -k --data @body.json -v --cert tomcat -X POST -H 'Content-Type:application/json' https://220.227.71.46:9444/eko/initiateIMPSFundTransfer

这里的tomcat是我服务器证书的昵称。 当我尝试用 Java 做同样的事情时,我的问题就出现了。 首先,我试图忽略 SSL 身份验证。如果有人需要,我将跳过将发布的代码。但是当我调用 POST 请求时,我收到远程主机连接已关闭的错误响应。当我尝试注册我的 keystore 并使用以下代码设置 SSL 上下文时。我得到了错误。 org.springframework.web.client.ResourceAccessException:“https://220.227.71.46:9444/eko/initiateIMPSFundTransfer”的 POST 请求中的 I/O 错误:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径;嵌套异常是 javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

    InputStream keyStoreInputStream = this.getClass().getClassLoader()
            .getResourceAsStream("test.webservices.eko.co.in.jks");
    log.info("keyStoreInputStream " + keyStoreInputStream);
    if (keyStoreInputStream == null) {
        try {
            throw new FileNotFoundException(
                    "Could not find file named 'test.webservices.eko.co.in.jks' in the CLASSPATH");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    KeyStore trustStore = null;
    try {
        trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    } catch (KeyStoreException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        trustStore.load(keyStoreInputStream, "changeit".toCharArray());
    } catch (NoSuchAlgorithmException | CertificateException |
            IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            keyStoreInputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我怀疑我正在注册我的服务器的 keystore ,我的 java keystore 也有这个 .jks,我正在运行这个应用程序。取而代之的是,我需要注册我正在访问的服务器的证书。上述错误是什么意思,我该如何解决。

我是 SSL 验证的新手,所以请在这里帮助我。

最佳答案

您需要将远程服务器的 SSL 证书添加到您的 Java 代码在尝试建立连接时使用的 keystore 。

关于java - 通过Rest Template访问第三方服务器时双向身份验证如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575473/

相关文章:

java - Angular 网站的交互式屏幕指导

python - 产生大量 REST API 流量的方法

java - 鼠标滚轮滚动后计算图表的偏移和缩放

java - 使用 gson 将 json 字符串转换为 POJO

java - 为什么在JVM上执行时要去掉.class?

java - @Repository接口(interface)的Spring功能bean注册

spring - 是否有一种静态方法可以在 Spring 中获取当前的 HttpServletRequest

node.js - 如何使用 Node.js 和 Mongoose 为我的 REST api 提供详细信息和摘要对象?

带点 (.) 的 Spring MVC @PathVariable 被截断

java - 替换 StringBuffer 中的单个字符