【发布时间】:2012-06-11 16:05:45
【问题描述】:
我们需要在 Google App Engine 上实现双向 SSL,我们使用 JAX-WS 将 Web 服务请求发送到要求双向 SSL 身份验证的服务器。
我们如何为传出的 Web 服务请求设置 2-way SSL?
我们知道 javax.net.ssl* 在 App Engine 环境中是被禁止的。
这是我们的代码示例:
@WebService(name="ListenerSoap", targetNamespace = "http://example.com/Listener.Wsdl")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface ListenerSoap {
@WebMethod(operationName = "Ping", action="http://example.com/Listener.Wsdl#Ping")
public void ping();
}
@WebServiceClient(name="Listener", targetNamespace="http://example.com/Listener.Wsdl", wsdlLocation = "https://example.com/Listener.asmx?WSDL")
public class Listener extends Service
{
public ListenerSoap getListenerSoap() {
return super.getPort(new QName("http://example.com/Listener.Wsdl",
"ListenerSoap"), ListenerSoap.class);
}
}
以及上面代码的使用示例:
ListenerSoap soap = new Listener().getListenerSoap();
soap.ping();
我认为我们可以将 DataStore 中所需的密钥库或任何证书存储为二进制对象(尽管如何上传它们对我来说仍然很模糊)。
我们如何设置此 Web 服务使用 2-way SSL 进行身份验证所需的必要值?
感谢您的帮助
更新:
通过研究,我发现这是如何在传统服务器(具有文件系统访问权限的服务器)上完成的:
ListenerSoap soap = new Listener().getListenerSoap();
((BindingProvider) soap).getRequestContext().put("javax.net.ssl.keyStore", "client_cert.p12"
但是,在这种方法中,client_cert.p12 应该在文件系统上。
此外,SSLSocketFactory、SSLContext、KeyManager 和 KeyManagerFactory 都不允许在 GAE 上使用。
更新:
从 GAE SDK 版本 1.7.7 开始。现在应该可以了:
Similarly, Java developers can now use the javax.net.ssl package to make outbound SSL connections.
【问题讨论】:
-
在 URLFetch 服务中有一个支持客户端证书的开放功能请求:code.google.com/p/googleappengine/issues/detail?id=3719
标签: java web-services google-app-engine ssl pki