1. 前言
本篇博客是工作经验总结,如果您发现此篇博客有疏漏或有待改进之处,欢迎评论区交流。
2. CRL简介
CRL (Certificate Revocation List) 证书吊销列表。是CA机构维护的一个已经被吊销的证书序列号列表,浏览器需要定时更新这个列表,浏览器在验证证书合法性的时候也会在证书吊销列表中查询此证书是否已经被吊销,如果被吊销了那这个证书也是不可信的。可以看出,这个列表随着被吊销证书的增加而增加,列表会越来越大,浏览器还需要定时更新,实时性也比较差。所以就有了OSCP。
OSCP (Online Certificate Status Protocol) 在线证书状态协议。这个协议就是解决了 CRL 列表越来越大和实时性差的问题而生的。有了这个协议,浏览器就可以不用定期更新CRL了,在验证证书的时候直接去CA服务器实时校验一下证书有没有被吊销就可以,是解决了CRL的问题,但是每次都要去CA服务器上校验也会很慢,在网络环境较差的时候或者跨国访问的时候,体验就非常差了,OCSP虽然解决了CRL的问题但是性能却很差。
3. 代码实现
3.1. 代码功能介绍
1. 生成RSA密钥对(当成是CA密钥对);
2. 根据1中的CA密钥对,自签一个CA根证书;
3. 生成另一对RSA密钥对(当成是用户密钥对);
4. 通过CA私钥和CA公钥证书签发一个用户公钥证书;
5. 通过CA私钥和CA公钥证书生成一个CRL文件;
6. 把第4步中的用户公钥证书添加到吊销列表CRL文件中;
7. 解析CRL文件,遍历CRL文件里面被吊销的证书列表;
8. 判断用户证书是否被吊销。
3.2. 需要引入的包
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.70</version> </dependency>
3.3. 代码实现
代码的功能和 3.2 中是对应的,这里就不过多解释代码逻辑了。
package com.example.cert.cert;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.CRLReason;
import org.bouncycastle.cert.X509CRLHolder;
import org.bouncycastle.cert.X509v2CRLBuilder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CRLConverter;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import java.io.FileInputStream