Microsoft 365 Windows Server 2016 で SharePoint Online に接続できないときは TLS を疑いましょう

SharePoint Online Client Components SDK を利用している PowerShell が 2021 年 3月末ごろから時々接続不良を起こす事象が発生しました。

頻度がだんだんと高くなってきたため、調査し対処できたので書き留めておきたいと思います。

まず、原因は Windows Server 2016 を利用し PowerShell から .NET Framework を呼び出していたことで、 TLS 1.1で接続しに行っていたのです。

2020 年 10 月から TLS 1.1 以前の EOS に向けて Microsoft 365 の仕組みに手が入り始めているため、その影響を受けた。というのが顛末でした。

具体的には以下のようなコードを書いた場合に発生します。

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

中略

$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $pwd);
$context = New-Object Microsoft.SharePoint.Client.ClientContext($url)
$context.Credentials = $credentials
$lists = $context.Web.Lists
$context.Load($lists)
$context.ExecuteQuery()

疑似的に状況を作り出したのですが、以下のエラーが発生する形となります。

接続が切断されました:受信時に予期しないエラーが発生しました

f:id:mohessu:20210423120754p:plain

以下のコマンドを打つとわかるのですが、 TLS 1.2 のアクセスに対応していない結果となっています。

[Net.ServicePointManager]::SecurityProtocol

f:id:mohessu:20210423122927p:plain

以下のコマンドを打つことで、 TLS 1.2 への対応がなされます。(ただし .NET Framework 4.6 に対する Windows Update が行われている必要があります)

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

f:id:mohessu:20210423123117p:plain

この対応を行った後に ExecuteQuery を行うことで正常にデータを取得することができました。

f:id:mohessu:20210423123404p:plain

Microsoft 365 関連の PowerShell コマンドレット群は TLS 1.2 への対処が進んでいるのですが Client Components SDK は見落としていた。というのが原因でした。

皆さんも不安定な接続状況となったときは TLS 1.2 対応を見直してみましょう。

音楽:Fly up in the air