【发布时间】:2012-10-14 02:15:59
【问题描述】:
我想使用URLFetch 服务在 Google App Engine 应用中打开 HTTPS 连接。为了能够验证我的应用正在与之通信的服务器的 SSL 证书,我正在使用我自己的密钥库文件。我想在加载我的应用程序时(即在执行任何 HTTPS 请求之前)在 warmup request 中读取此文件。密钥库文件是我的 WAR 文件的一部分。
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(ClassLoader.getSystemResourceAsStream("myKeystoreFile"), "password".toCharArray());
trustManagerFactory.init(keystore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagers, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
但是,我不能使用这种方法,因为虽然 HttpURLConnection 在 GAE 的 JRE 白名单上,但 HttpsUrlConnection 不在。
还有其他方法可以在 GAE 中使用自定义密钥库吗?我在 GAE 文档中没有找到任何关于此的信息。 看起来虽然 Google 的 URLFetch 服务支持 HTTPS,但无法自定义密钥库。这是正确的吗?
如果这是不可能的,这种方法是否仍然有效?或者是否有其他方法仍然允许我验证 SSL 证书?
更新
2009 年,来自 Google 的 App Engine 开发人员 Nick Johnson 在https://groups.google.com/d/topic/google-appengine-python/C9RSDGeIraE/discussion 上表示:
urlfetch API 不允许您指定自己的客户端 证书,所以不幸的是你想要实现的不是 目前可能。
这仍然正确吗?如果 App Engine 中的每个 HTTP(s) 请求都依赖于 URLFetch,这意味着自定义证书根本无法在 GAE 中使用。
【问题讨论】:
-
事实证明,GAE's Google Code site 上有一个未解决的问题。
-
在 App Engine 上支持此功能需要什么? Google 的某个人能否概述一下实现这一点需要做些什么?
-
Leviticus 说他使用 Apache HTTP 客户端实现了这一点,请参阅 esxx.blogspot.com/2009/06/…。我仍在尝试理解他的方法。有人试一试吗?他把源码放到subversion这里:svn.berlios.de/svnroot/repos/esxx/trunk/jee/org/esxx/js/…
-
其实HttpsUrlConnection在白名单里:cloud.google.com/appengine/docs/java/jrewhitelist。然而,这个限制是针对标准环境的;您可以在灵活环境中使用任何您喜欢的库进行 SSL 连接。
标签: java google-app-engine https keystore urlfetch