Cug*_*uga 15 java ssl google-app-engine web-services pki
我们需要在Google App Engine上实施双向SSL,我们使用JAX-WS向需要双向SSL身份验证的服务器发送Web服务请求.
我们如何为传出的Web服务请求设置双向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);
}
}
Run Code Online (Sandbox Code Playgroud)
以上代码的一个例子:
ListenerSoap soap = new Listener().getListenerSoap();
soap.ping();
Run Code Online (Sandbox Code Playgroud)
我想我们可以将DataStore中所需的密钥库或任何证书存储为二进制对象(尽管如何上传它们对我来说仍然是模糊的).
我们如何设置此Web服务使用双向SSL进行身份验证所需的必要值?
谢谢你的帮助
更新:
通过研究我已经看到这是如何在传统服务器上进行的(一个具有文件系统访问权限):
ListenerSoap soap = new Listener().getListenerSoap();
((BindingProvider) soap).getRequestContext().put("javax.net.ssl.keyStore", "client_cert.p12"
Run Code Online (Sandbox Code Playgroud)
但是,在这种方法中,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.
Run Code Online (Sandbox Code Playgroud)
据我所知,双向 SSL 与 Java EE 代码没有任何联系:双向 SSL 是一种传输层安全性:当您的客户端应用程序尝试与服务器创建安全的 HTTP 连接 (HTTPS) 时,服务器将索取证书并将批准或不批准该证书。如果客户端证书获得批准,则各方之间将建立安全连接,并且允许他们通过此隧道交换一些消息。但这个过程是在传输层完成的。您的代码(在应用程序层)永远不会被告知此过程。为了建立双向 SSL,需要在应用程序服务器上完成 SSL 端口设置。