我想使用EVP_get_cipherbyname
得到一个密码,我有以下
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
应映射到此
DHE-RSA-AES128-GCM-SHA256
。但是当将此字符串传递给函数时,它无法找到密码。
使用openssl -V
我可以看到这是一个受支持的密码,并且它在基数10中的值为0x9e
,158
,我假设这是NID,并尝试使用EVP_get_cipherbynid
拨打158
,但唉不管怎么办,虽然我不认为这是NID了。
如何将RFC名称映射到OpenSSL将接受的名称?
答案 0 :(得分:4)
我认为问题在于您会混淆密码套件和密码。
EVP_get_cipherbyname()
没有采用密码套件的名称,它采用密码的名称。 man
页面和OpenSSL API的一般文档非常糟糕。但是在this PDF中搜索“EVP_get_cipherbyname”会产生6个结果。最后一个参考文献是关于PEM编码证书的部分。现在我知道这不是你正在做的,但它包含以下引用:
以DEK-Info开头的行包含两个逗号 分隔的信息:使用的加密算法名称 通过EVP_get_cipherbyname()和一个8字节的盐编码为一组 十六进制数字。
他们指的是:DEK-Info: DES-EDE3-CBC,3F17F5316E2BAC8
这意味着EVP_get_cipherbyname()确实将DES_3DE3-CBC
作为输入,而不是密码套件。对于您的情况,我相信您正在寻找AES-128-GCM
来获取正确的密码。
NID只代表数字ID。这是用于标识集合列表的通用术语。密码套件没有NID只有RFC分配的代码(感谢@ dave_thompson_085)。这就是为什么当你试图使用NID时它仍然无法找到密码。
答案 1 :(得分:1)
我无法通过IANA密码套件十六进制代码告诉您如何获得密码套件。但也许这个答案仍然有点帮助。
懒惰回答:使用方便TestSSL.sh table(已归档here。)
[0x9e], DHE-RSA-AES128-GCM-SHA256 ,DH,AESGCM,128, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
或使用official OpenSSL name mapping table(遗憾地缺少十六进制代码)。
有两种类型的NID 很多很多类型的NID(编辑。详见下面的Dave评论。)如下:
据我所知,他们是introduced in April 2015。
相比之下,official hexcodes in the TLS Cipher Suite Registry 适用于加密构建块的组合(批量密码,摘要,密钥交换,身份验证等),而不适用于各个构建块。
答案 2 :(得分:0)
通过在 ruby 中使用 tls-map 库,有一种简单的方法可以将任何 OpenSSL(或 GnuTLS、NSS 等)密码名称转换为 IANA/标准/RFC 密码名称或十六进制代码点或其他方式:
require 'tls_map'
tm = TLSmap::App.new
# OpenSSL -> IANA
tm.search(:openssl, 'AES128-SHA', :iana) #=> {:iana=>"TLS_RSA_WITH_AES_128_CBC_SHA"}
# Hexadecimal codepoint to all (including OpenSSL & IANA)
tm.search(:codepoint, '1303') #=> {:codepoint=>"1303", :iana=>"TLS_CHACHA20_POLY1305_SHA256", :openssl=>"TLS_CHACHA20_POLY1305_SHA256", :gnutls=>"CHACHA20_POLY1305_SHA256", :nss=>"TLS_CHACHA20_POLY1305_SHA256"}
它也可用作 CLI 工具:
$ tls-map search openssl AES128-SHA -o iana
iana: TLS_RSA_WITH_AES_128_CBC_SHA