gpt4 book ai didi

c# - 使用 .NET sslstream 了解服务器/代理/客户端证书

转载 作者:行者123 更新时间:2023-11-30 13:02:49 26 4
gpt4 key购买 nike

我正在使用 C# 创建一个 TCP 代理,使用 TcpListener 作为代理服务器,使用 TcpCLient 作为客户端和代理之间以及代理和目标服务器之间的通信。这真的很好用。

我还必须支持 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 example - how do I get certificates that work?

How do I identify my server name for server authentication by client in c#

[更新2]这是使用 openssl 创建 CA 和服务器证书的非常好的教程,但它对我不起作用: http://webserver.codeplex.com/wikipage?title=HTTPS&referringTitle=Home

最佳答案

没有对所有请求都有效的单一证书。所以我的想法行不通。因为不可能为每个域名生成一个许可证。

但答案比预期的要简单:为了解决我的问题,我必须为每个请求创建一个证书。

我需要做的就是:

  • 创建自签名根证书作为证书颁发机构
    • 将其安装在客户端的“受信任的根证书颁发机构”商店中。
  • 为每个传入请求即时创建服务器证书
    • 使用根证书树签署此证书以设置颁发者
    • 如果需要,我可以将证书缓存在文件或系统证书库中。

(这在fiddler中是完全一样的)

关于c# - 使用 .NET sslstream 了解服务器/代理/客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14318116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com