C# 保存https页面以便您可以证明来源

C# 保存https页面以便您可以证明来源,c#,https,cryptography,httpwebrequest,httpwebresponse,C#,Https,Cryptography,Httpwebrequest,Httpwebresponse,我理解这些东西是如何工作的,当您通过https从web服务器下载页面时,收到的信息应该包含可以对服务器进行身份验证的信息。我想保存这些信息,以便以后我可以证明该页面是从知道与服务器公钥匹配的私钥的人那里下载的 如何做到这一点?HTTPS和SSL与内容无关。具体来说,它无法向您证明您确实从该来源下载了这些数据。您必须执行数据包捕获,捕获密钥交换(并且,如果没有完美的保密性),然后只有在您自己拥有服务器的私钥的情况下,才能对其进行解密。您需要的是加密签名->如果您需要证明某些数据的来源,则该来源必须

我理解这些东西是如何工作的,当您通过https从web服务器下载页面时,收到的信息应该包含可以对服务器进行身份验证的信息。我想保存这些信息,以便以后我可以证明该页面是从知道与服务器公钥匹配的私钥的人那里下载的


如何做到这一点?

HTTPS和SSL与内容无关。具体来说,它无法向您证明您确实从该来源下载了这些数据。您必须执行数据包捕获,捕获密钥交换(并且,如果没有完美的保密性),然后只有在您自己拥有服务器的私钥的情况下,才能对其进行解密。您需要的是加密签名->如果您需要证明某些数据的来源,则该来源必须对其进行签名。然后,您可以使用该实体的公钥来验证他们是否确实对其进行了签名。但这需要一个服务器端实现,而且它不能真正融入基本的HTML页面,因为浏览器真的不知道如何处理签名数据并将其解释为HTML。(AFAIC)@zaitsman所以用SSL传输的数据是用我自己的公钥加密的,而不是由发送者签名的?软件如何知道数据来自正确的来源并且没有经过处理?它根本不知道:)当您使用SSL时,数据包中的数据实际上是使用客户端和服务器之间协商的会话密钥加密的。由于密钥只存在于会话的两端,如果使用了EC或完美保密,那么在当今世界中,强行使用或猜测该密钥是不切实际的。这就是数据不被篡改的原因——如果被篡改就无法解密。客户不知道数据是否来源于某个来源;但它只能解密使用会话密钥加密的内容。数据上有一个身份验证标记,但该消息身份验证标记仅用于传输安全,并且在收到TLS消息后将被丢弃。它是使用特定于会话的密钥创建的。它们是用临时DH键创建的。验证这些的唯一方法是使用服务器的公钥;换句话说,这不是最实际的事情。