在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扩展 disabled ,并且服务器在SSL握手中选择并呈现密钥库中的证书链 . 这就是我的预期 .
openssl s_client -connect myserver.example.com:port
我使用以下命令测试服务器名称指示(SNI)TLS扩展 enabled ,并且服务器在SSL握手中选择并显示了另一个(默认?)证书 . 此证书不在密钥库中 . 我没想到这一点 .
openssl s_client -connect myserver.example.com:port -servername myserver.example.com
我试图弄清楚为什么服务器没有选择我在密钥库中的证书链,而是在启用SNI扩展时选择“其他”(默认?)证书 . 任何帮助,将不胜感激 .
我不知道在SSL握手过程中证书选择如何在服务器上运行 .
1 回答
如果客户端未发送SNI,则服务器应使用默认证书进行应答(但某些服务器未配置任何默认值,并且握手失败) . 如果客户端发送SNI,则服务器应选择适当的证书 . 你的问题看起来很奇怪,因为它看起来不像是两种可能性 . 尝试将JVM(OpenJDK?Oracle?)升级到最新版本,因为自版本以来有很多变化,例如Support TLS Server Name Indication (SNI) Extension in JSSE Server .