繁体   English   中英

如果客户端在密钥库中有多个证书,将选择哪个 SSL 证书

[英]Which SSL certificate will be selected if client has multiple certificates in key store

你能帮我解决以下两个问题吗?

我有一个连接到 FIX 服务器的 FIX 引擎。 有一个 FIX 服务器需要客户端在 SSL 握手期间进行身份验证。 它还提供了一个 SSL 证书,我需要在 SSL 握手期间将其用作客户端证书。

问题#1:我可以将多个证书(私钥)存储在稍后将在我的 FIX 引擎中加载的密钥库中吗?

Question#2: If answer to #1 is yes, then how would the SSL context select a client certificate during SSL handshake when it establishes a SSL connection with the server?

注意-我正在考虑这些问题,因为将来可能会有其他服务器也有类似的要求。

问题#1:我可以将多个证书(私钥)存储在稍后将在我的 FIX 引擎中加载的密钥库中吗?

就 Java 而言,您绝对可以在一个密钥库文件或其他存储 object 中拥有多个 privateKey 条目,每个都包含一个私钥加证书或(通常)链。 (请注意,如果您使用 PKCS12与其他软件交换,其他软件可能不支持在一个 PKCS12 中的多个条目。如果您使用 PKCS12 只是为了在 Java 中获得更好的安全性,或者在 j9+ 中使警告静音,这不是问题。)

我不知道您使用的是什么 FIX 引擎,也不知道它如何处理 TLS-以前的 SSL 的密钥和证书信息(或者实际上它是如何处理 TLS 的)。 如果它只是将密钥库文件(或流)加载为 KeyStore object,则上述 Java 功能适用。 如果它做其他事情,它可以做什么取决于其他事情。

Question#2: If answer to #1 is yes, then how would the SSL context select a client certificate during SSL handshake when it establishes a SSL connection with the server?

在 TLS 协议中,当服务器请求客户端使用证书时,它会指定算法约束(通过 1.2 的叶密钥算法和/或 1.2 和 1.3 中的链签名算法),并且可以指定所需的证书颁发机构(CA)列表)(可能已在链中颁发了任何证书)。

如果您的客户端(FIX 引擎)使用 Java 标准的 TLS (JSSE) 实现及其标准(和默认)“SunX509”密钥管理器,它将从密钥库中选择满足服务器上述约束的条目; if you select or configure the 'NewSunX509' or 'PKIX' KeyManager, it also checks any algorithm constraints defined for your JVM (for example Oracle JVMs since about 2017 prohibit certs using MD5- or SHA1-based signatures, or RSA keys less than 1024位),并优先考虑证书未过期且没有不适当的 KeyUsage 或 ExtendedKeyUsage 扩展的条目。 在多个可接受或首选条目中,选择是任意的——但是密钥库实现枚举了它们。 大多数服务器支持所有标准(可能和非过时)算法,通常无法区分。 如果服务器接受来自 Digicert、GoDaddy、LetsEncrypt 等“公共”CA 的证书,这些证书也不太可能有区别,但如果它使用特定于该服务器或其运营商的 CA(或少数几个),则此类 CA 名称将通常是唯一的,因此只会为该服务器选择密钥和证书。

如果您的客户端使用自定义 KeyManager——无论是在您的应用程序中显式地使用还是通过中间件(例如 Apache HttpClient)——它可以做一些不同的事情。 它甚至可以选择使用服务器将拒绝的密钥和证书,尽管这通常不会被认为是有用的。

如果您的客户端使用不同的 TLS 实现,则可以使用标准 KeyManager 结构,可能带有上述选项,或者可以执行任何其他操作。

如果您使用 spring 框架,您可以通过添加指定您喜欢 select 的证书别名

-Dserver.ssl.key-alias=your_preffered_alias

  1. 您说您有一个连接到 FIX 服务器的 FIX 引擎,然后询问是否可以将私钥存储在您的 FIX 引擎的密钥库中。 这使我相信 FIX 引擎位于客户端应用程序中。 您不应将私钥公开存储在密钥库中。 相反,您应该为客户端提供一个仅包含证书的信任库。

  2. 我对此没有答案,但这篇文章可能会有所帮助; https://stackoverflow.com/a/1710543/4417924

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM