代码之家  ›  专栏  ›  技术社区  ›  Rasmus Faber

如何在.NET SSLStream中为客户端身份验证指定接受的证书

  •  3
  • Rasmus Faber  · 技术社区  · 16 年前

    我正在尝试使用.NET System.Security.SSLStream类处理具有客户端身份验证的SSL/TLS流的服务器端。

    要执行握手,我使用以下代码:

    SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback);
    sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false);
    

    不幸的是,这会导致sslstream传输一个certificateRequest,其中包含我的cryptoAPI受信任根存储中所有证书的主题名。

    我想能够覆盖这个。我不能要求用户安装或从受信任的根存储中删除证书。

    看起来sslstream在下面使用sspi/securechannel,因此如果有人知道如何使用该API实现等效,那么这也会很有帮助。

    有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Rasmus Faber    16 年前

    看起来使用.NET库目前不可能做到这一点。

    我通过使用system.security.sslstream的单类库实现来解决这个问题,它可以更好地访问握手期间覆盖服务器行为的权限。

        2
  •  1
  •   Peter Ritchie    16 年前

    证书验证所做的是验证链中的所有证书。为了真正做到这一点,只需联系每个证书的根存储。

    如果您不想这样做,您可以在本地部署自己的根存储。

        3
  •  0
  •   Rasmus Faber    16 年前

    它不是我要更改的验证部分。问题在于初始握手时,服务器发送消息,通知客户机需要进行客户机身份验证(即certificateRequest消息)。作为此消息的一部分,服务器发送将作为客户端证书颁发者接受的CA的名称。它是默认情况下包含存储区中所有受信任根的列表。

    但是,如果可以覆盖单个应用程序的证书根存储,这可能会解决问题。这就是你的意思吗?如果是,我该怎么做?