java - 在 Google App Engine 上使用 HttpsURLConnection 检索证书详细信息

标签 java google-app-engine ssl

我正在开发一个 Java 应用程序 - 将在 App Engine 上运行 - 它会定期检查我们的网络应用程序使用的 SSL 证书,并在它们即将过期时向我们发出警告。

我希望使用下面的代码,如果证书在 2 周内过期,它会抛出异常(我通过删除一些错误检查来简化它)。

GregorianCalendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_YEAR, 14);
Date twoWeeksInTheFuture = cal.getTime();

URL url = new URL(https_url);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

// Need the following line in order to establish a connection with the server
con.getResponseCode();

Certificate[] certs = con.getServerCertificates();
Certificate certificate = certs[0];
X509Certificate x509Certificate = (X509Certificate) certificate;
x509Certificate.checkValidity(twoWeeksInTheFuture);

该代码在 App Engine 之外运行良好(例如,在 Java 类的主要方法中)。但是,在 App Engine 中运行时会抛出以下异常:

java.lang.ClassCastException: com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection cannot be cast to javax.net.ssl.HttpsURLConnection
    at com.bronzelabs.httpschecker.servlets.cron.HttpsChecker.doGet(HttpsChecker.java:101)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)

HttpsURLConnection 在 whitelist of allowed classes 中所以必须有一种方法可以在 App Engine 上使用这个类(好吧,你会假设)。看起来您不能使用 URL.openConnection()。

有谁知道建立 HTTPS 连接(在 App Engine 上使用 Java)和查看 SSL 证书详细信息的方法?

注意:我看过 Google 的 URLFetchService。似乎没有任何方法可以访问证书(只有 HTTP 请求的内容)。

最佳答案

正如您(正确地)观察到的那样,在标准环境中无法使用内置的 URLFetchService 来执行此操作。有关您可以使用 URLFetchService 和 HTTPS 执行的操作的详细信息,请参阅 here .您可以使用第三方库来执行此操作,但是 request proxying也可能是一个障碍(试试 sockets API ,也许吧?);你可以尝试使用 flexible environment而不是取决于您的用例。

关于java - 在 Google App Engine 上使用 HttpsURLConnection 检索证书详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878599/

相关文章:

java - 创建一个 Squircle

java - 如何在 java.util.Properties 中引用另一个属性?

在 IBM MobileFirst Adapter 中使用内部 CA 时 WebSphere Application Server 中的 SSL 错误

c# - 使用 Key Vault 中的 SSL 证书配置 Kestrel

nginx - 安装 https 证书后在地理服务器、NGINX 上的 POST 和 PUT 请求 block

java - 如何使用 Spring 在枚举构造函数中注入(inject)参数?

java - 反编译的.class文件,字节码版本: 51. 0 (java 7)

google-app-engine - Google App Engine 灵活 - 路由到特定服务

python - ndb 是否可以与在 GAE 上不使用 ndb 而创建的实体一起使用?

python - 由于缺少 api 代理,从 Google Appengine 发送电子邮件失败