将 RFC 名称映射到 OpenSSL
Mapping RFC names to OpenSSL
传递字符串无效
我想使用 EVP_get_cipherbyname
获取密码,我有以下
- RFC 名称:
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
应该映射到这个
- OpenSSL 名称:
DHE-RSA-AES128-GCM-SHA256
.
但是当把这个字符串传递给函数时,它找不到密码。
传递整数无效
使用 openssl -V
我可以看到这是一个受支持的密码,并且它的值 0x9e
以 10 为基数 158
,我假设这将是NID,并尝试用 158
调用 EVP_get_cipherbynid
,但也没有用,尽管我认为这不再是 NID。
什么有效?
如何将 RFC 名称映射到 OpenSSL 将接受的名称?
我无法告诉您如何通过 IANA 密码套件十六进制代码获得密码套件。但也许这个答案还是有点帮助的。
手动使用table。
懒惰的答案:使用方便的TestSSL.sh table (Archived 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 很多很多类型的 NID(编辑。有关详细信息,请参阅下面 Dave 的评论。)例如:
- (批量)密码 NID
- 摘要 NID
据我所知,他们是 introduced in April 2015。
相比之下,official hexcodes in the TLS Cipher Suite Registry
用于加密构建块的组合(批量密码、摘要、密钥交换、身份验证等)而不是用于单个构建块。
我认为问题在于您混淆了 cipher suites 和 ciphers.
EVP_get_cipherbyname()
不采用密码套件的名称,而是采用密码的名称。 man
页面和 OpenSSL API 的一般文档非常糟糕。但是在 this PDF 中搜索 "EVP_get_cipherbyname" 会得到 6 个结果。最后一个参考是在讨论 PEM 编码证书的部分中。现在我知道这不是你在做什么,但它包含以下引用:
The line beginning DEK-Info contains two comma
separated pieces of information: the encryption algorithm name as used
by EVP_get_cipherbyname() and an 8 byte salt encoded as a set of
hexadecimal digits.
他们指的是:DEK-Info: DES-EDE3-CBC,3F17F5316E2BAC8
这意味着 EVP_get_cipherbyname() 确实将 DES_3DE3-CBC
作为输入,而不是密码套件。对于您的情况,我相信您正在寻找 AES-128-GCM
以获得正确的 密码 。
NID 仅代表数字 ID。这是用于识别集合列表的通用术语。密码套件没有 NID,只有 RFC 分配的代码(感谢@dave_thompson_085)。这就是为什么当您尝试使用 NID 时它仍然找不到密码。
有一种简单的方法可以将任何 OpenSSL(或 GnuTLS、NSS 等)密码名称转换为 IANA/standard/RFC 密码名称或十六进制代码点或其他方式,方法是使用 tls-map 库ruby:
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
传递字符串无效
我想使用 EVP_get_cipherbyname
获取密码,我有以下
- RFC 名称:
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
应该映射到这个
- OpenSSL 名称:
DHE-RSA-AES128-GCM-SHA256
.
但是当把这个字符串传递给函数时,它找不到密码。
传递整数无效
使用 openssl -V
我可以看到这是一个受支持的密码,并且它的值 0x9e
以 10 为基数 158
,我假设这将是NID,并尝试用 158
调用 EVP_get_cipherbynid
,但也没有用,尽管我认为这不再是 NID。
什么有效?
如何将 RFC 名称映射到 OpenSSL 将接受的名称?
我无法告诉您如何通过 IANA 密码套件十六进制代码获得密码套件。但也许这个答案还是有点帮助的。
手动使用table。
懒惰的答案:使用方便的TestSSL.sh table (Archived 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 很多很多类型的 NID(编辑。有关详细信息,请参阅下面 Dave 的评论。)例如:
- (批量)密码 NID
- 摘要 NID
据我所知,他们是 introduced in April 2015。
相比之下,official hexcodes in the TLS Cipher Suite Registry 用于加密构建块的组合(批量密码、摘要、密钥交换、身份验证等)而不是用于单个构建块。
我认为问题在于您混淆了 cipher suites 和 ciphers.
EVP_get_cipherbyname()
不采用密码套件的名称,而是采用密码的名称。 man
页面和 OpenSSL API 的一般文档非常糟糕。但是在 this PDF 中搜索 "EVP_get_cipherbyname" 会得到 6 个结果。最后一个参考是在讨论 PEM 编码证书的部分中。现在我知道这不是你在做什么,但它包含以下引用:
The line beginning DEK-Info contains two comma separated pieces of information: the encryption algorithm name as used by EVP_get_cipherbyname() and an 8 byte salt encoded as a set of hexadecimal digits.
他们指的是:DEK-Info: DES-EDE3-CBC,3F17F5316E2BAC8
这意味着 EVP_get_cipherbyname() 确实将 DES_3DE3-CBC
作为输入,而不是密码套件。对于您的情况,我相信您正在寻找 AES-128-GCM
以获得正确的 密码 。
NID 仅代表数字 ID。这是用于识别集合列表的通用术语。密码套件没有 NID,只有 RFC 分配的代码(感谢@dave_thompson_085)。这就是为什么当您尝试使用 NID 时它仍然找不到密码。
有一种简单的方法可以将任何 OpenSSL(或 GnuTLS、NSS 等)密码名称转换为 IANA/standard/RFC 密码名称或十六进制代码点或其他方式,方法是使用 tls-map 库ruby:
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