【问题标题】:c# proxy, generating certificate for https traffic?c#代理,为https流量生成证书?
【发布时间】:2012-02-24 17:33:19
【问题描述】:

我正在尝试使用 https:http://www.codeproject.com/Articles/93301/Implementing-a-Multithreaded-HTTP-HTTPS-Debugging 运行此代码

它在页面底部说我需要使用私钥制作一个新证书,以便使用 makecert.exe 通过 https 运行它。这是作者使用的命令:

makecert.exe cert.cer -a sha1 -n "CN=matt-dot-net" -sr LocalMachine -ss 我的 -sky 签名 -pe -len 2048

我运行了相同的命令,只是将 CN 更改为我的主机名并替换了证书。现在,当我访问 https 站点时,我在 firefox 中收到警告(与使用 fiddler 时相同):

此连接不受信任。 我了解风险 -> 添加例外

然后我得到这个错误:

该网站尝试使用无效信息来识别自己。 错误的站点:证书属于不同的站点,这可能表明身份被盗。 证书不受信任,因为它未经认可的权威机构验证。

然后我点击【确认安全例外】,一切似乎都正常了。

如何消除“错误的站点证书”错误?我是否错误地生成了证书?据我在网站上的 makecert.exe 示例中了解,不包括私钥?谢谢!

【问题讨论】:

    标签: c# https proxy makecert


    【解决方案1】:

    首先,您可以为您的应用程序生成自签名证书(具有 CA 基本约束)(您可以让您的应用程序自动生成它)并将该证书作为受信任的 CA 导入您的浏览器。

    然后,您可以根据请求的主机名即时生成新证书,该证书由您的 CA 颁发(即使用其私钥签名,并将 CA 的主题 DN 作为新证书的颁发者 DN)。在这个问题中有关于在 C# 中生成证书的详细信息:Is it possible to programmatically generate an X509 certificate using only C#?

    此证书必须遵循HTTP over TLS specification 的规范:

    如果存在 dNSName 类型的 subjectAltName 扩展,则必须 用作身份。否则,(最具体的)通用名称 必须使用证书的主题字段中的字段。虽然 通用名称的使用是现有的做法,它已被弃用并且 鼓励证书颁发机构改用 dNSName。

    [...]

    在某些情况下,URI 被指定为 IP 地址而不是 主机名。在这种情况下,iPAddress subjectAltName 必须存在 在证书中,并且必须与 URI 中的 IP 完全匹配。

    简而言之,如果请求的只是一个主机名,那么在主题 DN 中只需一个 CN=hostname RDN 就可以了(尽管主题替代名称会更好),但如果它是一个 IP 地址,你应该放置一个 IP addr Subject Alternative Name 条目(尽管实际上有些浏览器会让你在 CN RDN 中使用 IP 地址)。

    如果您想要一个捕获 TCP 数据包的代理,而无需指示服务器名称,您实际上可能会发现很难找到请求的实际主机名。我建议对 IP 地址(您应该能够找到)进行反向 DNS 查找,并为每个反向 DNS 条目放置一个 DNS 主题替代名称条目,并为 IP 地址放置一个 IP 主题替代名称条目。这应该涵盖大多数情况,除了客户端使用 IP 地址没有反向 DNS 条目的主机名的情况。否则,您只需在浏览器中手动添加异常(这很好,因为您会知道您正在拦截自己的通信)或在您的代理中手动设置它。

    使用在浏览器中配置的 HTTP 代理查找主机名更容易,因为您无需猜测主机名,它将被传递给 CONNECT HTTP 动词。

    (当然,首先,对于特定主机,您可以使用makecert 生成证书,而不是即时生成。)

    【讨论】:

      【解决方案2】:

      我会假设您的自签名证书是用于该站点的证书,并且由于它是不受信任的自签名证书,您需要从 VeriSign 或类似机构购买一个才能让消息消失。

      【讨论】:

      • portswigger.net/burp/help/servercerts.html 也让我们更深入地了解事物
      • 似乎您可能需要为每个 ssl 站点生成一个自签名证书
      • 谢谢!我实际上只是在寻找最后一条消息消失。我对第一条消息没意见。使用 fiddler 时,我收到相同的第一条消息,fiddler 也使用 makecert.exe 来生成证书。
      【解决方案3】:

      使证书名称与您的主机名相同,即 stackoverflow.com 的“stackoverflow”。

      【讨论】:

      • 谢谢!您是指我的主机名作为 Windows 中的计算机名称(例如“CN=Joe-Pc”)还是我尝试访问的主机名(例如“CN=gmail.com”)?
      • @user1015551,您尝试访问的主机名。这个答案可能应该说“即 stackoverflow.com 的“stackoverflow.com”。”
      • 主机有子域怎么办?
      • @user1015551:输入准确的主机名,例如www.google.comhttps://www.google.com/。 (如果您需要更多详细信息,请阅读我的回答中的 RFC 2818 链接。)如果您从 CONNECT 获取主机名,请确保不要输入冒号和端口号。
      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2023-01-04
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多