【问题标题】:Working with SSL client certificates embedded in the Request Header使用嵌入在请求标头中的 SSL 客户端证书
【发布时间】:2012-06-28 15:58:17
【问题描述】:

为了解决 SSL 终止负载平衡器的问题(它不会将客户端证书转发到应用程序服务器),我们的 ISP 已配置我们的环境,以便客户端证书在 HTTP 标头中转发到真实服务器(作为 X-Client-Cert)。

我将使用映射到已颁发证书的序列号的 PIN 对客户进行身份验证。但是如何从自定义标头中获取证书?

【问题讨论】:

    标签: asp.net security http-headers ssl-certificate


    【解决方案1】:

    我假设您知道可以使用

    获取证书数据
    String s = Request.Headers["X-Client-Cert"];
    

    现在的问题是证书以哪种格式添加到标题中。我会假设它是用 Base64 编码的。

    byte[] certdata = Convert.FromBase64String(s);
    

    然后您可以从中创建证书对象:

    X509Certificate cert = new X509Certificate(certdata);
    

    取决于负载均衡器是否检查客户端证书的有效性(以及它是否已由正确的根 CA 签发),您必须自己检查证书的有效性。

    之后你可以通过cert.GetSerialNumber();读取序列号

    【讨论】:

    • 谢谢,这看起来很完美,我会试一试。我最初确实尝试过类似的东西,但我被卡住了,因为我忘记了从 base64 解码。只有一件事 - 关于如何在我的工作站上重新创建此场景(标头中的证书)以进行本地开发和测试,您有什么建议吗?
    • 我假设您有权访问创建证书的证书机构 (CA)。使用它并为自己颁发一个证书和私钥。在浏览器中安装并测试它。
    • 我一直在这样做 - 好吧,使用 makecert 在本地生成它们。我正在考虑更多关于将 Base64 字符串从标头转换为 X509 证书的测试过程。
    • makecert 旨在生成测试证书(自签名)。如果您想通过证书进行客户端身份验证,您必须使用自己的 CA 设置自己的 PKI。如果您不熟悉这些术语,请熟悉公钥基础设施及其工作方式。在没有适当验证证书的情况下使用序列号是完全不安全的。
    • 出于开发目的,我一直遵循此处的步骤:yangsoft.com/blog/?p=105 欺骗 CA 并使用它来生成服务器和客户端证书。对于生产,我当然会使用由证书服务生成的适当的 CA 和 Kosher 证书。我现在有点惊慌(已经工作了几天!)这种方法有问题吗?
    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 2018-11-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多