OpenSSL 1.1 通过 IANA ID 获取密码套件
OpenSSL 1.1 get a cipher suite by the IANA ID
在 OpenSSL 1.0.2 中,我们使用 s3_lib.c
中的 ssl3_get_cipher_by_id()
函数来获取密码套件 (SSL_CIPHER*
),使用IANA ID。
例如,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
我的问题: 是否有现代方法通过其获取密码套件(SSL_CIPHER
或 newer 结构) IANA ID?
我看过 但它没有回答如何从 IANA 十六进制 ID 获取密码套件对象。
N.B。通过 IANA ID 我的意思是像这样的页面上的第一个十六进制列:
您可以使用 SSL_CIPHER_find(),
... returns a SSL_CIPHER structure which has the cipher ID stored in ptr. The ptr parameter is a two element array of char, which stores the two-byte TLS cipher ID (as allocated by IANA) in network byte order.
见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
在 OpenSSL 1.0.2 中,我们使用 s3_lib.c
中的 ssl3_get_cipher_by_id()
函数来获取密码套件 (SSL_CIPHER*
),使用IANA ID。
例如,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
我的问题: 是否有现代方法通过其获取密码套件(SSL_CIPHER
或 newer 结构) IANA ID?
我看过
N.B。通过 IANA ID 我的意思是像这样的页面上的第一个十六进制列:
您可以使用 SSL_CIPHER_find(),
... returns a SSL_CIPHER structure which has the cipher ID stored in ptr. The ptr parameter is a two element array of char, which stores the two-byte TLS cipher ID (as allocated by IANA) in network byte order.
见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