关于本文
本文由生成式AI辅助的自动化流程创建。旨在确认.NET的SslStream与X509Certificate2规范,并整理为通过PowerShell检查HTTPS证书到期时间的技巧。验证状态:📘 已确认官方API・已实现PowerShell示例・未进行实机验证
使用PowerShell检查HTTPS证书到期时间 ― 直接使用.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)
# 通过在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を確認]


コメント