此Powershell Cert策略如何工作?

时间:2018-10-23 18:47:36

标签: .net powershell

为了解决我们的网站测试PowerShell脚本的问题,我们在调用Invoke-WebRequest之前添加了以下代码(每个thisthis

<category><pattern>STEP 1</pattern>
  <template>Step 2</template>
</category>
<category><pattern>YES</pattern><that>STEP 2</that>
  <template>step 3</template>
</category>
<category><pattern>NO</pattern><that>STEP 2</that>
  <template>step 3</template>
</category>
<category><pattern>*</pattern><that>STEP 2</that>
  <template>step 3</template>
</category>
<category><pattern>*</pattern><that>STEP 3</that>
  <template>Step 4! and you typed '<star/>'</template>
</category>

然后要添加有效的TLS策略,我们最近添加了:

Human : step 1
Robot : Step 2
Human : yes
Robot : step 3
Human : yes
Robot : Step 4! and you typed 'yes'
Human : step 1
Robot : Step 2
Human : no
Robot : step 3
Human : no
Robot : So. // ? I expected here step 4
Human : step 1
Robot : Step 2
Human : any
Robot : any is a name. // ? I expected here step 3

我的问题很简单。此代码如何影响Invoke-webrequest?据我所知,它没有直接链接到呼叫。没有任何内容适用于会话变量(很明显)。
我看到了一个对回调函数的引用,但是我仍然看不到add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy $login = Invoke-WebRequest "https://...." 如何作为回调传递。但是它有效。

2 个答案:

答案 0 :(得分:2)

PowerShell是一个.NET应用程序。 .NET个应用程序具有一个AppDomain(只有一个;这就是为什么您需要重新启动powershell.exe以清除会话的原因)。作为此过程的一部分,您有一个System.Net.ServicePointManagerto manage HTTP connections(我强烈建议您阅读本文以更全面地了解该知识)。


使用TrustAllCertsPolicy对象的第一部分代码的原因是由于自签名证书的不可信性质,这告诉了我要么

  1. 您的服务正在使用自签名证书
  2. 您的服务具有某些特定于公司的证书,您的工作站尚未导入

因此,它所做的就是让Invoke-WebRequest接受任何证书(如果您不知道要连接的内容,这很危险)。


使用SecurityProtocol的原因是Win7 / W2K8不支持TLS1.2作为默认设置。通常使用SCHANNEL registry keyssome additional reading)处理此问题,但默认情况下它们在那些平台上不存在(我可能会记错这部分),因此您的AppDomain默认为SSL3.0 / TLS1.0。我建议您在设置-bor时使用SecurityProtocol,以免破坏向后或向前的兼容性:

[System.Net.ServicePointManager]::SecurityProtocol =
    [System.Net.ServicePointManager]::SecurityProtocol -bor [System.Net.SecurityProtocolType]::Tls12

答案 1 :(得分:-1)

首先,我们要弄清楚,该Powershell有效地禁用了TLS,并使您的所有https请求都不安全,因为绝对不执行任何证书验证(它始终返回true)。

工作方式的工作原理如下:

  1. 您创建了一个新的证书验证器类,每当您询问“此安全性吗?”时,它会盲目地说“是”。
  2. 您在会话的静态ServicePointManager上分配策略。
  3. 您创建一个新的Web请求,该请求在内部引用静态ServicePointManager实例化证书策略,并对所有证书验证盲目地回答“是”。

我不确定您要使用这种方法解决什么问题,但是我不建议您使用这种方法。