【问题标题】:Right way to do https mutual authentication based on certificates基于证书进行 https 相互认证的正确方法
【发布时间】:2011-08-02 08:35:58
【问题描述】:

我正在开发一个需要基于证书的双向 https 身份验证的 .net 项目,即客户端需要将请求与自己的证书相关联,并且 https 服务器可以根据证书对客户端进行身份验证。我弄清楚了粗略的工作流程,但不确定这是否是正确的方法:

在客户端:

HttpWebRequest 请求 = (HttpWebRequest)WebRequest.Create("请求 uri");
// 证书是来自 certStore 或证书文件的 X509Certificate2 实例
request.ClientCertificates.Add(cert); ;
在服务器端:
// req 是 HttpListenerRequest 实例
if (req.ClientCertificateError == 0)
{
X509Certificate2 clientCert = req.GetClientCertificate;
// 验证客户端证书
}

我的问题是:

1) 这是正确的做法吗?

2) 在服务器端,一旦它获得与请求关联的客户端证书,它会做什么来验证证书?假设我们可以在服务器上安装相同的客户端证书。

我是安全方面的新手。如果有人可以帮助解决问题或指出有用的文件,我将不胜感激。

【问题讨论】:

    标签: .net authentication https client certificate


    【解决方案1】:

    答案取决于您如何颁发客户证书。昨天我描述了procedure of validation in another question。该过程相当复杂,但根据客户端证书的颁发方式,您可以简化它。

    我认为您不会希望您的访问者购买证书来登录您的服务器。这意味着您需要自己为客户颁发证书。如果您颁发这些证书,您可以简单地将它们放入数据库,当客户端连接时,检查您的 clientCert 是否在数据库中。

    请注意,除了证书本身之外,您还希望在数据库中保留撤销信息,以便让用户知道如果证书不再有效,他们的证书会发生什么。

    证书生成过程是一个相当复杂的话题。我建议您在继续之前阅读一些有关 PKI 的书籍。以下是我推荐的好书:

    1. Rsa Security's Official Guide to Cryptography
    2. PKI: Implementing & Managing E-Security

    【讨论】:

    • 感谢您的回答。是的,我会向客户颁发证书。你能解释一下关于验证部分的更多信息吗?假设客户端证书已经安装在服务器的证书存储中,我如何将请求中的证书与本地存储中的证书进行比较?通过比较指纹...否?
    • @gigimei 我不知道是否需要在本地商店安装客户端证书,但我想肯定有其他方法。原因是从存储中读取(或在其中搜索)数千个证书需要相当长的时间。至于验证本身 - 您肯定需要通过检查证书的签名来验证完整性。然后你可以比较“指纹”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2014-01-11
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多