C OpenSSL 1.1通过IANA ID获取密码套件
在OpenSSL1.0.2中,我们使用C OpenSSL 1.1通过IANA ID获取密码套件,c,openssl,C,Openssl,在OpenSSL1.0.2中,我们使用s3\u lib.c中的ssl3\u get\u cipher\u by\u id()函数使用IANA id获取密码套件(SSL\u cipher*) 例如,ID0x00,0x2F将为我们提供TLS\u RSA\u和\u AES\u 128\u CBC\u SHA密码套件作为SSL\u密码结构 但是,该函数未在1.0.2及更高版本的OpenSSL文档中列出,虽然该函数在1.1.1中仍然可用,但它似乎不适用于较新的密码套件,例如,为以下两个密码套件返回NULL
s3\u lib.c
中的ssl3\u get\u cipher\u by\u id()
函数使用IANA id获取密码套件(SSL\u cipher*
)
例如,ID0x00,0x2F
将为我们提供TLS\u RSA\u和\u AES\u 128\u CBC\u SHA
密码套件作为SSL\u密码
结构
但是,该函数未在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\u cipher
或更新的结构)
我已经看到了,但它没有回答如何从IANA十六进制ID获取密码套件对象
注意:IANA ID指的是如下页面上的第一个十六进制列:
#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);
}
谢谢,这正是我们需要的@NealEastwood你知道如何通过编程获得密码的IANA ID吗?@Ilykom取决于你的起点。如果您已经有一个
SSL\u CIPHER*
,那么您可以检查int SSL\u CIPHER\u get\u CIPHER\u nid(const SSL\u CIPHER*c)的API描述
查看它是否符合您的要求。避免uint32\t SSL\u CIPHER\u get\u id(const SSL\u CIPHER*c)
因为“该ID与IANA特定ID不同”。如果您还没有SSL\u密码*
,则取决于您的数据源。在我的例子中,它是对包含TLS记录的libpcap网络数据包的直接解析,因此我可以直接从数据包中提取密码套件ID字节。@Nealestwood感谢您的回复。其思想是使用WinApi获取受支持的密码,然后将它们映射到OpenSSL密码。有两种方法,第一种是使用testssl中的映射表,第二种是动态执行。第二种方法相当复杂,因为我知道如何获取Win密码名称,但不知道如何获取ID。如果我有ID,我就可以使用SSL\u cipher\u find。也许这是另一个问题。
0xC0,0x2F -> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
0xC0,0x14 -> TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA