如果套接字握手中的客户端证书中有两个有效证书,则在 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协议,三个其实都是一个吗?还是说有区别呢