繁体   English   中英

GAE上的Web服务的双向SSL(java)

[英]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上不允许使用SSLSocketFactorySSLContextKeyManagerKeyManagerFactory

更新:

截至GAE SDK 1.7.7版。 这应该是可能的:

Similarly, Java developers can now use the javax.net.ssl package to make outbound SSL connections.

GAE 1.7.7 SDK发行说明

根据我对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","...");

您将需要App Engine的Socket API。 此API处于受信任的测试人员模式,因此并非适用于所有人。

您可以要求访问gere: https ://docs.google.com/spreadsheet/viewform formkey = dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ #gid = 0

据我所知,不支持双向SSL(从GAE托管的应用程序到外部世界)。 几个月前我尝试了一个示例应用程序,并且很惊讶地发现GAE甚至不支持这个基本功能..而且文档也不清楚。 当您联系网络服务时,您将无法提供客户端证书..没有地方存储它,无法访问密钥库。

对于我对双向SSL的了解,您将无法使用Java EE代码:双向SSL是传输层安全性:当您的客户端应用程序尝试使用该服务创建安全HTTP连接(HTTPS)时,服务器将索取证书并批准或不批准此证书。 如果客户端证书被批准,则将在各方建立安全连接,并允许它们通过此隧道交换一些消息。 但是这个过程是在传输层完成的。 您的代码(在应用程序层上)永远不会被告知此过程。 为了建立双向SSL,在SSL端口的应用程序服务器设置上完成设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM