1

我正在尝试为 Google App Engine 上的 JAX-WS Web 服务客户端提供 2 路 SSL 身份验证。

javax.net.ssl.keystore我相对确定我可以通过强制转换为 BindingProvider 并设置属性来设置客户端的私钥,如下所示:

WebServicePortType service = new WebService().getWebServicePort();
((BindingProvider) service).getRequestContext().put("javax.net.ssl.keyStore", "client_cert.p12"

我能找到的所有示例都假定client_cert.p12是本地文件系统上的文件。

由于我们在 Google App Engine 上,因此禁止我们直接访问文件系统。

此上下文是否会接受密钥库位置的 URL?如果没有,有什么方法可以在不需要文件系统访问的 Web 服务上设置密钥库?

谢谢

编辑:

SSLSocketFactory, SSLContext, KeyManager, 和KeyManagerFactory所有在 GAE 上都是不允许的。

4

1 回答 1

2

我用谷歌搜索并从这里得到了以下解决方法。

  1. 将密钥库文件作为资源流读取:MyClass.class.getClassLoader().getResourceAsStream(jarCertFile);
  2. 将其写入本地文件
  3. 将 keystore 属性设置为本地文件,System.setProperty("javax.net.ssl.keyStore",trustStore);

但它需要您应该能够在 GAE 中创建一个本地文件,这在阅读您提到的链接后似乎是可能的。ServletContextListener您可以在应用程序启动时创建此文件的代码中配置此代码。

编辑:

此解决方法假定密钥库文件捆绑在您的应用程序存档中。

于 2012-06-28T18:52:49.027 回答