Web服务客户端-带有密钥库

问题描述 投票:0回答:1

我需要创建一个带有密钥库的Web服务客户端。但这是错误:

sun.security.provider.certpath.SunCertPathBuilderException:无法查找到所请求目标的有效认证路径

我的代码:

private SSLSocketFactory getFactory() throws Exception {

          File pKeyFile = new ClassPathResource("jks/dex-client-issuer-wss.jks").getFile();

          KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("PKIX");
          KeyStore keyStore = KeyStore.getInstance("JKS");

          InputStream keyInput = new FileInputStream(pKeyFile);
          keyStore.load(keyInput, pass.toCharArray());
          keyInput.close();

          keyManagerFactory.init(keyStore, pass.toCharArray());

          SSLContext context = SSLContext.getInstance("TLS");
          context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

          return context.getSocketFactory();
    }

这是http连接:

URL url = new URL("https://dexxis-demo1.gemalto.com/DEX/communication/issuer-interface");
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setSSLSocketFactory(getFactory());

我只有一个可与soap ui一起使用的dex-client-issuer-wss.jks文件,如何创建与此证书文件的连接?

java keystore webservice-client
1个回答
0
投票

'无法找到有效的认证路径'(在SSL / TLS握手期间)与您的密钥库无关-这意味着server证书不会针对您的truststore进行验证,这是因为您作为第二个arg传递给context.init的参数是null,这是JRE的默认值,如果设置为javax.net.ssl.trustStore(如果存在JRE/lib/security/cacerts,则为sysprop .../jssecacerts指定)。

该服务器正在使用在根证书Gemalto Business Root Certificate Authority下颁发的证书,该证书不包含在Oracle Java软件包随附的cacert中,也不包括我知道的任何其他已建立的信任库,并且公共透明日志也不知道(每个[C0 ])。 SoapUI,可能是因为它被设计为开发,测试和调试工具,因此会忽略无效或可疑的证书,但是该URL上的浏览器或https://crt.shcurl应该会失败,除非系统上的信任库已被修改或不正常。OTOH wget也是主要的调试工具,reports是一个错误,但仍然可以建立连接。

如果您确实要信任该CA或其(两个)中间产品之一或站点,则需要在信任库中拥有适当的证书。 usual做法是信任根CA证书,但是Java支持使用链中的任何证书(包括EE证书)作为锚。由于您已经在创建自己的上下文和密钥管理器,因此您最好创建自己的信任管理器,而不是修改JRE默认值,该默认值(通常)依赖于平台/环境,并且有时很棘手。您可以获取所需的证书,并将其放在单独的密钥库文件中(请参见下文),进行加载并使用它来创建信任管理器。或者,因为您已经拥有自己的密钥+证书的密钥库文件,所以Java支持在同一文件中同时包含一个或多个privateKey条目一个TrustedCert条目或一个其他参与者的条目,因此您可以只需将其证书添加到现有的JKS中,并在openssl s_client中使用相同的KeyStore对象,就像TrustManagerFactory为上下文创建trustmanager数组一样。

获得证书的简便方法是:

  • KeyManagerFactory(在Windows openssl s_client -showcerts -connect host:port </dev/null上)-端口443;如今,许多服务器都需要服务器名称指示扩展名(又名SNI),对于1.1.1以下的OpenSSL,您必须添加<NUL:来提供它,但此服务器不需要。这会从服务器为每个证书输出一个PEM块,并在每个标签之前显示-servername hosts: (subjectname)。请注意,在第一个证书(即EE证书要求的)之后,此服务器以自上而下的顺序而不是自下而上的顺序发送CA证书。从技术上讲,这违反了RFC 5246(或更早的4346或2246);用于TLS1.3的RFC 8446允许它,因为它已经是一个常见的扩展,并且Java JSSE特别支持它。

  • i: (issuername)-也支持keytool -printcert -rfc -sslserver host,但默认值为443,适合您。这仅输出PEM块,因此,如果您从我的上一项中不了解该订单,则必须解码每个以找出是哪个,或者只是进行实验,直到找到正确的一个。

    ] >
  • 无论哪种情况,都将所需的PEM块放入文件中,然后执行

host:port

keytool -importcert -keystore jksfile -alias somealias -file thecertfile 仅是required

,在文件中是唯一的(如果将其放在自己的文件中,这是微不足道的),并且不区分大小写(通常为小写),但应为描述性或助记性的,并且仅字母数字如果可能的话。然后使用上面生成的文件。
© www.soinside.com 2019 - 2024. All rights reserved.