【问题标题】:Determine protocol and cipher compatibility with server certificate确定与服务器证书的协议和密码兼容性
【发布时间】:2017-02-27 10:38:06
【问题描述】:

我的服务器可能附加到 RSA 或 ECDSA 证书。

在我的代码中,我将 prtocol 方法设置为

sslmethod = SSLv23_server_method();

并使用 SSL_CTX_set_cipher_list() API 设置密码。

问题是当服务器附加到 ECDSA 证书时,如果我通过“RSA”密码 SSL_CTX_set_cipher_list() 不会返回任何错误,尽管“RSA”密码与 ECDSA 证书不兼容。

是否有任何可用于确定我们要设置的密码是否与证书或协议兼容的 openssl API?

【问题讨论】:

    标签: ssl openssl ecdsa


    【解决方案1】:

    是否有任何可用于确定我们要设置的密码是否与证书或协议兼容的 openssl API?

    如果您创作了应用程序并拥有服务器,那么是的,您确实知道会发生什么。但一般情况是NO,你事先不知道,也无法查询。您尝试设置一个频道,如果失败,则尝试其他方法。

    一般来说,无法提前知道服务器支持哪些密码套件;或者服务器证书中绑定的公钥类型。事实上,无法知道服务器支持哪些协议版本(SSLv2、SSLv3、TLS 1.0、TLS 1.1、TLS 1.2 等)。这是RFC 7405, TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks的原因。

    在 2016/2017 年,您能做的大约是假设:

    • 无 SSLv2、SSLv3;仅限 TLS 1.0 及更高版本
    • “HIGH:!aNULL:!kRSA:!RC4:!MD5”集合中的密码套件

    "!kRSA" 是“无 RSA 密钥传输”,这意味着您只能使用临时密钥交换。如果服务器有 RSA 密钥,那么它将仅用于身份验证。也就是说,密钥将用于在密钥交换期间对服务器的临时值进行签名,以便客户端知道它们是真实的。

    【讨论】:

    • 感谢 JWW 的投入。开发人员/管理员将是服务器的所有者,他将设置 ECDSA 证书和密码。但是,与其自己寻找一些密码列表来找出与协议兼容的密码,我们需要一些 API 来为我们做这件事。在我们的代码库中,添加大量可用密码并自己进行检查是不切实际的,因为它会减慢服务器的速度。所以我们正在寻找一些 SSL API。
    • 密钥交换的成本将使密码套件选择过程相形见绌。您可以在执行 100 次密钥交换所需的时间内执行数百万次密码套件选择。只需使用“TLS 1.0 及更高版本”和密码套件字符串"HIGH:!aNULL:!kRSA:!RC4:!MD5"。作为一个小小的加速,你可以添加"!PSK:!SRP:!DSS"。在大多数威胁模型下,密码套件将使您远离热水,并避免旧 IronPort 和 F5 代理出现问题。另请参阅 OpenSSL wiki 上的 SSL/TLS Client
    • 是否有任何 SSL API 可以像任何 EC 密码或 RSA 密码一样判断证书是否支持特定密码?
    猜你喜欢
    • 2013-12-22
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多