
アプリケーションと Sql Server 2008 間の転送に SSL を実装する必要があります。
私は Windows 7、Sql Server 2008、Sql Server Management Studio を使用しており、アプリケーションは C# で書かれています。
私は証明書の作成に関するMSDNページに従っていましたが、これ「特定のクライアントの暗号化」の下にありますが、どうしようもなく混乱してしまいました。暗号化を正常に実装するための道をさらに進むには、いくつかの小さなステップが必要です。
まず、MMC がわかりません。そこにはたくさんの証明書がありますが、これらは自分の暗号化に使用する証明書ですか、それともすでに存在するものに使用されている証明書ですか? また、これらの証明書はすべてローカル コンピューターにあるファイルだと思いますが、なぜ「Personal」というフォルダーがあるのでしょうか?
次に、上記の問題を回避するために、自己署名アセンブリでちょっとした実験をしました。上記の MSDN リンクに示されているように、SSMS で実行される SQL を使用して自己署名証明書を作成しました。次に、次の接続文字列を使用して接続しました。
Data Source=myServer;Initial Catalog=myDatabase;User ID=myUser;Password=myPassword;Encrypt=True;TrustServerCertificate=True
接続して、動作しました。その後、作成したばかりの証明書を削除しましたが、それでも動作しました。明らかに何も動作していなかったのですが、なぜでしょうか。実際に「動作」しているかどうかはどうすればわかりますか。SSMS からファイルをクライアントに (何らかの方法で) 転送する中間ステップが抜けているのではないかと思います。
自分が何をしているのか全く分からないので、何か助けやアドバイス、コメント、参考資料などがあれば、とてもありがたいです。
よろしくお願いします。 :)
答え1
MSDNの仕様を正しく理解していれば、接続文字列で指定するだけで済みます。Encrypt=True;TrustServerCertificate=True
。つまり、クライアントは暗号化を要求し、サーバーが使用するあらゆる証明書を受け入れる他に利用可能なものがない場合、サーバーは起動時に生成された自己署名証明書を常に使用します。クライアントがどれでも証明書がある場合は、サーバーの一時的な自己署名証明書も受け入れられ、他の証明書と同様に有効です。
このような設定により、アプリケーションとサーバー間の通信チャネルが暗号化され、簡単に盗聴されることはありません。しかし、このチャネルは悪意のある中間者攻撃に対して無防備です。攻撃者がクライアントを騙して接続させることができれば、彼サーバーの代わりに(例えば、DNSレコード、より正確にはクライアントが使用するDNSサーバーのIPを制御することで、これは制御するのが簡単なDHCP設定です)、攻撃者はどれでも証明書を発行し、クライアントがそれを受け入れると、クライアントとの完全な認証ラウンドトリップが可能になり、使用された SQL ユーザー名とパスワードを取得できます。その後、実際のサーバーに接続し、すべての通信をやり取りして、すべてのコンテンツを自由に確認できます。クライアントは「監視」されていることに気付くことはありません。これが「中間者」攻撃です。
上記の状況を防ぐために、クライアントは削除する必要がありますのTrustServerCertificate=True
から。ただし、これが完了すると、サーバーが使用する証明書はもっているクライアントに信頼されるには、この段階ですべての問題が生じます。暗号化されたトラフィックがある弱い設定で問題ないとしても、理解するそのあなた5月中間者攻撃を受ける可能性があっても構わないのであれば、もっと単純なTrustServerCertificate=True
設定を使用してください。そうでない場合は、残念ながら、自分が何をしているのかを本当に理解している必要があり、それは簡単なことではありません。データがそれで重要なら、サーバー用の VeriSign、Thawte、または GlobalSign (これらはすべての Windows クライアントが信頼する 3 つのルート) 証明書にお金をかける (年間約 500 ドル) のは、それほど無理なことではないかもしれません。
答え2
「個人」は証明書ストアの名前として誤解を招くものです。MMC で選択可能な証明書が表示されている場合は、おそらく問題ありません。実際の証明書を使用することをお勧めします。これは、Microsoft 証明書サーバーを使用して社内で作成された証明書、または証明書プロバイダーから購入した証明書です。自己署名証明書は使用しないでください。有効にするには、SQL Server インスタンス サービスも再起動する必要があります。
一般的なヒント:
クライアントで暗号化を適用する場合、クライアント上のすべての SQL 通信でトランスポート レベルの暗号化を使用する必要があります。
サーバー上で暗号化を適用する場合、そのインスタンスのすべての SQL 通信でトランスポート レベルの暗号化を使用する必要があります。
選択した構成 (選択的または強制的) に関係なく、アプリケーションではさまざまな接続オプションのサポートが必要です。たとえば、Encrypt 接続キーワードなどです。
個人的には、SQL ネイティブ クライアントの方が組み込みの SQL クライアントよりも詳細なエラー メッセージを提供することがわかりましたが、どちらでも暗号化を使用/強制できます。
Microsoft のドキュメントは少し大まかですが、良い記事がいくつかあります。
SQL Server への安全な接続を選択的に使用する
リンク
Microsoft 管理コンソールを使用して SQL Server インスタンスの SSL 暗号化を有効にする方法
http://support.microsoft.com/kb/316898
SQL Server Native Client での接続文字列キーワードの使用
http://msdn.microsoft.com/en-us/library/ms130822.aspx