代码之家  ›  专栏  ›  技术社区  ›  Steffen

如何在JAX-WS客户端上指定客户端证书和客户端证书身份验证

  •  2
  • Steffen  · 技术社区  · 8 年前

    我正在用Java编写JAX-WS客户机。对WebService的访问受客户端证书保护。我知道客户端证书是正确的,因为只有当客户端证书被导入(在Firefox中)时,我才能在Firefox中获得WSDL。

    但我在编写应该使用WebService的java应用程序时遇到了问题。我要做的是:

      MyOwnService svc = new MyOwnService(getServerURL(), MYOWNSERVICE_QNAME);
    ...
    ...
    private URL getServerURL() throws IOException {
      URL url = new URL((String) cfg.get(ConfigData.SERVER_URL));
    
      HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
    
      try {
        con.setSSLSocketFactory(getFactory(new File("/etc/pki/wildfly/client.keystore"), "123456"));
      } catch (Exception exc) {
        throw new IOException("Client certificate error!", exc);
      }
    
      return url;
    }
    
    private SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword ) 
      throws ... {
    
      KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
      KeyStore keyStore = KeyStore.getInstance("PKCS12");
    
      InputStream keyInput = new FileInputStream(pKeyFile);
      keyStore.load(keyInput, pKeyPassword.toCharArray());
      keyInput.close();
    
      keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());
    
      SSLContext context = SSLContext.getInstance("TLS");
      context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());
    
      return context.getSocketFactory();
    }
    

    但这不起作用。如果运行此命令,则会在 MyOwnService 建造师

    java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty.
    

    如何实现支持客户端认证的JAX-WS客户端?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Steffen    8 年前

    忘记我上面的代码。似乎您唯一需要做的就是将密钥库指定为环境变量,如:

    -Djavax.net.ssl.keyStore=/etc/pki/wildfly/client.keystore -Djavax.net.ssl.keyStorePassword=123456
    

    如果我这样做并指定了正确的密钥库,它就会工作。如果我指定了一个无效的密钥库文件(其中包含另一个/错误的证书/密钥),它将无法工作:)。

    但是,如果密钥库包含多个密钥,我不确定Java如何从密钥库获取正确的密钥/证书 PrivateKeyEntry .指定 javax.net.ssl.keyStoreAlias 将不会产生任何影响。可能是Java尝试 PrivateKeyEntry(私人密钥输入) 直到找到合适的。。。

    然而:唯一要做的是将正确的密钥库指定为环境变量。