HTTP および SSL を介してサーバーと通信するアプリケーションを C# で開発しています。サーバーから提供された証明書をプログラムに信頼させる方法はありますか? この証明書はソフトウェアと一緒に配布されるため、外部 CA を介さずにサーバーを識別できます。
明確化: クライアント アプリケーションで、クライアントにハードコードされた単一の証明書を信頼して、自分のサーバーのみを信頼するようにしたいと考えています。
BouncyCastleを使用できます。
DotNetUtilities
クラスにロードしますFromX509Certificate(X509Certificate)
Verify
サーバー証明書の公開鍵を呼び出すこのようにして、証明書の署名を確認します。これが最も安全な方法です。また、クライアントを更新せずにサーバー証明書を更新する可能性もあります。(CAがコース外で有効である限り)
ここでの検証のソース:http ://www.bouncycastle.org/viewcvs/viewcvs.cgi/csharp/crypto/src/x509/X509Certificate.cs?view = markup Line:540
私の意見では、安全なチャネルを持っていると信じて、これを行うことはできないと思います。私が間違っている場合は誰かが私を修正しますが、SSL の CA 信頼チェーンは、拇印が特定の値 (または証明書の他の部分) であることを確認するだけではありません。クライアントが正しいサーバーと通信していることを証明します (共有 CA キーのため)。このイラストは参考になります。手順 3 をスキップすると、サーバーはその ID をクライアントに証明できなくなります (証明書の検証をスローします)。
so that it will only ever trust my own server
SSL は、共有 CA 証明書 (verisign など) を使用してこれを保証します。意図したとおりに SSL を使用しないことを選択した理由が理解できないかもしれません。
編集: the_ajpが彼の回答で指摘しているように、証明書チェーンで完全な検証を行うライブラリ (弾む城など) があります。これらは手動で呼び出すことができます。