【问题标题】:SSL client verification failureSSL 客户端验证失败
【发布时间】:2014-02-24 15:50:02
【问题描述】:

我有一个仅使用 SSL 作为默认公共接口的后端服务器。此服务器在 443 上监听 cert、key 和 ca 文件,ssl verify client 设置为 true。

在客户端,我有客户端证书、密钥和一个由 2 个 CA 文件(中间 CA、根 CA)组成的 ca 文件,这些文件放在一个 ca.pem 文件中。当我在后端服务器上执行 curl 请求时,它工作正常。我还使用 gnutls-serv 和 openssl s_server 测试了服务器/客户端证书和密钥,以确保一切都有效。

但是当我在 Apigee(客户端证书和密钥文件 [pem 格式])和 trustore(ca.pem 文件)上创建密钥库时,出现错误: - target.name fsbca-test
- 特性 - 表达式(“fsbca-test”等于 target.name)
- 表达式结果为真
- 树 TARGET_fsbca-test
- 错误服务暂时不可用 - error.cause 一般 SSLEngine 问题 - error.cause.cause 一般 SSLEngine 问题 - error.class com.apigee.messaging.adaptors.http.HttpAdaptorException - 状态 TARGET_REQ_FLOW - 输入错误点

如果我在后端将 SSL 验证客户端设置为 false,那么 Apigee 会正确转移请求并且我会收到响应。

如果我在目标端点属性中将 IgnoreValidationErrors 设置为 true,则请求将被转移到我的后端服务器,但我可以在服务器的日志中看到一个错误:“客户端在读取 c 时发送了不需要的 SSL 证书...”。

关于我正在做的事情可能有什么问题有什么想法吗?

附加轨道:这可能是 Apigee 方面的问题,CA 文件由 2 个证书组成(它可能会忽略 .pem 中的尾随证书)。如果想测试 pkcs12 和 jks 但我未能将它们上传到 Apigee(API 文档页面仅描述 .pem、JAR 和 cert 操作)。我用 pkcs12 密钥库和 jks trustore 编写了一个小型 Java 客户端,它在我的本地工作站上运行良好。

提前感谢您提供任何可以帮助我的信息。

问候

Fr

【问题讨论】:

  • 你能添加你的 TargetEndpoint/SSLInfo 配置吗?
  • truetrueFsbcaKeystoreFsbcaKeytrueFsbcaTruststore

标签: ssl keystore apigee truststore ca


【解决方案1】:

您应该单独上传您的证书(每个证书一个),并且您需要将整个证书信任链存储在您的信任库中。

Here 是关于 SSL 到您的后端的页面。

编辑: 这是我知道的一种方法:

1) 将证书分成单独的 PEM 文件。不要在一个文件中放置多个证书。

2) 使用 openssl 验证每个证书:

openssl x509 -noout -text -in <cert file name>

验证没有证书过期,并且 Subject 和 Issuer 字段创建了所有证书的链,具有相同的名称。

服务器的证书、根证书以及介于两者之间的所有证书都需要在信任库中。

【讨论】:

  • 我已经阅读了此页面,并且正在使用自签名证书。但是对于 ca,这并没有按预期工作。我将客户端证书和密钥放在密钥库中,并将 ca(2 个文件分类)放在 trustore 中。我的后端服务器使用与 ssl_client_certificate 相同的 ca 文件。
  • 我的信任库现在由 { "certs" : [ "TrustServ", "TrustFsbca", "TrustMbca" ], "keys" : [ ], "name" : "FsbcaTruststore" } 组成仍然因 SSL 引擎处理错误而失败。如前所述,我使用我的客户端/服务器证书和密钥与 CA 文件进行测试,使用 openssl s_client + s_server,然后使用 gnutls,然后使用 nginx 和 curl(没有 -k)选项,它可以工作。我真的不明白运行上述配置的预期配置是什么。在信任库中(第一个别名是我的服务器证书,fsbca 是中间 ca,mbca 是根 ca。问候
  • 如果目标无法验证您的客户端证书,则可能会发生该错误。当您使用 curl 直接针对您的后端进行测试时,当您只提供客户端证书而不是客户端的整个信任链时,您能否成功通信?如果您的 curl 通信需要整个信任链,您可以将整个信任链的证书连接到单个 pem 文件中以呈现给目标。 (直到我研究了您的问题,我才知道这是允许的。)要么,要么在目标本身上添加信任链。
  • 我的目标后端没有问题:使用 curl,如果没有设置 CA,那么我在 nginx 错误日志中看到正确的错误。问题出在 Apigee 后端的 CA 证书链上。当客户端验证设置为开启时,没有请求发送到我的后端,但 Apigee 端出现 SSL 引擎处理错误。
  • 如果 SSL 握手失败,将不会向后端发送请求。我的建议是让 Apigee 支持帮助调试您的特定设置。抱歉,我无法弄清楚您的问题!
猜你喜欢
  • 2011-11-21
  • 2019-01-08
  • 2021-11-10
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2017-01-17
  • 2016-01-18
  • 2018-05-15
相关资源
最近更新 更多