c-OpenSSL 1.1通过IANA ID获得一个密码套件



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

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

然而,1.0.2及更高版本的OpenSSL文档中没有列出该函数,尽管该函数在11.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更新的结构(?

我看到了这个相关的问题,但它没有回答如何从IANA十六进制ID中获得密码套件对象。

注意:IANA ID指的是页面上的第一个十六进制列:

  • https://testssl.sh/openssl-iana.mapping.html
  • https://wiki.mozilla.org/Security/Cipher_Suites
  • https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-参数-4

您可以使用SSL_CIPHER_find((

。。。返回SSL_CIPHER结构,该结构具有存储在ptr中的密码ID。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 -> %sn", 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

相关内容

最新更新