プロキシサーバーに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];
}
これは、クライアントに証明書を手動で信頼させる場合にもうまく機能します。
私の質問は次のとおりです。
- (すべての)クライアントに証明書を信頼させるにはどうすればよいですか?
- すべてのクライアントに有効などの種類の証明書がプロキシに必要ですか?
- 必要に応じて、クライアントにプロキシを信頼させるために、どのような種類のクライアント証明書をインストールする必要がありますか?
- opensslまたはmakecertを使用して必要な種類のプロキシを作成するにはどうすればよいですか?
ストリームを読み取って操作する必要があるため、SSL通信がプロキシをスローしたことをトンネリングしたくありません。
[更新]はい、GoogleとStackOverflowでの検索を使用しましたが、別の解決策を試しましたが、成功しませんでした。また、次のスレッドで解決策を試しました。
SSLStreamの例-機能する証明書を取得するにはどうすればよいですか?
C#でクライアントによるサーバー認証のためにサーバー名を識別するにはどうすればよいですか?
[UPDATE2]これは、opensslを使用してCAとサーバー証明書を作成するための非常に優れたチュートリアルですが、私には機能しません: http ://webserver.codeplex.com/wikipage?title=HTTPS&referringTitle=Home