我想使用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/