我正在尝试使用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 My -sky signature -pe -len 2048
我运行了相同的命令,只是将CN更改为我的主机名并替换了证书。现在,当我访问https网站时,我在firefox中收到警告(与使用fiddler时相同):
此连接不受信任。 我了解风险 - >添加例外
然后我收到此错误:
网站尝试使用无效信息进行身份识别。 错误的站点:证书属于不同的站点,可能表示身份被盗。 证书不受信任,因为它尚未得到公认的权威机构的验证。
然后我点击[确认安全例外],一切似乎都有效。
如何删除“错误的站点证书”错误?我是否错误地生成了证书?据我所知,在网站上的makecert.exe示例中,不包含私钥?谢谢!
答案 0 :(得分: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扩展名,则必须 用作身份。否则,(最具体的)通用名称 必须使用证书的Subject字段中的字段。虽然 使用Common Name是现有的做法,它已被弃用 鼓励证书颁发机构改为使用dNSName。
[...]
在某些情况下,URI被指定为IP地址而不是a 主机名。在这种情况下,必须存在iPAddress subjectAltName 在证书中,必须与URI中的IP完全匹配。
简而言之,如果请求的只是一个主机名,你可以在主题DN中只使用CN=hostname
RDN(虽然主题Alt名称会更好),但如果它是一个IP地址,你应该放一个IP地址主题备用名称条目(虽然有些浏览器可以让你在实践中使用CN RDN中的IP地址)。
如果您想要一个捕获TCP数据包但没有服务器名称指示的代理,您实际上可能会发现很难找到请求的实际主机名。我建议对IP地址(您应该能够找到)进行反向DNS查找,并为每个反向DNS条目添加DNS主题备用名称条目,以及IP地址的IP主题备用名称条目。这应该涵盖大多数情况,除了客户端使用IP地址没有反向DNS条目的主机名的情况。如果做不到这一点,你只需要在你的浏览器中手动添加例外(这很好,因为你知道你正在拦截你自己的通信)或者在你的代理中手动设置它。
在浏览器中配置HTTP代理时,查找主机名更容易,因为您不需要猜测主机名,它将传递给CONNECT
HTTP谓词。
(当然,首先,对于特定主机,您可以使用makecert
生成证书,而不是动态执行。)
答案 1 :(得分:0)
我认为您的自签名证书是用于该网站的证书,并且由于其自签名证书不受信任,您需要从VeriSign等购买证书以使该消息消失。
答案 2 :(得分:0)
使证书名称与主机名相同,即stackoverflow.com的“stackoverflow”。