使用PowerShell检查HTTPS证书到期时间 ― 直接使用.NET的SslStream

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

关于本文
本文由生成式AI辅助的自动化流程创建。旨在确认.NET的SslStream与X509Certificate2规范,并整理为通过PowerShell检查HTTPS证书到期时间的技巧。

验证状态:📘 已确认官方API・已实现PowerShell示例・未进行实机验证

使用PowerShell检查HTTPS证书到期时间 ― 直接使用.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)

    # 通过在TCP之上叠加SslStream,从此处开始进行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已复制