ssl - SSL TrustStore 没有 CA,只有客户端证书
问题描述
我有一个自定义 CAroot.crt(由我生成),我所有的客户证书都用这个 CAroot.crt 签名。我有一个 TrustStore.jks,我只放了客户端证书而不放 CAroot.crt,因为我希望可以随时从我的信任库中删除客户端。
当我尝试启动我的应用程序时,我得到了以下信息:
*** Certificate chain
<Empty>
***
main, fatal error: 42: null cert chain
这是我的 trustStore.jks:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: localhost
Creation date: Nov 23, 2019
Entry type: trustedCertEntry
Owner: CN=localhost, OU=IT, O=QUEROBUY, L=SAO CAETANO DO SUL, ST=SAO PAULO, C=BR
Issuer: CN=localhost, OU=IT, O=LANHELLAS XYZ, L=SAO CAETANO DO SUL, ST=SAO PAULO, C=BR
Serial number: 5416c04e360f9d50323c52d8a5b04be2969c9b86
Valid from: Sat Nov 23 16:39:54 BRT 2019 until: Tue Apr 06 16:39:54 BRT 2021
Certificate fingerprints:
MD5: 8F:29:1C:1F:05:89:0B:E6:A0:57:84:FE:B0:78:68:2D
SHA1: 95:C8:EA:0E:C8:7C:4E:99:E4:73:85:49:57:D6:BB:88:AF:52:52:12
SHA256: 7E:ED:19:AF:02:DB:CC:88:98:D0:10:4E:39:67:AA:4D:3F:70:DA:76:03:1B:CB:41:06:DC:3B:51:38:16:78:5F
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 1
*******************************************
*******************************************
如果我将“CARoot.crt”添加到我的 trustStore.jks 一切正常,但我失去了使某些特定客户端证书无效的机会。想象一下,我有 10 个客户端,每个客户端都有您自己的证书 (.crt),由“CARoot.crt”分配,但由于某种原因,客户端 001 应该立即失效,我只会从服务器中的 trustStore.jks 中删除您的公钥,而不我应该等待证书到期日期。
解决方案
TrustStore.jks 是 java 将如何确定它是否信任证书的方式。它本质上是一个根证书的密钥库文件。如果您想避免“不信任消息”,则必须将您的根证书添加到此存储中。
在您的场景中,由于您使用该根来颁发 10 个客户端证书,因此从您的信任或密钥存储中删除 client_certificate.crt 不会不信任它。因为,按照设计,java 正在查看 TrustStore 并找到根证书,因此仍然信任 client_certificate.crt。您将需要重新设计您的 CA。
在部署任何类型的 PKI 基础架构时,您还需要设置 CRL 和/或 OCSP 服务器。这是用于吊销证书的两种协议。
我还建议您不要直接从根颁发“最终用户证书”。它最好在根目录下颁发中间证书,然后使用 middle_certificate.crt 来颁发您的实际服务器或客户端证书。出于某种原因,请参见此处:https ://security.stackexchange.com/questions/128779/why-is-it-more-secure-to-use-intermediate-ca-certificates#128800
这是使用 OpenSSL 部署您自己的 CA 的一种简单易用的方法。它将向您展示如何设置根服务器、中间服务器和撤销服务器。https://jamielinux.com/docs/openssl-certificate-authority/
推荐阅读
- ios - iOS Swift 按字母顺序组合两个字符串以创建一个更大的字符串
- c# - Ubuntu 上的 ASP.NET Core 2.2 Web 应用程序 - 如何实现数据保护
- bash - 带有标志的 Bash 函数在哪里是可选的?
- git - 如何像根一样签出嵌套文件夹
- java - 如何停止从 weblogic 容器中的 servlet 产生的线程?
- c# - 在 C# 中并行运行多个操作
- css - 如何将具有高度:0px 的元素 html 设置为高度:自动(CSS)
- sql - 将 NEWID() 传递给存储过程
- visual-studio - 如何在 TFS 中启用分析
- azure - 如何在 Spring Boot 中为 CosmosDb 设置分区键