通常,我使用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
答案 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")))