如何获取在 SSL 握手中生成的对称密钥?

How do I get symmetric key generated in SSL handshake?

During SSL handshake the client encrypts generated pre-master secret with the server's public key and sends to the server. Both Server and Client perform steps to generate the master secret with the agreed cipher. Both the client and the server use the master secret to generate the session keys, which are symmetric keys used to encrypt and decrypt information exchanged during the SSL session

http://www.symantec.com/connect/blogs/how-does-ssl-work-what-ssl-handshake

如何获取对称密钥,以便将其存储到数据库中并在每次客户端连接时使用相同的密钥?

服务器端和客户端都应该保存那个密钥并且永远不要再进行握手过程。下次(即使在断开连接之后)他们应该直接使用 https 上的对称密钥开始通信。

简而言之,我希望 SSL 会话永远持续下去。

编辑 Android 设备是客户端。每当客户端上线时,客户端-服务器只交换几个字节的数据。在这种情况下,SSL 是开销,不是吗?

你不能。协商的密钥应该是私有的。作为参考,我将 link 发送给 apache 环境变量。你会看到对称密钥不是其中之一

https://httpd.apache.org/docs/current/mod/mod_ssl.html

你可以得到sessionID,但是session如何复用必须留给SSL/TLS协议。它具有自动重新协商选项,因此您可以重用会话,即使服务器已经丢弃。该协议将决定您何时可以或不能重复使用。

https://www.rfc-editor.org/rfc/rfc5746

How do I get that symmetric key

你不能在 Java.

so that I can store that into database and use the same every time client connects?

您不能使用 SSL。

Both the server and client should save that key and never do handshaking process again.

你不能。会很不安全。

Next time(even after disconnecting) they should directly start the communication using symmetric key over https.

你不能。

In short, I want SSL session to last forever.

你不能,你也不想。会很不安全。

SSL is overhead in this case, isnt it?

这样的问题毫无意义。比什么?您无法将安全解决方案与不安全解决方案进行比较。如果您不想要安全性,请不要使用 SSL。

问题是:"How do I get that symmetric key, so that I can store that into database and use the same every time client connects?".

如果您只需要一个共享对称密钥,只需在客户端生成一个并通过 SSL 连接将其发送到另一端。使用 SSL 会话生成的对称密钥确实没有任何好处。

使用 SSL 生成的对称密钥和您生成的对称密钥有什么区别?

此外,当使用 TLS 1.2 和完全前向保密时,使用的对称密钥不是客户端在初始交换中生成的密钥,而是使用 Ephemeral Diffie-Hellman(ECDHE-RSA、ECDHE-ECDSA)生成的密钥。