HTTPS証明書の期限をPowerShellで確認する ― .NETのSslStreamを直接使う

ネットワーク・RFCカテゴリを表すパンダのイラスト ネットワーク・RFC

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。.NETのSslStreamとX509Certificate2仕様を確認し、HTTPS証明書の期限をPowerShellで確認するTIPSとして整理しています。

検証ステータス:📘 公式API確認済み・PowerShellサンプル実装済み・実機未確認

HTTPS証明書の期限をPowerShellで確認する ― .NETのSslStreamを直接使う

ブラウザで証明書画面を開かなくても、PowerShellからTLS接続してサーバー証明書を取得できます。使うのはPowerShell専用cmdletではなく、.NETの TcpClientSslStream です。

最小サンプル

$hostName = "example.com"

# TcpClientはTCP接続を担当する.NETクラスです。


# ここではまだTLSではなく、まず443番ポートへ接続します。

$tcp = New-Object System.Net.Sockets.TcpClient
$ssl = $null

try {
    $tcp.Connect($hostName, 443)

    # SslStreamをTCPの上に重ねることで、ここからTLS通信になります。

    $ssl = New-Object System.Net.Security.SslStream($tcp.GetStream(), $false)

    # TLSハンドシェイクを行い、証明書の名前や信頼性も検証します。

    $ssl.AuthenticateAsClient($hostName)

    # 接続先が提示した証明書を、扱いやすいX509Certificate2へ変換します。

    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($ssl.RemoteCertificate)

    # 証明書の有効期限(NotAfter)から現在時刻を引き、残り日数を求めます。

    $days = [math]::Floor(($cert.NotAfter.ToUniversalTime() - [DateTime]::UtcNow).TotalDays)

    $cert | Select-Object Subject, Issuer, NotBefore, NotAfter, Thumbprint
    "DaysRemaining = $days"
}
finally {

    # 途中でエラーになっても、TLS/TCP接続を確実に閉じます。

    if ($ssl) { $ssl.Dispose() }
    $tcp.Close()
}

AuthenticateAsClient でTLSのクライアント側認証を行い、その後 RemoteCertificate をX509Certificate2として読みます。

あえて証明書検証を無効化しない

ネット上には「コールバックで常に true を返して証明書を取得する」例もありますが、それでは期限確認ツールなのに無効な証明書を許してしまいます。

このサンプルでは既定の検証を使い、TLS認証に失敗したらエラーにします。障害調査では「接続できなかった」という事実自体が重要です。

残り日数を出す

NotAfter は証明書の有効期限です。現在時刻との差を取れば、監視スクリプトへ発展できます。

たとえば残り30日未満なら警告、7日未満なら重大、といった判定を追加できます。

flowchart LR
    A[TCP 443接続] --> B[SslStream]
    B --> C[TLS認証]
    C --> D[RemoteCertificate]
    D --> E[NotAfterを確認]

GitHubサンプル

公式情報・一次情報

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました