Java web服务客户端-带密钥库

Java web服务客户端-带密钥库,java,keystore,webservice-client,Java,Keystore,Webservice Client,我需要创建一个带有密钥库的web服务客户端。但这是一个错误: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径 我的代码: private SSLSocketFactory getFactory() throws Exception { File pKeyFile = new ClassPathResource("jks/dex-client-issuer-wss.jks"

我需要创建一个带有密钥库的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文件,如何创建与此证书文件的连接?

“找不到有效的证书路径”(在SSL/TLS握手期间)与您的密钥库无关——这意味着服务器证书不会根据您的信任库进行验证,自从您将null作为第二个参数传递给
上下文之后,init
是JRE的默认值,它是由sysprop
javax.net.ssl.trustStore指定的文件,如果设置为其他
JRE/lib/security/cacerts
(或者
../jssecacerts
,如果存在)

该服务器正在使用根证书
Gemalto Business根证书颁发机构
下颁发的证书,该证书不包括在随Oracle Java软件包提供的cacerts中,也不包括我所知的任何其他已建立的信任库中,公共透明日志(per)也不知道该证书。SoapUI可能是作为开发、测试和调试工具设计的,它会忽略无效或可疑的证书,但该URL上的浏览器或
curl
wget
应该失败,除非您系统上的信任库已被修改或不正常。 OTOH
openssl s_客户端
,它也是一个主要的调试工具,报告一个错误,但仍然进行连接

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

获取证书的简单方法有:


  • openssl s_客户端-showcerts-connect主机:端口“找不到有效的证书路径”(在SSL/TLS握手过程中)与密钥库无关——这意味着服务器证书不会根据您的信任库进行验证,因为您将null作为第二个参数传递给了
    上下文。init
    是JRE的默认值,这是sysprop
    javax.net.ssl.trustStore
    指定的文件,如果设置为其他
    JRE/lib/security/cacerts
    (如果存在则为
    ../jssecacerts

    该服务器正在使用根证书
    Gemalto Business根证书颁发机构
    下颁发的证书,该证书不包括在随Oracle Java软件包提供的cacerts中,也不包括我所知的任何其他已建立的信任库中,公共透明日志(per)也不知道该证书。SoapUI可能是作为开发、测试和调试工具设计的,它会忽略无效或可疑的证书,但该URL上的浏览器或
    curl
    wget
    应该失败,除非您系统上的信任库已被修改或不正常。 OTOH
    openssl s_客户端
    ,它也是一个主要的调试工具,报告一个错误,但仍然进行连接

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

    获取证书的简单方法有:


    • openssl s_客户端-showcerts-connect主机:端口你确定找到了jks文件吗?嗨,是的,我确定文件是正确的,找到了文件类。你确定找到了jks文件吗?嗨,是的,我确定文件是正确的,文件类找到了它
      
      keytool -importcert -keystore jksfile -alias somealias -file thecertfile