将 RFC 名称映射到 OpenSSL

Mapping RFC names to OpenSSL

传递字符串无效

我想使用 EVP_get_cipherbyname 获取密码,我有以下

应该映射到这个

但是当把这个字符串传递给函数时,它找不到密码。

传递整数无效

使用 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 suitesciphers.

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