[英]2-way SSL for web services on GAE (java)
我们需要在Google App Engine上实施双向SSL,我们使用JAX-WS向需要双向SSL身份验证的服务器发送Web服务请求。
我们如何为传出的Web服务请求设置双向SSL?
我们知道app Engine环境中禁止使用javax.net.ssl*
。
这是我们代码的一个例子:
@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服务使用双向SSL进行身份验证所需的必要值?
谢谢你的帮助
更新:
通过研究我已经看到这是如何在传统服务器上进行的(一个具有文件系统访问权限):
ListenerSoap soap = new Listener().getListenerSoap();
((BindingProvider) soap).getRequestContext().put("javax.net.ssl.keyStore", "client_cert.p12"
但是,在这种方法中, client_cert.p12
应该在文件系统上。
此外,GAE上不允许使用SSLSocketFactory
, SSLContext
, KeyManager
和KeyManagerFactory
。
更新:
截至GAE SDK 1.7.7版。 这应该是可能的:
Similarly, Java developers can now use the javax.net.ssl package to make outbound SSL connections.
根据我对SSL授权的限制知识,您可能会遗漏一些至关重要的内容; 证书。 双向SSL要求客户端和服务器证书位于密钥库中,密钥库可以是自签名证书(pkcs12或pem文件,您可以通过shell轻松生成一些命令)或由Thawte或Verisign等授权公司。 虽然我不确定你是否面临这个问题,但是很好看。 (另外,我是新手,所以请不要低估我的答案,只是尝试建议可能的选项。)
ListenerSoap soap = new Listener().getListenerSoap();
希望它有所改善
谢谢
我知道你可能不想听到这个,但使用SSL是昂贵的,并且对双向通信有问题。 根据您对服务器/客户端的控制程度,我更喜欢简单的双向管道,如Web套接字和可简单实现AES的数据包协议。 这实际上取决于您要解决的问题。
听起来像是通过SSL( https://...
)进行简单连接以及所谓的“相互身份验证”或“公钥基础结构(PKI)”存在混淆。 你实际上可以做两个或一个独立于另一个。 对于后者(我认为原始问题所指的是),当您向服务器发出请求时,服务器将响应您要求提供证书,您必须出示该证书以进行身份验证。
为了回答上面的具体问题 (从二进制数据加载密钥库),我认为这不可能,因为它是在运行密钥库的Java运行时。 您可以做的唯一想法是从数据存储区加载位并暂时将其写入磁盘。 (可选)在应用程序存在时删除它。 这是我以前做过的,并且运作得相当好。 如果你这样做,我建议使用一个可写的位置(例如System.getProperty("java.io.tmpdir"));
),然后在将文件写入磁盘后,设置JVM属性(例如System.getProperties().put( "javax.net.ssl.keyStore","...");
)
据我所知,不支持双向SSL(从GAE托管的应用程序到外部世界)。 几个月前我尝试了一个示例应用程序,并且很惊讶地发现GAE甚至不支持这个基本功能..而且文档也不清楚。 当您联系网络服务时,您将无法提供客户端证书..没有地方存储它,无法访问密钥库。
对于我对双向SSL的了解,您将无法使用Java EE代码:双向SSL是传输层安全性:当您的客户端应用程序尝试使用该服务创建安全HTTP连接(HTTPS)时,服务器将索取证书并批准或不批准此证书。 如果客户端证书被批准,则将在各方建立安全连接,并允许它们通过此隧道交换一些消息。 但是这个过程是在传输层完成的。 您的代码(在应用程序层上)永远不会被告知此过程。 为了建立双向SSL,在SSL端口的应用程序服务器设置上完成设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.