临时加载SSL客户端密钥以在C#中进行客户端身份验证

时间:2020-03-06 14:23:13  来源:igfitidea点击:

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

我的想法是将客户端证书嵌入到应用程序中,并在通过我的应用程序连接时使用。有人对如何执行此操作有意见吗?或者使其唯一起作用的方法是将密钥加载到X509Store中。

如果我将其放在X509Store中,它将使我的密钥可用于Internet Explorer的常规使用吗?

解决方案

我们确定这是我们想要做的吗?如果我们将私钥嵌入到应用程序中(根据方法的需要),攻击者可以提取该私钥并将其用于对他们的恶意软件进行身份验证。

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

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

使用密钥的目的不是要验证用户,而是要限制对应用程序用户的访问,而不是使用任何WebBrowser。这是通过公共Internet进行的Intranet行为。

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

但是,如果还有其他想法将访问WebServer的权限限制为仅对应用程序的用户开放,则我愿意提出任何建议。基本上,我现在的愿望是使公共WebServer广泛开放,任何人都可以阅读,但是必须从不同的地方通过公共网络进行访问,因此也无法建立Intranet基础结构。

因此,这里有几点想法:

1.

我同意'erickson'的观点,即确认应用程序与我们当前的设计几乎不可能与该应用程序进行通信。有人逆向工程应用程序,然后结束其游戏,只是时间问题(如果那只是唯一安全性)。如果要验证其应用程序和有效用户,则需要对用户进行身份验证,并需要使用某种机制来检查相关应用程序的签名(我认为在客户端-服务器模型中这是不可能的)。 ..毕竟,我总是可以撒谎并说我的" hackyou"应用与" realapp"具有相同的签名,并且我们无法从服务器端进行验证)

2.

请记住,WebBrowser控件本质上是IE的包装,因此,如果没有一些技巧(我将在几秒钟内完成),则必须将证书添加到用户存储中。

3.

这是一种完成我们所要要求的技巧(尽管这是一个坏主意):

  • 首先使用WebRequest.Create创建一个HttpWebRequest对象
  • 从文件或者程序中编码的二进制流中手动加载X509Certificate2对象
  • 使用HttpWebRequest.ClientCertificates将证书添加到webrequest
  • 发送请求,获取响应
  • 通过将HttpWebResponse的ResponseStream推送到WebBrowser的DocumentStream来将响应发送到WebBrowser

从本质上讲,这意味着我们必须编写一些包装器类来处理与服务器之间的请求和响应,并且仅使用WebBrowser来处理HTML的查看。

实际上,我们需要重新设计并查看要处理的威胁!