| Works
PowerShellでTLS1.2や自己証明書への対応
わりと今さらな話題なのですが、ちょっとど忘れしてしまったときに探すのが面倒いのでメモです。
最近はのHTTPSではTLS1.1以前の古いプロトコルが無効化され、実質的にTLS1.2しか使えないケースが多々あります。
これに対してPowerShellの"Invoke-RestMethod"でアクセスしようとするとバージョンによって拒否されるので、その対策が必要となります。
また、ローカル環境では自己証明書が使われる機会も多いので、その対策と合わせたものをスニペット的に使っています。
PowerShellがデフォルトで対応しているプロトコルについてはOSのバージョンによるのかと思っています。Windows 7ではデフォルトでSSLv3とTLS1.0に対応していますが、これはPowerShell 5.1にアップデートしても変わりません。一方で最新のWindows 10 (1809) では、デフォルトでTLS1.0、TLS1.1、TLS1.2に対応しているようです。
PS C:\> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls
# Windows 10の場合
PS C:\> [Net.ServicePointManager]::SecurityProtocol
Tls, Tls11, Tls12
というわけで、TLS1.2が有効になっていない場合に"Invoke-RestMethod"等でTLS1.2を使うためには、以下の行を追加する必要があります。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
次に自己証明書を使う場合ですが、デフォルトだとやはりエラーになるので下記の文を追加します。
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
社内で使うスクリプトだと、この2つは概ねセットで使うことが多いですね。
【参考】
- .net - Powershell v3 Invoke-WebRequest HTTPS error - Stack Overflow
- PowershellのInvoke-RestMethodをhttpsに実施すると失敗する - suusan2号の戯れ