0

PowerShell检测HTTPS证书有效期脚本:3种实用方法+自动化监控方案

2026.05.26 | youres | 13次围观

PowerShell检测HTTPS证书有效期脚本:3种实用方法+自动化监控方案

HTTPS证书过期是导致网站无法访问的常见原因,尤其是有多台服务器、多个域名的运维场景,手动逐个检查效率极低。PowerShell作为Windows平台原生的自动化工具,无需安装额外依赖,就能快速实现HTTPS证书有效期的检测,甚至结合计划任务实现自动化监控。本文将介绍3种实用的PowerShell检测HTTPS证书有效期的脚本,覆盖单域名检测、批量检测、带邮件提醒的自动化监控场景,帮你彻底解决证书过期隐患。

方法一:使用Invoke-WebRequest快速检测单域名证书

Invoke-WebRequest是PowerShell自带的Web请求cmdlet,发起HTTPS请求时会自动获取服务端的SSL证书,我们可以通过解析返回的证书对象,直接拿到证书的过期时间。

单域名检测脚本示例:

$url = "https://www.youres.cn"
try {
    $request = [System.Net.HttpWebRequest]::Create($url)
    $request.GetResponse().Close()
    $cert = $request.ServicePoint.Certificate
    $expirationDate = $cert.GetExpirationDateString()
    $daysRemaining = ($cert.NotAfter - (Get-Date)).Days
    Write-Output "域名:$url"
    Write-Output "证书过期时间:$expirationDate"
    Write-Output "剩余天数:$daysRemaining"
} catch {
    Write-Output "检测失败:$($_.Exception.Message)"
}

这个方法的优势是无需额外依赖,PowerShell原生支持,适合快速检测单个域名的证书状态。缺点是会发起完整的HTTP请求,对于只需要获取证书的场景来说,有一定额外开销。

方法二:基于TCP连接批量检测多个域名证书

如果需要批量检测多个域名的证书,用TCP直接连接目标域名的443端口,获取SSL证书,可以避免HTTP请求的额外开销,效率更高。核心是通过System.Net.Sockets.TcpClient建立TCP连接,然后用System.Net.Security.SslStream获取证书。

批量检测脚本示例:

$domains = @("www.youres.cn", "blog.youres.cn", "shop.youres.cn")
$port = 443

foreach ($domain in $domains) {
    try {
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        $tcpClient.Connect($domain, $port)
        $sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream(), $false)
        $sslStream.AuthenticateAsClient($domain)
        $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($sslStream.RemoteCertificate)
        $expirationDate = $cert.NotAfter
        $daysRemaining = ($expirationDate - (Get-Date)).Days
        Write-Output "域名:$domain"
        Write-Output "证书颁发给:$($cert.Subject)"
        Write-Output "过期时间:$expirationDate"
        Write-Output "剩余天数:$daysRemaining"
        Write-Output "------"
        $sslStream.Close()
        $tcpClient.Close()
    } catch {
        Write-Output "域名:$domain 检测失败:$($_.Exception.Message)"
        Write-Output "------"
    }
}

这个方法的优势是效率高,不需要完成HTTP请求,只获取证书信息,适合批量检测几十甚至上百个域名的场景。缺点是需要处理TCP和SSL流的异常,代码稍微复杂一点。

方法三:带邮件提醒的自动化监控脚本

实际运维中,我们需要定期检测证书有效期,当剩余天数小于阈值(比如30天)时自动发送邮件提醒,避免证书过期。可以结合上面的批量检测方法,加上邮件发送逻辑,再通过Windows计划任务定期执行,实现全自动监控。

带邮件提醒的监控脚本示例:

# 配置部分
$domains = @("www.youres.cn", "blog.youres.cn")
$thresholdDays = 30
$smtpServer = "smtp.qq.com"
$smtpPort = 587
$smtpUser = "your_email@qq.com"
$smtpPass = "your_email_password"
$receivers = @("admin@youres.cn")

# 检测逻辑
$warningDomains = @()
foreach ($domain in $domains) {
    try {
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        $tcpClient.Connect($domain, 443)
        $sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream(), $false)
        $sslStream.AuthenticateAsClient($domain)
        $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($sslStream.RemoteCertificate)
        $daysRemaining = ($cert.NotAfter - (Get-Date)).Days
        if ($daysRemaining -lt $thresholdDays) {
            $warningDomains += [PSCustomObject]@{
                Domain         = $domain
                ExpirationDate = $cert.NotAfter
                DaysRemaining  = $daysRemaining
            }
        }
        $sslStream.Close()
        $tcpClient.Close()
    } catch {
        $warningDomains += [PSCustomObject]@{
            Domain = $domain
            Error  = $_.Exception.Message
        }
    }
}

# 发送邮件提醒
if ($warningDomains.Count -gt 0) {
    $mailBody = "以下域名HTTPS证书即将过期或检测失败:`n`n"
    foreach ($item in $warningDomains) {
        if ($item.Error) {
            $mailBody += "域名:$($item.Domain) 检测失败,原因:$($item.Error)`n"
        } else {
            $mailBody += "域名:$($item.Domain) 过期时间:$($item.ExpirationDate),剩余天数:$($item.DaysRemaining)`n"
        }
    }
    $mailMessage = New-Object System.Net.Mail.MailMessage
    $mailMessage.From = $smtpUser
    foreach ($receiver in $receivers) {
        $mailMessage.To.Add($receiver)
    }
    $mailMessage.Subject = "HTTPS证书过期预警"
    $mailMessage.Body = $mailBody
    $smtpClient = New-Object System.Net.Mail.SmtpClient($smtpServer, $smtpPort)
    $smtpClient.EnableSsl = $true
    $smtpClient.Credentials = New-Object System.Net.NetworkCredential($smtpUser, $smtpPass)
    $smtpClient.Send($mailMessage)
    Write-Output "预警邮件已发送"
} else {
    Write-Output "所有域名证书剩余天数均大于$thresholdDays天,无需提醒"
}

配置好脚本后,打开Windows计划任务程序,创建一个每天执行的计划任务,触发脚本运行,就能实现证书有效期的全自动监控,彻底避免证书过期导致的线上故障。

相关文章推荐

以上3种PowerShell检测HTTPS证书有效期的脚本,覆盖了从单域名快速检测到批量自动化监控的全场景,无需额外依赖,开箱即用。建议根据自身场景选择合适的方案,尤其是多域名运维的场景,一定要配置自动化监控,避免证书过期影响业务可用性。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论