none
暗号化された通信を強制する設定のSQLサーバーにjtdsドライバで接続するには RRS feed

  • 質問

  • Windows Server 2016のMicrosoft SQL Server2016に対して、jtdsドライバで接続しようとしてます。

    4つのSQLサーバーのうち3つは問題なく接続できたのですが、1台のみ不可です。

    接続する際の接続文字列は

    jdbc:jtds:sqlserver://SERVER:1433;database=TestDB;domain=WIN-DOMAIN;user=userid;password=password;useNTLMv2=true

    他3台と、失敗する1台の違いとして、「暗号化接続を強制する」設定があります。

    1台のみ、暗号化された接続を強制する設定となっております。

    https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/enable-encrypted-connections-to-the-database-engine?view=sql-server-ver15#to-configure-the-server-to-force-encrypted-connections

    暗号化された接続を強制するサーバーを構成するには

    jtdsドライバでの暗号化通信ではsslオプションがあるそうです。

    http://jtds.sourceforge.net/faq.html

    sslオプション(ssl=require,ssl=requiest)を接続文字列追加してテストしました。

    jdbc:jtds:sqlserver://SERVER:1433;database=TestDB;domain=WIN-DOMAIN;user=userid;password=password;ssl=request;useNTLMv2=true

    jdbc:jtds:sqlserver://SERVER:1433;database=TestDB;domain=WIN-DOMAIN;user=userid;password=password;ssl=require;useNTLMv2=true

    結果はいずれもエラー終了しました。終了メッセージは

    Exception in thread "main" java.sqlSQLException: Network error IOException: connection reset

    証明書をクライアントにインストールする必要があるのかと思い、以下を行いました。

    1).SQLサーバー上の証明書をエクスポート

     サーバーのコンソール→「証明書(ローカルコンピューター)」→「個人」にある証明書をエクスポート

    2).証明書をクライアントにインポート

     エクスポートしたファイルをクライアント保存

     クライアントのコンソール→「証明書(ローカルコンピューター)」→「個人」に、インポート

    上記を行って接続文字列を利用して接続テストを行いましたが同じエラーでした。

    何か原因と考えられることや対処方法がありましたら教えてください。

    某ツールを利用して、システム内のサーバー情報を収集するということをするのですが、そのツールで、SQLサーバーの情報を収集する際にjtdsドライバを利用します。

    ツールベンダーにも問い合わせしているのですが、今のところ原因不明のためこちらにも質問させていただきました。


    2020年3月27日 5:08

すべての返信

  • 「暗号化接続を強制する」設定を外した場合は、正常に SQL Server に接続することはできますでしょうか?

    通信の暗号化設定として、サーバー主体の暗号化 (強制的に暗号化) と、クライアント主体の暗号化があり、今回 サーバー主体の暗号化が有効になっている場合、クライアント側で暗号化を強制するとエラーが発生する可能性があります。

    [MSSQLSERVER のプロトコルのプロパティ] ダイアログ ボックス ([フラグ] タブ)
    https://docs.microsoft.com/ja-jp/sql/tools/configuration-manager/protocols-for-mssqlserver-properties-flags-tab?view=sql-server-ver15
    +  [強制的に暗号化]

    データベース エンジンへの暗号化接続の有効化
    https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/enable-encrypted-connections-to-the-database-engine?view=sql-server-ver15


    2020年3月27日 15:45
  • ありがとうございます。「暗号化接続を強制する」設定を外した場合は、正常に SQL Server に接続することができます。上記の接続文字列で接続できました。 (sslオプションはssl=off)
    2020年3月28日 1:17
  • JDBCの接続文字列に "encrypt=true;trustServerCertificate=true" を追加することで、サーバー主体の暗号化 (強制的に暗号化)が有効になっている状態でも、クライアントから該当のSQL Serverに接続することができるか確認されると良いかもしれません。



    • 編集済み NOBTA 2020年3月28日 5:59
    2020年3月28日 5:44
  • 補足ですが、JDBCの接続文字列 "encrypt=true;trustServerCertificate=true" でうまくいかなければ、"trustServerCertificate=true" の追加だけで正常に接続ができるようになるかを確認してもらうと良いかもしれません。

    2020年3月28日 6:21
  • ありがとうございます。

    使っているツールがjtdsドライバなのですが、JDBCで接続確認ができるか確認してみます。

    >通信の暗号化設定として、サーバー主体の暗号化 (強制的に暗号化) と、

    >クライアント主体の暗号化があり、今回 サーバー主体の暗号化が有効に

    >なっている場合、クライアント側で暗号化を強制するとエラーが発生する可能性があります。

    とありますが、これは何かサイト等に記載されているものがありましたら教えていただけるとありがたいです。

    2020年3月29日 0:00
  • Jtdsドライバーを完全にJDBCと読み違えていました。 JDBCと同様に、trustServerCertificateのような設定が出来ると良いのですが。クライアント主体の暗号化の件は、少し前となりますが、類似の現象を経験したことがあったので、記載した内容となります。サーバー主体の暗号化が有効になっている場合、クライアント側のドライバーが暗号化に対応していれば、一番簡単にクライアント-サーバー間をSSL通信することが可能な方法です。
    2020年3月30日 3:25
  • わかりましたありがとうございます。クライアントの設定等確認してみます。
    2020年3月30日 6:14
  • katsu0413さん、こんにちは。フォーラムオペレーターのクモです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    まず、サーバーとクライアントの両方で暗号化オプションを有効にすることはお勧めしません。
    これにより、不要なネットワークデータのやり取りが増加し、接続確立フェーズに大幅な遅延が発生し、TLS / SSL接続を確立できなくなる可能性があるからです。

    SQL Server構成マネージャーで[暗号化を強制する]オプションを[はい]に設定すると、クライアントが暗号化を要求するように構成されているかどうかに関係なく、SQL Serverはクライアントとの間で送信されるすべてのデータパケットを暗号化する必要があります。

    強制暗号化がSQL Server側で有効になっていて、クライアントで有効になっていない状態で、証明書を手動でSQL Serverに構成すると、クライアントが証明書を信頼していない場合でも、クライアントはこの証明書を使用してSQL Serverと正常に通信できるため、証明書をインポートする必要はありません。

    SQL Server側で「暗号化を強制する」を「はい」に設定する場合は、 ssl = offで接続することはできますでしょうか?

    クライアントがサーバー証明書を信頼して接続する必要がある場合は、クライアントの暗号化オプションを構成し、サーバー証明書のルート証明書、またはサーバー証明書をClient's Certificates > Trusted Root Certification Authorities ファイルフォルダーにインストールする必要があります。

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年3月31日 6:10
    モデレータ
  • クモさん、ありがとうございます。 > SQL Server側で「暗号化を強制する」を「はい」に設定する場合は、 ssl = offで接続することはできますでしょうか? →接続できませんでした。  なお、SQL Server側で「暗号化を強制する」を一時的に「いいえ」に設定し、ssl = offとした場合は接続できます。 >クライアントがサーバー証明書を信頼して接続する必要がある場合は、クライアントの暗号化オプションを構成し、サーバー証明書のルート証明書、またはサーバー証明書をClient's Certificates > Trusted Root Certification Authorities ファイルフォルダーにインストールする必要があります。 →こちらはまだやってないのでテストしようと思います。 手順は、上記、最初に私が記載した手順1)2)を行う(ただし、2)のインポート先が「個人」ではなく「信頼されたルート証明書」)で良いでしょうか? なお、jtdsドライバの原因(jtdsドライバ自体のバグ)の可能性もあるので、jtdsドライバの調査をドライバ提供元に並行して問い合わせております。
    2020年3月31日 23:07
  • jTDSって2013年以降の更新がないので、対応してないだけでは。ssl/tlsもバージョン上がってますし。 MicrosoftのJDBC Driverに乗り換えたほうがいいと思いますけどね。

    jzkey

    2020年4月1日 0:51
  • katsu0413さん、こんにちは。フォーラムオペレーターのクモです。
    ご返信いただきありがとうございます。

    接続できませんでした。なお、SQL Server側で「暗号化を強制する」を一時的に「いいえ」に設定し、ssl = offとした場合は接続できます。 
    これは証明書に関連しているようです。手動で構成した証明書を使用していますか?エラーログから確認できます。
    クライアントから暗号化されたデータ転送を要求する場合、クライアントはサーバーが使用する証明書を信頼しなければなりません。そうでない場合、接続を確立できません。

    以下の方法を試してください:
    1、クライアント証明書の信頼されたルート証明機関フォルダーに、サーバー証明書のルート証明書をインストールします。一般に、サーバー証明書の証明機関が信頼されることを確認できる場合は、この方法をお勧めします。
    2、信頼されたルート証明機関フォルダーに、サーバー証明書を直接インストールします。サーバー証明書のルート証明書が安全かどうかがわからない場合は、この方法をお勧めします。サーバーの証明書が自己署名されている場合は、この方法しか使用できません。

    この記事をご参照ください。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年4月1日 3:04
    モデレータ