在我问这个问题之前,让我先介绍一下背景知识,这样我们就可以清楚地了解问题本身了。我们需要使用searchguard ssl支持使用elasticsearch(v5.2.x)的单向ssl。我们为开发人员(不是生产人员)提供了一个过程列表,它负责生成一个自签名的SSL证书。这里我们有一个根(本地创建的)和实际的证书。如果我们导入密钥库(包含私钥和签名证书)和信任库(包含根证书)ev红色的东西很好用。
但几天前,我们接到一个客户的请求。在那里,在生产中,我们需要支持SSL。因此,我们遵循以下步骤:
-
使用我们的脚本,我们生成了私钥,将其导入到密钥库中,还生成了CSR。
-
我们给了客户CSR。他得到了一个合适的CA的签名,并把证书还给了我们。
-
对于给定的证书,信任链的长度为3。所以,有一个根CA,它签署了证书(issuer1),这个根CA签署了证书(issuer2),而这个根CA又签署了实际的CSR。
-
为了将实际证书导入到密钥库,我们导入了三个父级,然后导入了实际证书。
-
然后我们从密钥库中删除了所有父证书。所以,现在密钥库只有私钥和实际的证书。
-
我们将所有三个父证书导入到信任库中。
现在,如果启动ElasticSearch,将引发以下错误:
[ERROR][c.f.s.s.t.SearchGuardSSLNettyTransport] [uyyIg3i] SSL Problem Received fatal alert: certificate_unknown
javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
有趣的是,如果我们只有根CA,那么准确的过程就可以工作,签署实际的CSR。如果能帮我找出这个问题的根本原因,我将不胜感激,因为我现在有点不知所措。