この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。.NETのSslStreamとX509Certificate2仕様を確認し、HTTPS証明書の期限をPowerShellで確認するTIPSとして整理しています。検証ステータス:📘 公式API確認済み・PowerShellサンプル実装済み・実機未確認
HTTPS証明書の期限をPowerShellで確認する ― .NETのSslStreamを直接使う
ブラウザで証明書画面を開かなくても、PowerShellからTLS接続してサーバー証明書を取得できます。使うのはPowerShell専用cmdletではなく、.NETの TcpClient と SslStream です。
最小サンプル
$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を確認]

コメント