我想使用URLFetch服务在 Google App Engine 应用程序中打开HTTPS连接。为了能够验证我的应用程序正在与之通信的服务器的 SSL 证书,我正在使用我自己的密钥库文件。我想在加载我的应用程序时(即在执行任何 HTTPS 请求之前)在预热请求中读取此文件。密钥库文件是我的 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 中根本无法使用自定义证书。