启用S​​NI扩展的SSL握手 - 服务器上的证书选择

时间:2018-05-14 20:37:29

标签: ssl handshake sni

在SSL握手期间,当客户端启用SNI扩展时,服务器不会选择并将所需的证书提交给客户端。

我有一个证书链,我已将其导入服务器上的JVM密钥库。

内部中间颁发CA颁发的服务器证书。

主题:CN = myserver.example.com

内部根CA颁发的中间证书。

        X509v3 Key Usage:
            Digital Signature, Certificate Sign, CRL Sign
        X509v3 Basic Constraints: critical
            CA:TRUE

自签名的根CA证书。

    X509v3 extensions:
        X509v3 Key Usage:
            Digital Signature, Certificate Sign, CRL Sign
        X509v3 Basic Constraints: critical
            CA:TRUE

我用“openssl s_client”来测试。

我使用以下命令测试服务器名称指示(SNI)TLS扩展禁用,并且服务器在SSL握手中选择并呈现密钥库中的证书链。这就是我的预期。

openssl s_client -connect myserver.example.com:port

我使用以下命令测试服务器名称指示(SNI)TLS扩展已启用,并且服务器在SSL握手中选择并显示了另一个(默认?)证书。此证书不在密钥库中。我没想到这一点。

openssl s_client -connect myserver.example.com:port -servername myserver.example.com

我正在试图弄清楚为什么服务器没有选择我在密钥库中的证书链,而是在启用SNI扩展时选择“其他”(默认?)证书。任何帮助将不胜感激。

我不知道在SSL握手过程中证书选择如何在服务器上运行。

1 个答案:

答案 0 :(得分:0)

  

我不知道在SSL握手过程中证书选择如何在服务器上运行。

如果客户端未发送SNI,则服务器使用默认证书进行应答(但某些服务器未配置任何默认值,并且握手失败)。如果客户端发送SNI,则服务器应选择适当的证书。你的问题看起来很奇怪,因为它看起来不像是两种可能性。 尝试将您的JVM(OpenJDK?Oracle?)升级到最新版本,因为自您的版本以来有很多更改,例如Support TLS Server Name Indication (SNI) Extension in JSSE Server