es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener el algoritmo de acuerdo de clave utilizado en el handshake de TLS 1.3 utilizando la API OpenSSL?

Estaba modificando el código de ejemplo del cliente dado en la página de s_client de OpenSSL para entender algunas funciones. Añadí las siguientes líneas después de la parte de verificación de cadena:


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));

En vez de obtener el algoritmo de intercambio de clave usado, obtuve la siguiente salida después de conectarme a random.org usando TLS 1.3:

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

La página de manual de SSL_CIPHER_get_kx_nid dice que devuelve NID_kx_any para TLS 1.3. ¿Cómo puedo obtener programáticamente el acuerdo de clave real (NID_kx_ecdhe) y el protocolo de autenticación (NID_auth_rsa) utilizado en el handshake del objeto SSL?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener programáticamente el protocolo de autenticación y el acuerdo clave real utilizado en el handshake desde el objetoSSL, se pueden utilizar las siguientes funciones:

    • Para el algoritmo de intercambio de claves: se pueden utilizar las funciones SSL_get_cipher_bits oSSL_CIPHER_get_bits. Devuelven el nombre del algoritmo de intercambio de claves y la longitud de la clave, respectivamente. El algoritmo de intercambio de claves se puede extraer del nombre.
    • Para el protocolo de autenticación: se puede utilizar la función SSL_get_peer_certificate para obtener el certificado del par. Luego se puede analizar el certificado para obtener el algoritmo de firma utilizado para la autenticación.

    Por ejemplo, para obtener el algoritmo de intercambio de claves y el protocolo de autenticación utilizados en el handshake desde el objeto SSL, se puede modificar el código de la siguiente manera:

    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));
    const char * kx_name = SSL_CIPHER_get_kx_name (curr_cipher);
    int key_bits = SSL_CIPHER_get_bits (curr_cipher, NULL);
    printf ("Algoritmo de intercambio de claves: %s - %d bits\n", kx_name, key_bits);
    
    X509 * cert = SSL_get_peer_certificate (ssl);
    if (cert! = NULL) {
        const EVP_MD * sigalg = X509_get_signature_nid (cert);
        const char * sigalg_name = OBJ_nid2ln (EVP_MD_type (sigalg));
        printf ("Protocolo de autenticación: %s\n", sigalg_name);
        X509_free (cert);
    } else {
        printf ("No se presentó ningún certificado por parte del par.\n");
    }
    

    Esto debería mostrar el algoritmo de intercambio de claves y el protocolo de autenticación utilizados en el handshake TLS.

Comments are closed.