- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想使用 URLFetch 在 Google App Engine 应用程序中打开 HTTPS 连接服务。为了能够验证我的应用正在与之通信的服务器的 SSL 证书,我正在使用我自己的 keystore 文件。我想在 warmup request 中阅读此文件当我的应用程序加载时,即在执行任何 HTTPS 请求之前。 keystore 文件是我的 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 中使用自定义 keystore 吗?我在 GAE 文档中没有找到任何关于此的信息。 看起来虽然 Google 的 URLFetch 服务支持 HTTPS,但无法自定义 keystore 。这是正确的吗?
如果这是不可能的,这种方法是否仍然有效?或者是否有其他方法仍然允许我验证 SSL 证书?
更新
2009 年,来自 Google 的 App Engine 开发人员 Nick Johnson 在 https://groups.google.com/d/topic/google-appengine-python/C9RSDGeIraE/discussion 上说:
The urlfetch API doesn't allow you to specify your own client certificates, so unfortunately what you want to achieve is not currently possible.
这仍然正确吗?如果 App Engine 中的每个 HTTP(s) 请求都依赖于 URLFetch,这意味着自定义证书根本无法在 GAE 中使用。
最佳答案
我最近遇到了同样的问题,并且使用与 appengine-api-stubs 打包的 HttpClient 实现对我有用。
Maven 依赖:
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.9.18</version>
</dependency>
代码:
// create SSL Context which trusts your self-signed certificate
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);
// register your trusting SSL context
Protocol.registerProtocol("https",
new Protocol("https", (ProtocolSocketFactory) new SocketFactoryWrapper(sslContext.getSocketFactory()), 443));
// make the https call
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://myendpoint.com");
httpclient.executeMethod(httpget);
System.out.println(httpget.getStatusLine());
这基本上与
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
但出于某种原因或其他应用引擎不会阻止它。
关于java - 在 Google App Engine Java 应用程序中加载自定义 keystore ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042461/
我是一名优秀的程序员,十分优秀!