C# 在C中临时加载用于客户端身份验证的SSL客户端密钥#

C# 在C中临时加载用于客户端身份验证的SSL客户端密钥#,c#,.net,http,ssl,.net-2.0,C#,.net,Http,Ssl,.net 2.0,我正在使用WebBrowser控件将WebInterface添加到C#应用程序。我的愿望是验证只有这样的应用程序能够使用SSL客户端证书连接到我们的Web服务器 我的想法是将客户端证书嵌入到应用程序中,并在通过我的应用程序连接时使用。有人对怎么做有什么建议吗?或者,使其工作的唯一方法是将密钥加载到X509Store中 如果我把它放在X509Store中,它会使我的密钥可用于Internet Explorer的一般用途吗?你确定这就是你想要做的吗?如果您在应用程序中嵌入私钥(根据您的方法),攻击者

我正在使用WebBrowser控件将WebInterface添加到C#应用程序。我的愿望是验证只有这样的应用程序能够使用SSL客户端证书连接到我们的Web服务器

我的想法是将客户端证书嵌入到应用程序中,并在通过我的应用程序连接时使用。有人对怎么做有什么建议吗?或者,使其工作的唯一方法是将密钥加载到X509Store中


如果我把它放在X509Store中,它会使我的密钥可用于Internet Explorer的一般用途吗?

你确定这就是你想要做的吗?如果您在应用程序中嵌入私钥(根据您的方法),攻击者可以提取私钥并使用它来验证其恶意软件

服务器无法对客户端软件进行身份验证。它只能测试客户端是否拥有某些秘密。当您将私钥嵌入客户端并分发它时,它将不再是秘密


我建议对软件用户进行身份验证,而不是对软件本身进行身份验证。你需要让用户生成他们自己的秘密,无论是密码还是私钥,并鼓励他们保护它。

使用密钥的目的与其说是验证用户,不如说是限制对应用程序用户的访问,而不是使用任何网络浏览器。这是一种公共互联网上的内部网行为

这是一个穷人的DRM。由于人们提取钥匙而造成的损失并不那么重要。我认为发生这种情况的风险很低,我们可能失去的东西也很小


尽管如此,如果有任何其他想法限制只允许应用程序用户访问Web服务器,我愿意听取任何建议。基本上,我现在的愿望是拥有一个完全开放的公共Web服务器供任何人阅读,但是从不同的地方通过公共网络访问是必要的,因此建立内部网基础设施也是不可能的。

因此,这里有几点想法:

1. 我同意“埃里克森”的说法,用你目前的设计来验证只有你的应用程序才能与应用程序通信几乎是不可能的。有人对你的应用程序进行反向工程,然后游戏结束只是时间问题(如果这是你唯一的安全形式的话)。如果你想验证它是你的应用和一个有效的用户,那么你需要对用户进行身份验证,以及一些检查相关应用签名的机制(我认为这在客户端-服务器模式中是不可能的……毕竟我可以撒谎说我的“hackyou”应用程序与你的“realapp”具有相同的签名,而你无法从服务器端验证这一点)

2. 请记住,WebBrowser控件本质上是IE的包装器,因此如果没有一些技巧(稍后我将介绍),您必须将证书添加到用户存储中

3. 这里有一个简单的方法来完成你的要求(尽管这是个坏主意):

  • 首先使用创建HttpWebRequest对象
  • 从文件或程序中编码的二进制流手动加载X509Certificate2对象
  • 使用将您的证书添加到webrequest
  • 发送请求,获取响应
  • 通过将HttpWebResponse的ResponseStream推送到WebBrowser的DocumentStream,将响应发送到WebBrowser
这本质上意味着您必须编写一些包装器类来处理与服务器之间的请求和响应,并且只需使用WebBrowser来处理HTML的查看

事实上,你需要重新设计并审视你试图应对的威胁!