Linux CLI 檢查 HTTPS (SSL) 憑證過期時間

於 Linux CLI 想要檢查 Domain 的 HTTPS (SSL) 憑證的過期時間,要怎麼做呢?

Linux CLI 檢查 HTTPS(SSL) 憑證過期時間

Linux CLI 要如何抓取憑證的建立、過期日期,可以使用 openssl 來達成此需求

下述取自此篇:OpenSSL: Check SSL Certificate Expiration Date and More

  • 命令:echo | openssl s_client -servername NAME -connect HOST:PORT 2>/dev/null | openssl x509 -noout -dates
  • 參數:
    • -servername NAME The TLS SNI (Server Name Indication) extension (website).
    • -connect HOST:PORT The host and port to connect to.

範例

  • echo | openssl s_client -servername blog.longwin.com.tw -connect blog.longwin.com.tw:443 2>/dev/null | openssl x509 -noout -dates
    notBefore=Mar 30 03:42:10 2018 GMT
    notAfter=Jun 28 03:42:10 2018 GMT

除了過期時間外,想要另外抓到註冊商等資訊,可以使用 issuer / subject 來達成

  • echo | openssl s_client -servername blog.longwin.com.tw -connect blog.longwin.com.tw:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates
    issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
    subject=CN = blog.longwin.com.tw notBefore=Mar 30 03:42:10 2018 GMT notAfter=Jun 28 03:42:10 2018 GMT

感謝 MT 用 PHP 改寫

  1. <?php
  2. $hosts = [
  3. 'longwin.com.tw',
  4. 'www.longwin.com.tw',
  5. 'blog.longwin.com.tw',
  6. 'name.longwin.com.tw',
  7. ];
  8. foreach ($hosts as $host) {
  9. $context = stream_context_create([
  10. 'ssl' => [
  11. 'capture_peer_cert' => true,
  12. 'verify_peer' => false,
  13. 'verify_peer_name' => false,
  14. 'SNI_enabled' => true,
  15. 'peer_name' => $host,
  16. ]
  17. ]);
  18. $socket = @stream_socket_client("ssl://$host:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
  19. if (!$socket) {
  20. error_log("Error: $errno - $errstr");
  21. continue;
  22. }
  23. $cert_data = stream_context_get_params($socket);
  24. $cert = openssl_x509_parse($cert_data['options']['ssl']['peer_certificate']);
  25. $valid_from = date('Y-m-d H:i:s', $cert['validFrom_time_t']);
  26. $valid_to = date('Y-m-d H:i:s', $cert['validTo_time_t']);
  27. $valid_days = round(($cert['validTo_time_t'] - time()) / 86400, 2);
  28. fclose($socket);
  29. echo "Host: $host\n";
  30. echo "Not Before: $valid_from\n";
  31. echo "Not After: $valid_to\n";
  32. echo "Days Left: $valid_days day(s)\n\n";
  33. }
  34. ?>

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Linux CLI 檢查 HTTPS (SSL) 憑證過期時間〉中有 7 則留言

    1. 呵呵,用這個確實是牛刀了~

      這個主要是想要寫成 script,然後可以定期或者檢查以防有快過期沒注意到的情況~

  1. 想請問一下
    subdomain 可以用SSL憑證嗎?
    我是用 Let's Encrypt SSL
    主網域已經有SSL了,可以直接加在子網域上面嗎?(同主機同IP)

  2. 我後來試了一下,用 PHP 避免呼叫 exec 的方法:

    ```php
    $hosts = [
    'longwin.com.tw',
    'www.longwin.com.tw',
    'blog.longwin.com.tw',
    'name.longwin.com.tw',
    ];

    foreach ($hosts as $host) {
    $context = stream_context_create([
    'ssl' => [
    'capture_peer_cert' => true,
    'verify_peer' => false,
    'verify_peer_name' => false,
    'SNI_enabled' => true,
    'peer_name' => $host,
    ]
    ]);

    $socket = @stream_socket_client("ssl://$host:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);

    if (!$socket) {
    error_log("Error: $errno - $errstr");
    continue;
    }

    $cert_data = stream_context_get_params($socket);
    $cert = openssl_x509_parse($cert_data['options']['ssl']['peer_certificate']);

    $valid_from = date('Y-m-d H:i:s', $cert['validFrom_time_t']);
    $valid_to = date('Y-m-d H:i:s', $cert['validTo_time_t']);
    $valid_days = round(($cert['validTo_time_t'] - time()) / 86400, 2);

    fclose($socket);

    echo "Host: $host\n";
    echo "Not Before: $valid_from\n";
    echo "Not After: $valid_to\n";
    echo "Days Left: $valid_days day(s)\n\n";
    }
    ```

    1. 哈哈,上一篇我努力幫你重編輯,看來還是沒用,留言沒辦法排版~

      我把你的程式加入這篇文章好了~~

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料