我正在开发一个道德黑客项目,通过OpenSSL监控所有加密数据包.我确实有公钥和私钥(证书文件).我的常规数据包解密的应用程序代码片段如下:
SSL_library_init();
ctx = InitCTX();
server = OpenConnection(hostname, atoi(portnum));
ssl = SSL_new(ctx); /* create new SSL connection state */
SSL_set_fd(ssl, server); /* attach the socket descriptor */
ShowCerts(ssl); /* get any certs */
SSL_write(ssl,acClientRequest, strlen(acClientRequest)); /* encrypt & send message */
bytes = SSL_read(ssl, buf, sizeof(buf)); /* get reply & decrypt */
SSL_free(ssl); /* release connection state */
Run Code Online (Sandbox Code Playgroud)
SSL_read基本上在握手时获得证书并利用它来解密数据.有没有办法离线提供相同的证书来解密数据.
任何帮助/指针都会非常值得注意.
一般来说,TLS 倾向于临时密钥交换、DHE 或 ECDHE。通过临时密钥交换,会话密钥(预主密钥和主密钥)是使用临时 Diffie Hellman 密钥的密钥协议计算的,而不是使用作为证书一部分的 RSA 或 ECDSA 密钥对。很多时候你无法做到这一点。
不过,您可以显式选择较旧的 RSA_ 密码套件之一。在这种情况下,预主密钥在客户端使用服务器的公钥进行加密。然后,服务器的私钥可以解密此预主密钥,使用 PRF(基于 HMAC 的密钥派生)计算会话密钥,然后验证/解密所有数据包。
使用 Wireshark应该可以做到这一点,是的。
请注意,TLS 1.3 将不再支持 RSA_ 密码套件。您必须捕获客户端的公钥和服务器的私钥、服务器的公钥和客户端的私钥,或者直接捕获会话密钥来解密流量。实际上,这是对 TLS 1.3 的常见抱怨之一;之后解密流量是不可能的。然而,这是设计使然;美国国家安全局也不能这样做。