15

我们需要在 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预计将在文件系统上。

此外,GAE 上不允许使用SSLSocketFactorySSLContextKeyManager和all 。KeyManagerFactory

更新:

从 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 发行说明

4

7 回答 7

2

从我对 SSL 授权的有限知识来看,您似乎在这里遗漏了一些至关重要的东西;证书。双向 SSL 要求客户端和服务器证书位于您的密钥库中,可以是自签名证书(pkcs12 或 pem 文件,您可以通过 shell 使用一些命令轻松生成)或由像 Thawte 或 Verisign 这样的授权公司。虽然我不确定这是否是您面临的问题,但最好检查一下。(另外,我是新手,所以请不要对我的回答投反对票,只是想提出可能的选择。)

于 2013-04-24T04:19:23.447 回答
1

听起来对通过 SSL ( https://...) 的简单连接和所谓的“相互身份验证”或“公钥基础设施 (PKI)”存在混淆。您实际上可以同时做这两个或一个独立于另一个。对于后者(我认为原始问题所指的内容),当您向服务器发出请求时,服务器将响应您要求您提供证书以进行身份​​验证。

要回答上面的特定问题(从二进制数据加载密钥库),我认为这不太可能,因为它是 Java 运行时在您的密钥库中提取。您唯一能做的就是从数据存储中加载这些位并将其临时写入磁盘。当应用程序存在时,可选择将其删除。这是我以前做过的,效果很好。如果您这样做,我建议使用可能可写的位置(例如System.getProperty("java.io.tmpdir"));),然后在将文件写入磁盘后,设置 JVM 属性(例如System.getProperties().put( "javax.net.ssl.keyStore","...");

于 2013-02-27T16:03:23.520 回答
1

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

于 2013-05-10T03:46:46.843 回答
1

我知道你可能不想听到这个,但是使用 SSL 是昂贵的,并且对于双向通信有问题。根据您对服务器/客户端的控制程度,我更喜欢简单的双向管道,如 Web 套接字和可以简单实现 AES 的数据包协议。这实际上取决于您要解决的问题。

于 2013-02-22T06:27:21.233 回答
1
ListenerSoap soap = new Listener().getListenerSoap();

希望改进

谢谢

于 2012-12-14T00:39:30.363 回答
1

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

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

于 2013-03-27T05:52:00.063 回答
0

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

于 2012-09-24T07:42:23.363 回答