我想使用PowerShell 2.0从包含它的服务器上测试我们的Web服务器(位于Intranet上)是联机(1)还是脱机(0)。为此,我有一个脚本,可导航到页面并检查页面上是否有html字符串。

function Get-HeartBeat {
    $isAlive = $false

    try {
        $webclient = New-Object WebClient

        $userName = "xxx"
        $password = "xxx"
        $domain = "xxx"

        $url  = "ourUrl.com"
        $html = '<input type="submit">'

        $webclient.Credentials = New-Object System.Net.NetworkCredential($userName, $password, $domain)
        $webpage = $webclient.DownloadString($url)

        $isAlive = $webpage.Contains($html)
    } catch {
        # A WebException is thrown if the status code is anything but 200 (OK)
        Write-Host $_
        $isAlive = $false
    }

    return "$([Int32]$isAlive)"
}


不幸的是,这返回一个错误:


  带有“ 1”自变量的异常调用“ DownloadString”:“基础连接已关闭:无法建立SSL / TLS安全通道的信任关系。”


信任我们的证书的一种方法是使用以下证书策略创建类型(this answer的修改):

Add-Type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;

    public class TrustOurCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint servicePoint, X509Certificate certificate,
            WebRequest request, int certificateProblem)
        {
            return certificate.Issuer.Equals("OUR ISSUER")
                && certificate.Subject.Contains("our application");
        }
    }
"@

[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustOurCertsPolicy


仍然感到有点“字符串输入”,而不是100%安全。

这样安全吗?有没有更好的方法来创建一个接受了一个证书的WebClient? cert:LocalMachine\My中提供了我们应该信任的证书。

最佳答案

处理证书错误的正确方法是将Web服务器证书的证书链(根CA证书和中间CA证书)导入本地证书存储中(分别作为Trusted Root CA和Intermediate CA)。如果服务器证书是自签名的,则需要将服务器证书导入为受信任的根CA。

根据您实际需要检查的内容,另一种选择可能是修改算法。例如,如果您确实只需要一个心跳信号(不验证实际请求是否返回特定结果),则可以尝试建立与端口的TCP连接:

function Get-HeartBeat {
  $url  = 'ourUrl.com'
  $port = 443

  $clnt = New-Object Net.Sockets.TcpClient
  try {
    $clnt.Connect($url, $port)
    1
  } catch {
    0
  } finally {
    $clnt.Dispose()
  }
}


在较新的Windows版本上,可以将Test-NetConnection cmdlet用于相同的目的:

function Get-HeartBeat {
  $url  = 'ourUrl.com'
  $port = 443

  [int](Test-Net-Connection -Computer $url -Port $port -InformationLevel Quiet)
}

关于powershell - Web请求中HTTPS站点的信任证书,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35271192/

10-10 18:44
查看更多