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

JAVA中如何使用证书调用服务器API

梁华清
2023-03-14

我必须使用证书调用服务器API,所以我已经将cerhtml" target="_blank">文件导入到密钥库中并完成编码,但仍然得到了javax.net.ssl.SSLHandShakeException:Sun.Security.Validator.ValidatoreXception:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径

用于将cer文件导入密钥存储库的命令。keytool-importcert-file d:\kalaivani_all\kalaivani\new_emandate_apgb\servertoservecert\onmagcert.cer-keystore d:\kalaivani_all\kalaivani\new_emandate_apgb\servertoservecert\server_npcikeystore.jks-别名“cedge1”

    appPathCertificate="D:/KALAIVANI_ALL/kalaivani/NEW_EMANDATE_APGB/servertoservecert/server_npcikeystore.jks";
                 
                  System.out.println("appPathCertificate--->"+appPathCertificate);
                  char[] passphrase = "cedge1".toCharArray(); //password
                  KeyStore keystore = KeyStore.getInstance("JKS");
                  keystore.load(new FileInputStream(appPathCertificate), passphrase); //path
 TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                  tmf.init(keystore);


                  SSLContext context = SSLContext.getInstance("TLS");
                  TrustManager[] trustManagers = tmf.getTrustManagers();
                  context.init(null, trustManagers, null);
                  SSLSocketFactory sf = context.getSocketFactory();
                  
             URL url = new URL(common_utility.getEmandateServerResponeURL());
            System.setProperty("javax.net.ssl.keyStore", appPathCertificate);
System.setProperty("javax.net.ssl.keyStorePassword", "cedge1");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");   
                
                String proxyhost=common_utility.getProxyHost();
                String proxyport=common_utility.getProxyPort();
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyhost, new Integer(proxyport)));
                HttpsURLConnection  conn = (HttpsURLConnection ) url.openConnection(proxy);
                conn.setSSLSocketFactory(sf);
                
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                conn.setUseCaches (false);
                System.out.println("GETISSUE Request : "+str_jsonparams);
                OutputStream os = conn.getOutputStream();
                os.write(str_jsonparams.getBytes());
                os.flush();
                 System.out.println("Response code :"+conn.getResponseCode());

共有1个答案

董永宁
2023-03-14

您将面临在SSL握手过程中验证服务器响应的问题。您需要在信任存储中添加中间件和根证书。这些证书将用于验证服务器标识。例如,在建立连接时,您将收到stackexchange服务器证书。然后,为了验证标识,您必须在信任存储中具有R3 CERT(中间CA)和DST根CA X3(根CA)。

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);

context.init(null, trustManagers, null);

在您的示例中,当您使用keystore初始化trustmanagerFactory时,您必须将intermediatesroot证书放在密钥库中。这里将不使用JDK存储cacerts

 类似资料:
  • 我是java中ssl的新手,需要帮助。我的应用程序需要调用支付提供商服务器,使用他们提供的证书和我的公钥。 我的输出:

  • 问题内容: 我已经开始为API编写包装,该包装要求所有请求都通过HTTPS进行。我不想在开发和测试它时向实际的API发出请求,而是希望在本地运行自己的服务器来模拟响应。 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑。 我的服务器看起来像这样: Pem文件是使用以下命令生成的: 一个请求看起来像这样: 通过此设置,我得到了,所以我认为我需要为该请求添加一个选项。 所以我的问题是我

  • 我必须使用在HTTPs上运行的rest服务。制作人给了我证书和方法参数。您能告诉我如何使用该服务以及如何使用代码中的证书吗。我使用的是Spring4和Java8。请分享代码片段。

  • 当使用Citrus测试框架对服务器进行测试时,我无法禁用证书检查。 我得到以下错误:org.springframework.web.client.resourceAccessException:“”的POST请求上的I/O错误:证书与证书主题的公共名称不匹配:;嵌套异常是javax.net.ssl.SSLException。 下面是用于在Citrus中创建endpoint的代码片段: 任何想法都欢

  • 问题内容: 我正在尝试获取远程服务器的证书,然后可以将其用于添加到我的密钥库中并在我的Java应用程序中使用。 一位资深开发人员(正在度假:()告诉我可以运行此程序: 为了获得原始证书,我可以将其复制并导出。我收到以下输出: 我也尝试过这个选项 和这个(在debian上运行) 但是得到同样的错误。 此消息源说我可以使用该CApath标志,但似乎无济于事。我尝试了多条路径都无济于事。 请让我知道我要

  • 嗨,我想用Swift发出Https请求。当前im通过ip地址访问本地服务器。通过访问证书,本地服务器有一个SSL证书。要向服务器发出请求,当前我正在这样做。 我已经在plist中使用了上述代码来发出请求 在plist中,我已经给出了这样的结果,但我仍然得到了这样的错误