不带CA的SSL信任库,仅客户端证书

不带CA的SSL信任库,仅客户端证书,ssl,openssl,ssl-certificate,x509certificate2,Ssl,Openssl,Ssl Certificate,X509certificate2,我有一个自定义的CAroot.crt(由我生成),我的所有客户端证书都用这个CAroot.crt签名。我有一个TrustStore.jks,在这里我只放客户端证书,而不放CAroot.crt,因为我想随时从我的信任库中删除一个客户端 当我尝试启动我的应用程序时,我得到以下信息: *** Certificate chain <Empty> *** main, fatal error: 42: null cert chain 如果我将“CARoot.crt”添加到我的trustStor

我有一个自定义的CAroot.crt(由我生成),我的所有客户端证书都用这个CAroot.crt签名。我有一个TrustStore.jks,在这里我只放客户端证书,而不放CAroot.crt,因为我想随时从我的信任库中删除一个客户端

当我尝试启动我的应用程序时,我得到以下信息:

*** Certificate chain
<Empty>
***
main, fatal error: 42: null cert chain

如果我将“CARoot.crt”添加到我的trustStore.jks中,一切正常,但我失去了使某些特定客户端证书无效的机会。想象一下,我有10个客户端,每个客户端都有您自己的证书(.crt),由“CARoot.crt”分配,但是客户端001由于某种原因应该立即失效,我将从服务器中的trustStore.jks中删除您的公钥,否则,我应该等待证书到期日期。

TrustStore.jks是java确定是否信任证书的方式。它本质上是根证书的密钥库文件。如果要避免“不信任邮件”,则必须将根证书添加到此存储

在您的场景中,由于您使用该根用户颁发了10个客户端证书,因此从信任或密钥存储中删除client_certificate.crt不会不信任它。因为,从设计上讲,java正在查看信任库并找到根证书,因此仍然信任client_certificate.crt。你需要重新设计你的CA

在部署任何类型的PKI基础设施时,还需要设置CRL和/或OCSP服务器。这是用于撤销证书的两个协议

我还建议您不要直接从根目录颁发“最终用户证书”。最好从根目录下颁发中间证书,然后使用intermediate_certificate.crt颁发实际的服务器或客户端证书。 有关原因,请参见此处:


下面是一个使用OpenSSL部署您自己的CA的好方法。它将向您展示如何设置根服务器、中间服务器和吊销服务器

TrustStore.jks是java确定是否信任证书的方式。它本质上是根证书的密钥库文件。如果要避免“不信任邮件”,则必须将根证书添加到此存储

在您的场景中,由于您使用该根用户颁发了10个客户端证书,因此从信任或密钥存储中删除client_certificate.crt不会不信任它。因为,从设计上讲,java正在查看信任库并找到根证书,因此仍然信任client_certificate.crt。你需要重新设计你的CA

在部署任何类型的PKI基础设施时,还需要设置CRL和/或OCSP服务器。这是用于撤销证书的两个协议

我还建议您不要直接从根目录颁发“最终用户证书”。最好从根目录下颁发中间证书,然后使用intermediate_certificate.crt颁发实际的服务器或客户端证书。 有关原因,请参见此处:


下面是一个使用OpenSSL部署您自己的CA的好方法。它将向您展示如何设置根服务器、中间服务器和吊销服务器

原因:如果您稍早查看调试日志,您将看到
CertificateRequest
消息,其中指定了(除其他事项外)服务器请求的证书颁发机构;看见Java将其定义为信任库中证书的主体名称,因为信任库中的证书通常是CA证书(通常是CA根证书,如预定义的证书)。大多数客户端软件都遵循此指令,尽管也有例外。因此,如果您的信任库包含如下证书

Subject=Client1 Issuer=MyCA
Subject=Client2 Issuer=MyCA
Subject=Client3 Issuer=MyCA
然后,您的服务器将请求任何
Client1 Client2 Client3
客户颁发的证书,而不是
MyCA
。如果客户机实际上只有一个证书,它是用于例如代码> client 2<代码>,但是是由<代码> MyCA < /代码>发布的——不是由任何<代码> client < /C> >大多数客户端软件都会认为CLST不能接受这个服务器/握手。 PKI方式。证书不能在到期前失效是不正确的。PKI通常被明确设计用于处理此类情况,一般称为撤销。证书在到期前可以被吊销的原因有很多;对于用于SSL/TLS的特定PKI方案(Java也用于其他事情,如代码签名),即PKIX(或有效等效的X.509),请参见第5节的其余部分,了解证书撤销列表(CRL),处理撤销的旧的传统方式,以及在线证书状态协议(OCSP),更新的方式

对于“真正的”(公共)PKI,这基本上是可行的。Java实现了PKIX撤销检查,但是对于SSL/TLS(JSSE),默认情况下它是禁用的;必须设置sysprop
com.sun.net.ssl.checkRevocation
才能使用它。您可能还需要为CRLs设置
com.sun.security.enableCRLDP
,AFAICT始终需要为ocsp设置安全属性(而不是sysprop)
ocsp.enable
。参见示例:


但是运行CRL分发点和/或OCSP响应程序,以便它们在需要时(可以是任何时间)是正确的和可用的,这是非常重要的;这是真正的CAs收费(或获得补贴)的事情之一。为您自己的个人CA执行此操作可能会让您感到头痛,也可能实际上是不可能的,但如果您愿意,请更具体地说明您的CA

你的情况原则上更简单;你只有一个CA,你操作它,所以你知道什么时候会发生撤销。当服务器发生更改时,您可以简单地向服务器提供CRL。但是AFAICS内置代码无法使用该信息,因此您必须使用允许编写自己的TrustManager的钩子来代替内置代码,并将其修改为使用带有CertStor的验证器
Subject=Client1 Issuer=MyCA
Subject=Client2 Issuer=MyCA
Subject=Client3 Issuer=MyCA