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

c#代理,为https流量生成证书?,c#,https,proxy,makecert,C#,Https,Proxy,Makecert,我正在尝试使用https运行此代码: 它在页面底部说,我需要使用一个私钥创建一个新证书,以便使用makecert.exe通过https运行该证书。这是作者使用的命令: makecert.exe cert.cer-a sha1-n“CN=matt dot net”-sr LocalMachine-ss My-sky签名-pe-len 2048 我运行了相同的命令,只是将CN更改为我的主机名并替换了证书。现在,当我访问https站点时,我在firefox中收到一条警告(与使用fiddler时相同):

我正在尝试使用https运行此代码:

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

makecert.exe cert.cer-a sha1-n“CN=matt dot net”-sr LocalMachine-ss My-sky签名-pe-len 2048

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

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

然后我得到这个错误:

网站试图用无效信息标识自己。 错误站点:证书属于其他站点,这可能表示身份被盗。 证书不受信任,因为它未经认可的机构验证

然后单击[确认安全异常],一切似乎都正常


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

我假设您的自签名证书是站点使用的证书,因为它是一个不受信任的自签名证书,所以您需要从VeriSign或类似公司购买一个证书,以使消息消失。

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

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

然后,您可以根据请求的主机名动态生成一个新证书,该主机名由您的CA颁发(即,使用其私钥签名,CA的主题DN作为新证书的颁发者DN)。在这个问题中,有关于用C#生成证书的详细信息:

此证书必须符合以下规范:

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

[……]

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

简言之,如果请求的只是一个主机名,那么在Subject DN中只需一个
CN=hostname
RDN就可以了(虽然Subject Alt name会更好),但如果是IP地址,则应该输入IP addr Subject Alternative name条目(尽管在实践中,某些浏览器会让您不必担心CN RDN中的IP地址)

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

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


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

还提供了一些更深入的信息,例如您可能需要为每个ssl站点生成一个自签名证书。谢谢!我实际上只在查找最后一条消息。我对第一条消息没有意见。使用fiddler时,我会收到相同的第一条消息,fiddler也会使用makecert.exe生成证书。谢谢!您是吗将我的主机名作为windows中的计算机名(例如“CN=Joe Pc”)或我试图访问的主机名(例如“CN=gmail.com”)?@user1015551,您试图访问的主机名。对于stackoverflow.com,这个答案可能应该是“I.e.
stackoverflow.com
”如果主机有子域怎么办?没关系?@user1015551:输入准确的主机名,例如
www.google.com
for
https://www.google.com/
(如果需要更多详细信息,请阅读我答案中RFC 2818的链接。)如果您从
CONNECT
获取主机名,请确保不要输入冒号和端口号。