c#proxy,为https流量生成证书?

时间:2012-02-02 01:37:43

标签: c# https proxy makecert

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

3 个答案:

答案 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”。