问题描述
在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,我的意思是这样的页面上的第一十六进制列:
- 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-parameters-4
解决方法
您可以使用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