如何使用Clojure检查TLS证书的到期日期?

时间:2019-02-10 01:12:56

标签: clojure openssl

通常,我使用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

2 个答案:

答案 0 :(得分:3)

可以通过interop使用Java API在Clojure中获取和检查服务器证书。

假设服务器使用HTTPS,则一旦处于连接状态,就可以从javax.net.ssl.HttpsURLConnection实例中检索证书。通过调用getInputStream方法来建立连接,并且getServerCertifcates方法将服务器证书作为java.security.cert.X509Certificate的数组返回。要获得HttpsURLConnection实例,我们必须在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"

答案 1 :(得分:0)

您可以使用shell执行命令。例如:

user=> (use '[clojure.java.shell :only [sh]])

user=> (println (:out (sh "openssl" "s_client" "-connect" "google.com:443")))