通常我会使用该openssl命令检查服务器的证书到期时间,但我正在学习 Clojure,并且非常想弄清楚如何在可能的情况下不调用 shell 命令来执行此操作。
我将如何复制此功能?
$ openssl s_client -connect google.com:443 < /dev/null ^ /dev/null | openssl x509 -noout -enddate | awk -F'=' '{print $2}'
Apr 17 09:15:00 2019 GMT
Run Code Online (Sandbox Code Playgroud)
可以通过互操作使用 Java API 在 Clojure 中获取和检查服务器证书。
假设服务器使用 HTTPS,一旦处于连接状态,就可以从javax.net.ssl.HttpsURLConnection实例中检索证书。通过调用该getInputStream方法建立连接,该getServerCertifcates方法将服务器证书作为java.security.cert.X509Certificate数组返回。要获取HttpsURLConnection实例,我们必须调用 a 上的openConnection方法java.net.URL。该方法getNotAfter的X509Certificate返回证书过期日期。
在 Clojure 中,它看起来像这样:
(ns foo.core
(:require [clojure.java.io :as io]))
(defn get-server-certs [from]
(let [url (io/as-url from)
conn (.openConnection url)]
(with-open [_ (.getInputStream conn)]
(.getServerCertificates conn))))
(.getNotAfter (first (get-server-certs "https://www.google.com")))
;;=> #inst "2019-04-17T09:15:00.000-00:00"
Run Code Online (Sandbox Code Playgroud)