【问题标题】:TLS Mutual Auth: null cert chain (C client -> Java server) unless cafile points to same file as certTLS Mutual Auth:空证书链(C 客户端-> Java 服务器)除非 cafile 指向与证书相同的文件
【发布时间】:2019-08-04 21:52:10
【问题描述】:

如果我仅使用证书(带链)和私钥发出 openssl 调用,服务器在握手中拒绝客户端证书时会遇到问题。

如果我还设置 cafile 参数并将其指向与证书相同的文件,此问题就会消失。

即使信息已经在 cert 输入中,openssl 似乎也无法在没有 cafile 输入的情况下构建链。不知道各位有没有这方面的经验。我只是觉得有点奇怪。

总而言之,这是可行的:

sudo openssl s_client -connect <ip>:<port> -cert cert_with_chain.pem -key privkey.pem -CAfile cert_with_chain.pem

这不起作用(服务器拒绝“空证书链”):

sudo openssl s_client -connect <ip>:<port> -cert cert_with_chain.pem -key privkey.pem

开启 SSL 版本:

OpenSSL 1.0.2k-fips  26 Jan 2017

【问题讨论】:

    标签: ssl openssl mutual-authentication


    【解决方案1】:

    问题不在于 “openssl 无法在没有 cafile 的情况下构建链”,而是一开始就没有这样做的意图。预期的行为在man s_client 中有详细记录:

    -cert certname
    如果服务器请求,要使用的证书

    -CAfile 文件
    一个包含可信证书的文件,用于在服务器身份验证期间和在尝试构建客户端时使用 证书链

    【讨论】:

    • 是的,我看到了。那么这是否意味着我必须始终使用相同的输入传入 CAfile?这似乎是多余的。
    • @user1836155:-cert 用于叶证书,-CAfile 用于 CA 证书。如果您将两者都保存在同一个文件中,那么您需要为这两个选项使用同一个文件,这对您来说似乎是多余的。但是,如果您将这些文件放在不同的文件中,则根本就没有冗余。请注意,openssl s_client 只是为知道自己在做什么的人提供的测试工具 - 它并非旨在作为最终用户友好的工具来猜测用户可能的意思。
    • 感谢您的澄清。我使用 openssl s_client 来解决握手问题。在我的实际服务中,我使用 openssl 的 C API,虽然它的行为应该相似
    • @user1836155: SSL_CTX_use_certificate_chain_file 允许您同时加载证书和链,SSL_CTX_use_certificate_file 只加载证书。
    • 嗯...一目了然,我们的 C 客户端仅使用“SSL_CTX_use_certificate_chain_file”而不是 SSL_CTX_use_certificate_file。这让我想知道服务器端是否存在问题(Java;3P)。我会也看看那个以防万一。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2021-12-27
    • 2021-12-12
    • 2021-03-13
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多