OpenSSL 1.1通过IANA ID获取密码套件

问题描述

在OpenSSL 1.0.2 中,我们使用了ssl3_get_cipher_by_id()中的s3_lib.c函数来使用IANA ID获得密码套件(SSL_CIPHER*)。 / p>

例如,ID 0x00,0x2F将为我们提供TLS_RSA_WITH_AES_128_CBC_SHA密码套件作为SSL_CIPHER结构。

但是,此功能未在 1.0.2 及更高版本的OpenSSL文档中列出,尽管该功能 1.1.1 中仍然可用为更新的密码套件工作,例如为这两个返回NULL:

0xC0,0x2F TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
0xC0,0x14 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

我的问题:是否存在一种通过其IANA ID获取密码套件(SSL_CIPHER new 结构)的现代方法

我见过this related question,但它没有回答如何从IANA十六进制ID获取密码套件对象。

通过IANA ID,我的意思是这样的页面上的第一十六进制列:

解决方法

您可以使用SSL_CIPHER_find(),

...返回SSL_CIPHER结构,其密码ID存储在ptr中。 ptr参数是char的两个元素的数组,用于存储网络字节顺序的两字节TLS密码ID(由IANA分配)。

请参阅https://www.openssl.org/docs/man1.1.1/man3/SSL_CIPHER_find.html

C程序

两个示例的

C代码如下:

#include <stdio.h>
#include <openssl/err.h>
#include <openssl/ssl.h>

static void print_name(unsigned char iana[],const SSL_CIPHER *cipher);

int main(void) {
    SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
    SSL *ssl = SSL_new(ctx);
    if (ssl == NULL) {
        ERR_print_errors_fp(stderr);
        exit(1);
    }

    unsigned char iana1[] = {0xC0,0x2F};
    const SSL_CIPHER *cipher = SSL_CIPHER_find(ssl,iana1);
    if (cipher) {
        print_name(iana1,cipher);
    }

    unsigned char iana2[] = {0xC0,0x14};
    cipher = SSL_CIPHER_find(ssl,iana2);
    if (cipher) {
        print_name(iana2,cipher);
    }
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    return 0;
}

static void print_name(unsigned char iana[],const SSL_CIPHER *cipher) {
    const char *name = SSL_CIPHER_standard_name(cipher);
    if (name == NULL)
        name = "?";
    printf("0x%02X,0x%02X -> %s\n",iana[0],iana[1],name);
}

测试

如果运行上述程序,则将在调试控制台上获得以下输出:

0xC0,0x2F -> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
0xC0,0x14 -> TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA