web-dev-qa-db-ja.com

SQL Server 2016データベースメールでTLS 1.2を有効にする

私はこの問題に1週間近く戸惑っています。うまくいけば、私たちのコミュニティの誰かが同じ問題を経験し、すでに解決策を見つけています。

だからここに私の問題があります:

当社のポリシーに従って、TLS 1.2を有効にし、TLS 1.0およびTLS 1.1を無効にして、データベースメールがポート25経由で電子メールを送信できるようにしたいと考えています。

メールサーバーはExchange Server 2010で、SQL Server 2016(DeveloperおよびEnterpriseエディション)のボックスにはWindows Server 2016 StandardエディションのOSが搭載されています。

SQL Serverのバージョンは次のとおりです。

select @@version
----------------------------------------
Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119) - 13.0.4466.4 (X64) 
    Dec 22 2017 11:25:00 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)

ここに示すように、DBメール構成があります。

enter image description here

SSLをオンにするたびに問題が発生します

use msdb
exec dbo.sysmail_update_account_sp @account_id=2, @enable_ssl = 1;

SMTPメールがWindows認証、基本認証、匿名認証のいずれであっても、dbメールを送信することはできません。 dbメールログのエラーメッセージは次のとおりです。

メッセージ

メールサーバーの障害のため、メールを受信者に送信できませんでした。 (アカウント2を使用したメールの送信(2018-07-30T10:52:41)例外メッセージ:メールサーバーにメールを送信できません。(メールの送信に失敗しました。)

ただし、このSSLをオフにしても、送信されるdbメールには問題はありません。

では、SSLを有効にし、dbメールにTLS 1.2を使用するにはどうすればよいでしょうか。

以下のようにレジストリを追加してTLS 1.2を有効にしました

enter image description here

詳細はこちら link (FAQセクションを参照)

8
jyao

この質問には誰も答えられないようですので、マイクロソフトでサポートケースを開きましたが、MSサポートが明確な回答を得るためにさまざまな内部リソースを調べたところ、回答が返されるまでに約1週間かかりました。

要約は次のとおりです。

SQL ServerデータベースメールはSystem.Net.Mailを使用して作業を行います。System.Net.MailはTLS 1.2を使用してメールを送信できますが、ビルドランタイムバージョンが4.6以上の場合のみです。 SQL Server 2016 dbメールは.Net 3.5用に構築されているため、SQL Server 2016 dbメールは現在TLS 1.2をサポートしていません。

4
jyao

TLS1.2は、現在安全と見なされている唯一のバージョンのTLSです(2019年3月)。これを機能させるために必要な2つの必須の追加設定があることを発見するにはかなりの時間と労力を要しました。 次のようにすると、時間と労力を大幅に節約できます

これらは、問題を修正した2つの新しいレジストリ設定です

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

これは、最終的にこの情報を見つけたスレッドへの参照であり、スレッドの途中に埋め込まれています: https://stackoverflow.com/questions/33761919/tls-1-2-in-net-framework-4-

以下は、2つの新しい設定と上記のスレッドに既に表示されている設定を作成するためにまとめた単純な実行可能レジストリファイルの内容です(== --- ==)これにより、必要なレジストリ設定がすべて行われます* ):

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

注1:これらの設定を有効にするには、SQLを再起動する必要がありますが、新しい設定なので、Windowsを再起動する方が良いです.NET 4.x全般に影響します。

注2:SQLでは、TLS1.2を使用するには、メールプロファイルでSSLチェックボックスをオンにする必要があります

*注3:参考までにこのツールを動作させる前に、「ベストプラクティス」オプションを有効にして無料ツールのCrypto V2を実行しました。その後、新しい暗号バージョン3を使用して変更を確認しました。

うまくいけば、これによって他の人の時間、労力、フラストレーションが大幅に節約されます;)

9
Zeek

リンクされた記事 が明確に述べているので、それは奇妙です:

Windows 8.1およびWindows Server 2012 R2上の.NET Frameworkバージョン3.5 SP1に含まれるTLS v1.2のサポート

これは、MSサポートからの応答と矛盾します。 編集:このStackOverflowの質問 で見つかりましたが、.NET 3.5にはTLS 1.2のサポートが最初は含まれていませんでしたが、 MSによって後で追加されました:

Windows 7 SP1およびServer 2008 R2 SP1上の.NET Framework 3.5.1に含まれるTLSシステムのデフォルトバージョンのサポート

FAQセクションの読み方問題は、TLS 1.2を有効にするときに1つのレジストリキーを逃したことが問題だと思います。FAQセクションは、

正しいレジストリ設定は次のとおりです。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2] 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
  "DisabledByDefault"=dword:00000000
  "Enabled"=dword:00000001 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
  "DisabledByDefault"=dword:00000000
  "Enabled"=dword:00000001  

これらの設定は、サーバーコンピューターとクライアントコンピューターの両方に必要です。

しかし、あなたが提供したスクリーンショットでは、私は"Enabled"=dword:00000001"DisabledByDefault"=dword:00000000キーがありません。

またそれは言う:

TLS 1.1はSQL Server 2016でサポートされていますか?

はい。 SQL Server 2016およびWindowsバージョン上のSQL Server 2017には、TLS 1.0からTLS 1.2のサポートが付属しています。クライアント/サーバー通信にTLS 1.2のみを使用する場合は、TLS 1.0および1.1を無効にする必要があります。

これは、あなたが無効にする必要があります TLS 1.0および1.1を使用して1.2を使用するように解釈できますが、これについてはよくわかりません。

2