0

我正在尝试使用 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 示例中了解,不包括私钥?谢谢!

4

3 回答 3

1

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

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

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

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

[...]

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

简而言之,如果请求的只是主机名,则只需CN=hostname在主题 DN 中使用 RDN 就可以了(尽管主题替代名称会更好),但如果它是 IP 地址,则应放置一个 IP 地址主题替代名称输入(尽管在实践中,某些浏览器会让您摆脱 CN RDN 中的 IP 地址)。

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

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

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

于 2012-02-02T01:55:58.243 回答
0

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

于 2012-02-02T01:40:43.217 回答
0

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

于 2012-02-02T01:46:28.143 回答