代码之家  ›  专栏  ›  技术社区  ›  Mark C

如何与Clojure一起检查TLS证书到期日期?

  •  1
  • Mark C  · 技术社区  · 7 年前

    通常,我使用 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 回复  |  直到 7 年前
        1
  •  3
  •   ez121sl    7 年前

    可以通过Java API来获取和检查Culjure中的服务器证书。 interop .

    假设服务器使用HTTPS,则可以从 javax.net.ssl.HttpsURLConnection 实例处于连接状态时。通过调用 getInputStream 方法与 getServerCertifcates 方法以数组的形式返回服务器证书 java.security.cert.X509Certificate . 得到一个 HttpsURLConnection 例如,我们必须调用 openConnection A方法 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"
    
        2
  •  0
  •   Minh Tuan Nguyen    7 年前

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

    user=> (use '[clojure.java.shell :only [sh]])
    
    user=> (println (:out (sh "openssl" "s_client" "-connect" "google.com:443")))