我正在修改 OpenSSL s_client 页面 上给出的示例客户端代码以了解一些功能。我在链验证部分后添加了以下几行:
const SSL_CIPHER* curr_cipher = SSL_get_current_cipher(ssl);
printf("SSL_CIPHER_standard_name: %s\n", SSL_CIPHER_standard_name(curr_cipher));
printf("SSL_get_cipher_version: %s\n", SSL_get_cipher_version(ssl));
int kx_nid = SSL_CIPHER_get_kx_nid(curr_cipher);
printf("SSL_CIPHER_get_kx_nid: %d\n", kx_nid);
printf("OBJ_nid2ln(%d): %s\n", kx_nid, OBJ_nid2ln(kx_nid));
printf("SSL_CIPHER_description: %s\n", SSL_CIPHER_description(curr_cipher, NULL, 0));
使用 TLS 1.3 连接到 random.org 后,我没有使用密钥交换算法,而是得到了以下输出:
SSL_CIPHER_standard_name: TLS_AES_256_GCM_SHA384
SSL_get_cipher_version: TLSv1.3
SSL_CIPHER_get_kx_nid: 1063
OBJ_nid2ln(1063): kx-any
SSL_CIPHER_description: TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
SSL_CIPHER_get_kx_nid
的手册页显示,对于 TLS 1.3,它返回 NID_kx_any
。如何以编程方式从 NID_kx_ecdhe
对象获取握手中使用的实际密钥协议 (NID_auth_rsa
) 和身份验证协议 (SSL
)?
我也在寻找同样的东西。请检查您的 OpenSSL 发行版中是否提供此功能: