Windows Server 2016 上で TLS 1.2 を有効化したはずなのに、AWS Health Dashboard が「TLS 1.0 で送信されている」と警告し続ける、SQL Server 2016 の Database Mail が SMTP で接続失敗する――この症状は「OS ではなく .NET の既定動作」が原因で起きることが大半です。本記事では、根本原因の理解からレジストリ設定、再起動、検証、運用の落とし穴まで、現場で迷いなく実施できる手順を整理しました。
症状と前提の整理
代表的な相談は次の通りです。
- Windows Server 2016 に
Schannel\Protocols\TLS 1.2のレジストリキーを作ったのに、AWS Health Dashboard が「TLS 1.0 を検出」と通知する。 - SQL Server 2016 の Database Mail でメール送信が失敗し、SMTP サーバーのログには TLS 1.0 での接続試行が残る。
結論から言えば、OS(Schannel)は既に TLS 1.2 が既定で有効です。多くのケースでは、.NET Framework を使うアプリケーション(Database Mail など)が既定で TLS 1.0 を選んでいるため、アプリ層の既定値を OS 既定(= TLS 1.2)に揃える必要があります。
結論の先取り(まずここを満たす)
- OS 側は触らなくてよい:Windows Server 2016 は TLS 1.1/1.2 が既定で有効。
Schannel\Protocols\TLS 1.2サブキーは「無効化したい時」だけ必要。 - .NET の既定を揃える:レジストリで
SystemDefaultTlsVersionsとSchUseStrongCryptoを 32/64bit 両方に作成し1にする。 - 必ず OS を再起動:SQL Server サービスの再起動だけでは不十分。
- 複数方法で検証:Database Mail のテスト送信、PowerShell/openssl によるハンドシェイク確認、しばらくして AWS Health の警告消失を確認。
なぜこうなるのか:Schannel と .NET の関係
Windows の TLS 実装は OS コンポーネントである Schannel が担います。OS の既定では Windows 8 / Server 2012 R2 以降(= Server 2016 を含む)で TLS 1.1/1.2 が有効です。一方、多くの .NET アプリはアプリ側の既定で明示的な指定がないと古いバージョン(TLS 1.0)を選ぶことがあります。Database Mail は内部で .NET の SmtpClient を使用するため、この「アプリ層の既定」に引きずられます。
| レイヤー | 対象 | 既定 | 推奨変更 | 再起動の要否 |
|---|---|---|---|---|
| OS(Schannel) | Windows Server 2016 | TLS 1.1/1.2 有効 | 基本変更不要(旧 TLS を無効化するなら Schannel で明示無効) | 要(無効化/有効化時) |
| アプリ(.NET) | Database Mail / 独自 .NET アプリ | 状況により TLS 1.0 を選ぶ | SystemDefaultTlsVersions=1 と SchUseStrongCrypto=1 を 32/64bit 双方に設定 | OS 再起動が確実 |
実践手順:TLS 1.2 へ統一する
手順 1:OS の前提を確認(変更不要であることを知る)
Server 2016 は既に TLS 1.2 有効です。まず「無効化されていないこと」だけ確認します。PowerShell で該当キーが存在しない(= 既定有効)か、存在するなら Enabled が 1 になっていることを見ます。
powershell
# TLS 1.2 Client/Server の状態を確認(存在しなければ既定 = 有効)
'Client','Server' | ForEach-Object {
$p = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\$_"
Write-Host "`n[$p]"
Get-ItemProperty -Path $p -ErrorAction SilentlyContinue | Format-List *
}
ここで キーが無い場合は「明示的な無効化/有効化をしていない = 既定で有効」です。Enabled=0 や DisabledByDefault=1 が見つかったら、それは手動で無効化した痕跡なので一旦削除するか既定に戻します。
手順 2:.NET Framework の既定を OS 既定(TLS 1.2)に合わせる
管理者権限のコマンド プロンプトで次の 4 行を実行します。32/64bit の両方に設定するのが確実です。
cmd
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /f /reg:64
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /f /reg:32
SystemDefaultTlsVersions=1:OS の既定(= TLS 1.2)を優先して使う。SchUseStrongCrypto=1:古い暗号スイートや TLS 1.0 の利用を避ける。
補足:サーバーの .NET ランタイムが 4.7 以上の場合、実質的には OS 既定に追従しますが、上記 4 つの値を明示設定しておくと過去互換の問題を避けやすくなります。
手順 3:OS を再起動
レジストリ変更後はサーバーの再起動が必須です。SQL Server サービスの再起動だけでは .NET ランタイムの既定が反映されない場合があります。運用ウィンドウを確保し、計画的に再起動しましょう。
手順 4:Database Mail の設定と動作を確認
次の点を確認します。
- SMTP ポート:推奨は 587/STARTTLS。465/Implicit TLS を使う場合はサーバー側のサポートを確認。
- 認証方式:Database Mail は基本認証(AUTH LOGIN/PLAIN)を使用します。SMTP AUTH の可否や送信元アカウントの有効化を確認。
- 証明書:SMTP サーバーの FQDN と証明書の CN/SAN が一致していること、信頼されたルート証明機関であること。
Database Mail のテスト送信(管理スタジオ → 管理 → Database Mail → 右クリック → テストメールの送信)を実施し、結果を msdb のログで確認します。
sql
-- 送信
EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'既定プロファイル名',
@recipients = N'you@example.com',
@subject = N'TLS 1.2 検証',
@body = N'このメールが届けば TLS 1.2 で送れています。';
-- ログ確認
SELECT TOP(100) log_date, process_id, mailitem_id, event_type, description
FROM msdb.dbo.sysmail_event_log
ORDER BY log_date DESC;
手順 5:複数手段で TLS 1.2 を検証
- PowerShell での即時確認(スクリプト単体の既定変更):
powershell
# スクリプトの実行中のみ TLS 1.2 を強制(検証用)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# SMTP ホストの 587/STARTTLS 到達性を確認(通信路の確認)
Test-NetConnection smtp.example.com -Port 587
- OpenSSL でハンドシェイク確認:Windows 版 OpenSSL / WSL / Cygwin 等いずれでも可
bash
# STARTTLS(587)で TLS 1.2 のみを使って握手
openssl s_client -starttls smtp -connect smtp.example.com:587 -tls1_2 -servername smtp.example.com
ハンドシェイク詳細に TLSv1.2 が表示され、サーバー証明書の検証(Verify return code: 0)が成功していることを確認します。
AWS Health Dashboard の警告は消えるまでにラグが出る場合があります。検証が成功していれば、しばらくして通知が解消されます。
任意:旧 TLS(1.0/1.1)を OS レベルで明示的に無効化
互換性の影響を理解したうえで、ポリシーとして TLS 1.0/1.1 を無効化したい場合は Schannel のキーを作成します(Client/Server 両方)。
reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
注意:古いプリンター、ストレージ装置、レガシー業務アプリとの互換性が失われる可能性があります。まず検証環境でテストし、影響範囲を洗い出してから本番に適用してください。
よくある落とし穴(失敗例と対処)
| 症状 | 主な原因 | 対処 |
|---|---|---|
| AWS Health が「TLS 1.0」を通知し続ける | アプリ層の既定が TLS 1.0 / 検出にラグ | .NET レジストリ 4 つを設定し OS 再起動。アプリの再試行後、しばらくして解消を確認。 |
| Database Mail が接続失敗(一般的な失敗) | ポート/暗号/証明書の不一致、SMTP AUTH 側の許可未設定 | 587/STARTTLS を推奨。証明書の CN/SAN とホスト名一致を確認。送信元の SMTP AUTH を有効化。 |
| レジストリ設定を入れたが改善しない | OS 再起動未実施 / 32bit 側の設定漏れ / GPO で上書き | 必ず OS 再起動。/reg:32 も設定。GPO(コンピューターの構成)での競合を点検。 |
| 「リモート証明書が無効」エラー | 中間証明書の欠落、ホスト名不一致、期限切れ | 中間/ルート証明書の信頼を更新。SMTP サーバー名の FQDN を証明書と一致させる。 |
| 一部のクライアントだけ送信失敗 | 暗号スイート順序の不一致、古い OS/アプリ | サーバーの暗号スイート順序を見直し、必要に応じて互換性の高い順序を設定。 |
追加の確認ポイント(深掘り)
1).NET バージョンの把握
現在の .NET 4.x の Release 値を確認します(運用ルール上、4.7 以上を推奨)。
powershell
$k = 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'
(Get-ItemProperty -Path $k -Name Release).Release
2)イベントログ(Schannel)で握手エラーを特定
イベント ビューアー → Windows ログ → システム → ソース「Schannel」。36874/36888 などのイベントから、プロトコル/暗号の不一致や証明書エラーを特定できます。
3)グループポリシーの影響
暗号スイート順序や TLS の有効/無効は GPO でも上書き可能です。コンピューターの構成 → 管理用テンプレート → ネットワーク → SSL 構成設定の「SSL 暗号スイートの順序」などを見直します。GPO によるレジストリ上書きがあると、ローカルで設定しても次回適用で戻されます。
4)PowerShell 5.1 の既定
PowerShell 5.1 の既定は必ずしも TLS 1.2 ではありません。検証スクリプトの先頭で明示するか、.NET レジストリを設定しておきましょう。
powershell
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
5)SQL Server の累積更新
SQL Server 2016 は TLS 1.2 対応ですが、各機能ごとの修正が累積更新に取り込まれています。可能な限り最新のサービス レベル(SP/CU)へ更新しておくと、暗号スイートや証明書検証まわりの細かな不具合に遭遇しにくくなります。
設定の見える化:キーと意味の早見表
| キー | 種類 | 値 | 意味 | 場所 |
|---|---|---|---|---|
| SystemDefaultTlsVersions | DWORD | 1 | OS 既定(TLS 1.2)を優先して使用 | HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319(32/64) |
| SchUseStrongCrypto | DWORD | 1 | 強力な暗号スイートのみ許可、古い TLS/SSL を回避 | 同上(32/64) |
| Enabled(Client/Server) | DWORD | 0(無効化時) | 指定した TLS バージョンを無効化 | Schannel\Protocols\TLS x.x\{Client|Server} |
| DisabledByDefault(Client/Server) | DWORD | 1(無効化時) | 指定した TLS バージョンを既定で使用しない | 同上 |
Database Mail 向けの SMTP 設計ポイント
| 項目 | 推奨 | 理由 |
|---|---|---|
| ポート | 587(STARTTLS) | 明示的な TLS アップグレードで相互運用性が高い |
| 証明書名 | FQDN と CN/SAN を一致 | 証明書検証エラーを回避 |
| 認証 | SMTP AUTH(必要な最小権限) | アカウントとスコープを限定し監査性を高める |
| 暗号 | TLS 1.2 + 現行の AEAD(GCM) | 脆弱な暗号スイートの排除 |
最小構成の切り分け手順
- OS と .NET の既定化:本記事の 4 レジストリを設定し再起動。
- ネットワークの到達性:
Test-NetConnection smtp.example.com -Port 587で到達可否を確認(ファイアウォール、プロキシ)。 - ハンドシェイクの事実確認:
openssl s_client -starttls smtp -tls1_2でTLSv1.2を確認。 - Database Mail 単体検証:新しいプロファイルを作成し、短い件名/本文でテスト送信。msdb ログを確実に確認。
- SMTP 側の監査ログ:送信拒否の理由(暗号/証明書/認証)を相手側で確認。
安全な運用のためのチェックリスト
- バックアウト手順:適用前にレジストリのエクスポートを取得。
- GPO 管理:TLS/暗号に関わるポリシーは専用 GPO に集約し、ドキュメント化。
- 監視:Windows イベント(Schannel)、SQL Server エージェント ジョブ(Database Mail の定期疎通)を監視に組み込む。
- 更新:Windows Update と SQL Server の CU を計画適用。ルート証明書の更新も忘れずに。
- 審査:年に 1 回は TLS 設定と暗号スイートを棚卸し、不要な旧設定を除去。
FAQ
Q:Schannel\Protocols\TLS 1.2 のキーを作らないと TLS 1.2 は有効になりませんか?
A:いいえ。Windows Server 2016 ではデフォルトで TLS 1.2 は有効です。明示的に無効化したい時だけキーを作成します。
Q:.NET の 4 つのレジストリ設定は必須ですか?
A:Database Mail や一部の .NET アプリが TLS 1.0 を既定選択する挙動を避けるため、実質必須です。確実性の観点から 32/64bit の両方に作成してください。
Q:SQL Server サービスだけ再起動すれば反映されますか?
A:推奨しません。OS 再起動で .NET ランタイムの既定を確実に読み込ませてください。
Q:AWS Health の警告がすぐに消えません。
A:検出と可視化にタイムラグがある場合があります。検証コマンドと Database Mail の送信が TLS 1.2 で成功していれば様子見し、時間をおいて再確認してください。
Q:PowerShell の Send-MailMessage で動作確認できますか?
A:Send-MailMessage は非推奨です。通信確認は Test-NetConnection と OpenSSL のハンドシェイク、メール送信の本番想定は Database Mail でのテスト送信をお勧めします。
まとめ
Windows Server 2016 の TLS 1.2 対応は OS レベルでは既に完了しています。現場でつまずく主因は、.NET アプリの既定が OS と揃っていないことです。「.NET の 4 レジストリ」→「OS 再起動」→「複数手段で検証」の順序で対処すれば、Database Mail の送信失敗や AWS Health Dashboard の「TLS 1.0」警告は解消できます。さらに、ポリシーとして TLS 1.0/1.1 を Schannel で明示的に無効化する場合は、互換性の影響を十分に評価してから段階的に適用しましょう。設定の意図と根拠をチーム内で共有し、運用ドキュメントと監視まで含めて一気通貫で整えることが、トラブル再発を防ぐ最短ルートです。
付録:コピペ用スクリプト集
レジストリ設定(.NET 4 行)
cmd
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /f /reg:64
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /f /reg:32
TLS 1.0/1.1 の無効化(任意)
reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
PowerShell:SMTP 到達性と TLS 1.2 強制(検証用)
powershell
# 到達性
Test-NetConnection smtp.example.com -Port 587
# スクリプト内だけ TLS 1.2 を強制
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
OpenSSL:STARTTLS で TLS 1.2 を確認
bash
openssl s_client -starttls smtp -connect smtp.example.com:587 -tls1_2 -servername smtp.example.com
SQL:Database Mail の送信とログ確認
sql
EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'既定プロファイル名',
@recipients = N'you@example.com',
@subject = N'TLS 1.2 検証',
@body = N'このメールが届けば TLS 1.2 です。';
SELECT TOP(50) log_date, event_type, description
FROM msdb.dbo.sysmail_event_log
ORDER BY log_date DESC;
要点の再確認
- OS は既に TLS 1.2 が既定で有効(Server 2016)。
- .NET レジストリ 4 つを 1 に設定(32/64 両方)。
- サーバーを再起動して既定を反映。
- Database Mail / OpenSSL / PowerShellで複数経路から検証。

コメント