4

プロキシサーバーにTcpListenerを使用し、クライアントとプロキシ間およびプロキシとターゲットサーバー間の通信にTcpCLientを使用して、C#でTCPプロキシを作成しています。これは本当にうまくいきます。

SSLおよびTLS暗号化通信もサポートする必要があります。これはほとんどうまくいきます。次のコードを使用して、プロキシからターゲットサーバーへのSslStreamを作成します。

var sslStream = new SslStream(remoteStream, false);
sslStream.AuthenticateAsClient(state.RemoteHost);

そして、次のコードを使用して、プロキシからクライアントへのSslStreamを作成します。

var sslStream = new SslStream(state.ClientStream, false);
sslStream.AuthenticateAsServer(certificate, false, SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, true);

証明書はX509Storeからロードされます。

X509Certificate2 certificate;
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=localhost", false);
store.Close();

if (certificates.Count == 0)
{
    Console.WriteLine("Server certificate not found...");
    return;
}
else
{
    certificate = certificates[0];
}

これは、クライアントに証明書を手動で信頼させる場合にもうまく機能します。

私の質問は次のとおりです。

  1. (すべての)クライアントに証明書を信頼させるにはどうすればよいですか?
  2. すべてのクライアントに有効などの種類の証明書がプロキシに必要ですか?
  3. 必要に応じて、クライアントにプロキシを信頼させるために、どのような種類のクライアント証明書をインストールする必要がありますか?
  4. opensslまたはmakecertを使用して必要な種類のプロキシを作成するにはどうすればよいですか?

ストリームを読み取って操作する必要があるため、SSL通信がプロキシをスローしたことをトンネリングしたくありません。

[更新]はい、GoogleとStackOverflowでの検索を使用しましたが、別の解決策を試しましたが、成功しませんでした。また、次のスレッドで解決策を試しました。

SSLStreamの例-機能する証明書を取得するにはどうすればよいですか?

C#でクライアントによるサーバー認証のためにサーバー名を識別するにはどうすればよいですか?

[UPDATE2]これは、opensslを使用してCAとサーバー証明書を作成するための非常に優れたチュートリアルですが、私には機能しません: http ://webserver.codeplex.com/wikipage?title=HTTPS&referringTitle=Home

4

1 に答える 1

0

すべてのリクエストに有効な単一の証明書はありません。だから私の考えはうまくいきません。ドメイン名ごとに単一のライセンスを生成することはできないためです。

しかし、答えは予想よりも簡単です。私の問題を解決するには、すべてのリクエストに対して証明書を作成する必要があります。

私がする必要があるのは:

  • 認証局として自己署名ルート証明書を作成するには
    • これをクライアントの「信頼されたルート証明機関」ストアにインストールします。
  • すべての着信要求に対してオンザフライでサーバー証明書を作成する
    • ルート証明書ツリーを使用してこの証明書に署名し、発行者を設定します
    • 必要に応じて、証明書をファイルまたはシステム証明書ストアにキャッシュできます。

(これはフィドラーでもまったく同じです)

于 2013-01-18T12:00:58.910 に答える