如果套接字握手中的客户端证书中有两个有效证书,则在 SSL 连接中使用哪个证书

Posted

技术标签:

【中文标题】如果套接字握手中的客户端证书中有两个有效证书,则在 SSL 连接中使用哪个证书【英文标题】:Which cert is used in SSL connection if there are two valid certs in client certificates in socket handshake 【发布时间】:2021-07-18 22:02:58 【问题描述】:

我的密钥库中已经有一个有效的证书,并且与服务器的握手过程正在运行。当在同一密钥库中添加另一个具有不同 CN 的证书并与服务器连接时,从服务器获取错误“访问被拒绝,端点无效”。我认为在与服务器连接时,当有两个有效的证书用于客户端证书(现有的证书和新导入的证书)时,第二个证书用于 ssl 连接。我想知道的是,如果密钥库中的有效证书多于一个,则使用哪一个。它与证书别名有关吗? 下面是socket连接的代码sn-p。

try 
        SSLSocketFactory factory = null;
        try 
            SSLContext ctx;
            KeyManagerFactory kmf;
            KeyStore ks;
            char[] passphrase = "*****".toCharArray();

            ctx = SSLContext.getInstance("TLSv1.2");
            kmf = KeyManagerFactory.getInstance("SunX509");
            ks = KeyStore.getInstance("JKS");

            ks.load(new FileInputStream("testkeys"), passphrase);

            kmf.init(ks, passphrase);
            ctx.init(kmf.getKeyManagers(), null, null);

            factory = ctx.getSocketFactory();
         catch (Exception e) 
            throw new IOException(e.getMessage());
        

        SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
        String[] cipherSuites = socket.getSupportedCipherSuites();
        socket.setEnabledCipherSuites( cipherSuites );

        socket.setNeedClientAuth(false);
        socket.startHandshake();

【问题讨论】:

【参考方案1】:

类似的Which key and certificate from keystore and truststore is used when there are many? 用于服务器。

对于 SunX509 KeyManagerFactory:

在初始化时,它会创建一个 HashMap,其中包含来自密钥库的所有私钥条目,以别名为键;

handshake 调用 chooseClientAlias,对于服务器指定/请求的每个 HashIterator 顺序中的每个 HashMap 条目(由变量号确定从别名的哈希码派生的值的低位)查看叶子证书是否具有该密钥类型,并且链中的任何证书都由服务器指定的 CA 之一颁发,除非服务器将 CA 列表留空在这种情况下,这部分检查会被跳过。

如果您选择了错误的证书和密钥,请检查服务器是否在其 CertificateRequest 消息中指定了正确的 CA 列表。您可以在 Java 客户端上执行此操作,方法是使用 sysprop javax.net.debug=ssl:handshake 运行,或者在 1.3 中使用网络级工具(如 wireshark 或 tcpdump)除外。

【讨论】:

以上是关于如果套接字握手中的客户端证书中有两个有效证书,则在 SSL 连接中使用哪个证书的主要内容,如果未能解决你的问题,请参考以下文章

SSL,SSL证书,SSL协议,三个其实都是一个吗?还是说有区别呢

如何修复“SSL 握手失败”

SSL证书签发

在TLS / SSL握手(证书等)中泄露了哪些信息? [关闭]

关于网站服务器的https访问,真的需要购买证书吗

在 QWebSockets 中检查客户端 SSL 证书有效性的最佳实践