【问题标题】:Mapping RFC names to OpenSSL将 RFC 名称映射到 OpenSSL
【发布时间】:2015-09-08 05:40:55
【问题描述】:

传递字符串不起作用

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

  • RFC 名称:TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

应该映射到这个

  • OpenSSL 名称:DHE-RSA-AES128-GCM-SHA256

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

传递整数不起作用

使用openssl -V 我可以看到这是一个受支持的密码,它的值0x9e 是基数为10 的158,我假设这将是NID,并尝试调用EVP_get_cipherbynid使用158,但是虽然我认为这不再是 NID,但也不起作用。

什么有效?

如何将 RFC 名称映射到 OpenSSL 将接受的名称?

【问题讨论】:

  • 我的网络搜索引擎为此用途提供了此表:Mapping OpenSSL cipher suite names to RFC names
  • @WhiteWinterWolf 我尝试使用该表,即。 DHE-RSA-AES128-GCM-SHA256 但找不到密码
  • 根据@RoraZ,EVP_get_cipherbyname 只为您提供带模式的对称密码,而不是 SSL/TLS 密码套件。 EVP 密码的名称(加上一些备用“昵称”)可以用openssl list-cipher-algorithms 列出,其中包括许多 SSL/TLS 中未使用的名称。您不能直接查找密码套件;您可以(仅)使用 ciphers 联机帮助页上的个人和/或类别名称启用一个或多个密码套件,并在握手完成后查看协商的单个密码套件。

标签: openssl


【解决方案1】:

我认为问题在于您混淆了密码套件密码

EVP_get_cipherbyname() 不采用密码套件的名称,它采用密码的名称。 man 页面和 OpenSSL API 的一般文档非常糟糕。但是在this PDF 中搜索“EVP_get_cipherbyname”会产生 6 个结果。最后一个参考是在讨论 PEM 编码证书的部分中。现在我知道这不是你在做什么,但它包含以下引用:

以 DEK-Info 开头的行包含两个逗号 分开的信息片段:所使用的加密算法名称 由 EVP_get_cipherbyname() 和一个 8 字节的 salt 编码为一组 十六进制数字。

他们指的是:DEK-Info: DES-EDE3-CBC,3F17F5316E2BAC8

这意味着 EVP_get_cipherbyname() 确实将DES_3DE3-CBC 作为输入,而不是密码套件。对于您的情况,我相信您正在寻找 AES-128-GCM 以获得正确的 cipher


NID 仅代表数字 ID。这是识别集合列表的通用术语。密码套件没有 NID,只有 RFC 分配的代码(感谢@dave_thompson_085)。这就是为什么当您尝试使用 NID 时仍然找不到密码的原因。

【讨论】:

  • 没错。区别在于EVP_CIPHER(仅代表)对称密码实例(算法、模式、密钥、IV/参数)与SSL_CIPHER 之间的区别在于描述具有密钥交换和身份验证方法的 SSL/TLS 密码套件、具有密钥大小的对称密码和模式,以及 mac 哈希(如果适用),以及其他内部属性。但是密码套件没有 OID 或(因此)NID,只有 RFC 分配的代码。
  • @RoraZ:喜欢它。无论如何,您都不知道从哪里获取当前 OpenSSL 版本的 PDF?
【解决方案2】:

我无法告诉您如何通过 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 很多很多类型的 NID(编辑。有关详细信息,请参阅下面 Dave 的评论。)例如:

  • (批量)密码 NID
  • 摘要 NID

据我所知,他们是introduced in April 2015

相比之下,official hexcodes in the TLS Cipher Suite Registry 适用于加密构建块的组合(批量密码、摘要、密钥交换、身份验证等),而不适用于单个构建块。

【讨论】:

  • 我尝试使用DHE-RSA-AES128-GCM-SHA256,这是您链接的表中的“映射”,并将其传递给EVP_get_cipherbyname,但它失败了,即。找不到密码
  • @Chaosekie:对不起。我的错。好像没有仔细看你的帖子。但是:您能否添加确切的错误消息?
  • 我目前不在可以编译代码的电脑上,我会尽快添加错误消息
  • OpenSSL 中的 NID 是 ASN.1 OID(对象标识符)的内部等效项,并且有数百个用于各种事物:对称密码、模式和变体、摘要、PRF、( PB 和非 PB)证书、CRL、CSR、CMS/SMIME 消息、PKCS8 和 PKCS12 密钥中的 KDF、属性和扩展,自 1990 年代早期的 0.9 版本以来就有。新的是将密码套件映射到 NID 以及它们的两个构建块的名称(您正确地称呼它们)。
  • 顺便说一下,Mozilla有一个不错的密码套件对应表wiki.mozilla.org/Security/Cipher_Suites
【解决方案3】:

有一种简单的方法可以通过使用 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

【讨论】: