我可以看到如何使用openssl s_server 和openssl s_client 来检查主密钥,但不能使用会话ID;我不知道为什么。
这就是我所做的。首先,我启动了一个在本地运行的服务器:
$ openssl s_server -accept 4433 -cert ./server.pem -tls1_2
然后,在另一个终端/窗口中,我连接到该服务器:
$ openssl s_client -connect 127.0.0.1:4433 -debug
在服务器终端中,我看到 SSL 会话已启动:
Using default temp DH parameters
ACCEPT
-----BEGIN SSL SESSION PARAMETERS-----
MFUCAQECAgMDBALAMAQABDDAOWXb47pESLXfWW1DYfaccOPGQcfgeaHW4sFP/avj
ejwVgvWNXGXy1vn6U3uLOeWhBgIEVqrm26IEAgIcIKQGBAQBAAAA
-----END SSL SESSION PARAMETERS-----
...
CIPHER is ECDHE-RSA-AES256-GCM-SHA384
Secure Renegotiation IS supported
这里要注意的关键是 SSL 会话参数的 base64 编码数据。我将该数据复制并粘贴到一个单独的文件中,例如sess.pem。
然后,我使用openssl sess_id 来解码sess.pem 文件:
$ openssl sess_id -noout -text < ./sess.pem
SSL-Session:
Protocol : TLSv1.2
Cipher : C030
Session-ID:
Session-ID-ctx: 01000000
Master-Key: 9C921511052D3F212FF718704518FC526474D69FC26BC1165DBD203C6E221BB3A84686BC5D15A7BD9FA7BB72201A7276
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1454040610
Timeout : 7200 (sec)
Verify return code: 0 (ok)
将该主密钥值与openssl s_client 终端显示的值进行比较(注意,使用openssl s_client 的-debug 命令行选项很重要):
...
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 417D443BFD5702BEA974C5758FD65A0FC217B0FD9750C4CECF0915895C4E616D
Session-ID-ctx:
Master-Key: 9C921511052D3F212FF718704518FC526474D69FC26BC1165DBD203C6E221BB3A84686BC5D15A7BD9FA7BB72201A7276
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
....
所以我不确定为什么服务器输出没有显示生成的会话 ID,但您至少可以使用上面的内容来比较 Master-Key 值。我尝试同时使用-context 和-id_prefix 命令行选项openssl s_server,例如:
$ openssl s_server -accept 4433 -context FOO -id_prefix BAR ...
但它并没有实质性地改变数据,也没有导致openssl s_server显示Session-ID。
希望这会有所帮助!