使用 Elixir 和 Erlang ssl 模块获取 SSL 证书

Obtaining SSL cert using Elixir and Erlang ssl module

我正在尝试借助 tls_certificate_check 库、Elixir 和对 Erlang :ssl 模块的一些调用来验证我的网站 SSL 证书。最终目标是获取证书的到期日期,可能还有一些其他元数据。这是我的代码:

defmodule ElixirSslCheck do
  def check do
    host = "www.lawlorbagcal.org"
    options = :tls_certificate_check.options(host)
    :ssl.connect(host, 443, options, 5000)
  end
end

iex 中 运行 之后,我看到了这个输出:

iex(4)> ElixirSslCheck.check                    
{:error,
 {:options,
  {:socket_options,
   [packet_size: 0, packet: 0, header: 0, active: false, mode: :binary]}}}

我不明白这是什么意思。阅读有关 :ssl.connect 函数的文档,我看到规范说我应该在 error 元组中接收 reason

 connect(Host, Port, TLSOptions, Timeout) ->
           {ok, sslsocket()} |
           {ok, sslsocket(), Ext :: protocol_extensions()} |
           {error, reason()} |
           {option_not_a_key_value_tuple, any()}

我回来的好像不是理由。我正在使用 tls_certificate_check 库,因为我认为它提供的 TLS 选项可以帮助我解决与我的 SSL 证书相关的任何奇怪问题。也就是说,它是通配符让我们加密证书。

任何人都可以帮助我进一步调试它并让我朝着正确的方向前进吗?一旦我解决了连接问题,我就在想下一步是调用 :ssl.peer_cert,我假设这会引导我到达证书到期日期等。

原来我应该为主机参数使用字符字符串而不是字符串:

defmodule ElixirSslCheck do
  def check do
    host = 'www.lawlorbagcal.org'
    options = :tls_certificate_check.options(host)
    :ssl.connect(host, 443, options, 5000)
  end
end

不同之处在于使用单引号而不是双引号。这与 :tls_certificate_check 库无关。