背景
https 证书的安全性依赖于私钥,如果私钥不小心泄露出去,证书按道理来说就不应该继续使用,即使网站重新签发了一张新的数字证书,黑客可以用泄露的私钥窃取到双方通信的机密。 比如日常生活中身份证丢失,因为丢失的身份证仍在有效期内,即使已经补办一张新的身份证,不法分子扔可以使用丢失的身份证进行非法操作。 证书吊销列表提供了一种机制阻止这种情况的发生,证书签发机构会维护一个证书吊销列表,证书校验过程如果检查到证书已经吊销,就终止交易从而保护通信安全
一、下载CRL文件
打开一个证书,点击详细信息,点击CRL分发点既可查看CRL文件下载链接 复制链接 hwitpki.huawei.com/crl/HWIT%20… 在浏览器打开,既可下载到CRL文件
二、Java校验CRL
1、读取 CRL文件返回X509CRL类
代码如下:
/**
* 读取 CRL文件 返回X509CRL类
*
* @return X509CRL
* @throws Exception 异常
*/
private static X509CRL loadX509CRL() throws Exception {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
return (X509CRL) certificateFactory.generateCRL(
new FileInputStream("C:\Users\xxxxx\Desktop\cert\HWIT Enterprise CA 1.crl"));
}
2、读取证书返回X509Certificate
/**
* 读取证书,返回X509Certificate
*
* @return X509Certificate
* @throws Exception 异常
*/
private static X509Certificate getCertificate() throws Exception {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
return (X509Certificate) certificateFactory.generateCertificate(
new FileInputStream("C:\Users\xxxxx\Desktop\cert\his.cer"));
}
3、校验证书是否吊销
代码如下:
public static void main(String[] args) {
try {
X509Certificate certificate = getCertificate();
X509CRL crl = loadX509CRL();
// 吊销返回true,正常返回false
System.out.println(crl.isRevoked(certificate));
} catch (Exception ex) {
ex.printStackTrace();
}
}
三、CRL文件二进制格式和文本格式转换
下载下来的CRL文件一般都是二进制格式,可以保存为文本格式,方便数据库存储。
1、文件转CRL对象
此时文件可以为二进制或者文本格式 代码如下:
/**
* 读取 CRL文件 返回X509CRL类
*
* @return X509CRL
* @throws Exception 异常
*/
private static X509CRL loadX509CRL() throws Exception {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
return (X509CRL) certificateFactory.generateCRL(
new FileInputStream("C:\Users\xxx\Desktop\cert\HWIT Enterprise CA 1.crl"));
}
2、CRL对象转文本
转换代码如下:假设已经得到了X509CRL对象
/**
* The constant CRL_BEGIN.
*/
private static final String CRL_BEGIN = "-----BEGIN X509 CRL-----";
/**
* The constant CRL_END.
*/
private static final String CRL_END = "-----END X509 CRL-----";
private Optional<String> buildX509Str(X509CRL x509CRL) {
StringBuilder yamlBuilder = new StringBuilder();
try {
yamlBuilder.append(CRL_BEGIN).append(NEW_LINE);
yamlBuilder.append(Base64.getEncoder().encodeToString((x509CRL).getEncoded())).append(NEW_LINE);
yamlBuilder.append(CRL_END).append(NEW_LINE);
return Optional.of(yamlBuilder.toString());
} catch (CRLException ex) {
log.error("build x509Str error", ex);
}
return Optional.empty();
}
可以得到文本格式的CRL文件
3、文本转CRL对象
String TEXT="-----BEGIN X509 CRL----- DATADATADATADATA -----END X509 CRL-----";
CrlUtils.parseCRL(TEXT.getBytes(StandardCharsets.UTF_8))
/**
* 解析crl证书
*
* @param data 二进制数据
* @return X509CRL x 509 crl
*/
public static Optional<X509CRL> parseCRL(byte[] data) {
X509CRL crl = null;
try (ByteArrayInputStream is = new ByteArrayInputStream(data)) {
crl = (X509CRL) CertificateFactory.getInstance("X.509").generateCRL(is);
} catch (CRLException | CertificateException | IOException ex) {
LOGGER.error("parse crl file error");
}
return Optional.ofNullable(crl);
}
四、CRL 和 OCSP
Certification Revocation List(证书吊销列表)很容易理解,它是 CA 签发的一个文件,包含了被吊销的证书的序列号,吊销时间等,TLS 服务端或者客户端用这个文件来检查一个证书是否吊销了。
证书吊销列表 (Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期。 CRL 文件中还包含证书颁发机构信息、吊销列表失效时间和下一次更新时间,以及采用的签名算法等。证书吊销列表最短的有效期为一个小时,一般为 1 天,甚至一个月不等,由各个证书颁发机构在设置其证书颁发系统时设置。
CA会定期更新发布撤销证书列表,Certificate Revocation Lists (以下简称CRL),RFC 5280:Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile。 CRL分布在公共可用的存储库中,浏览器可以在验证证书时获取并查阅CA的最新CRL。
4.1、CRL 检测流程
[ 可以想象一下,在浏览器去校验证书合法性时,还要去下载一个1M的文件后,再去校验。校验通过后才去连想要访问的网站服务器,这相当浪费时间、效率。 同时,很多浏览器所处网络是有网络访问限制的,可能在一个局域网,比如我们村,或者物理距离非常远,存在严重的网络延迟问题。
为了解决单个文件大,延迟性高等问题,迎来了新的解决方案Onlie Certificate StatusOCSP(以下简称OCSP)。 在RFC2560X.509 Internet Public Key Infrastructure Online Certificate Status Protocol – OCSP的描述中,浏览器从在线OCSP服务器(也称为OCSP Response Server)请求证书的撤销状态,OCSP Server予以响应。这种方法避免CRL更新延迟问题。
五、OCSP 检测流程
[ 浏览器在获得Web服务器的公钥证书后,开始验证公钥的合法性,这里会向该公钥的扩展信息中提供的OCSP Server地址发送OCSP Request,获得响应后,确认证书有效,再继续跟Web服务器通信。
OCSP的优点
相对于CRL方式,证书吊销后,CA Server可以立刻将吊销信息发送给浏览器,生效时间快。响应包内容短,不像CRL的响应包,都将近1M以上。
OCSP的缺点
- 浏览器的每次HTTPS请求创建,都需要连接CA OCSP Server进行验证,有的浏览器所在IP与CA OCSP Server的网络并不是通畅的,比如我们村。而且,OCSP的验证有网络IO,花费了很长的时间,严重影响了浏览器访问服务器的用户体验。
- 在浏览器发送服务器HTTPS证书序号到CA OCSP Server时,也将暴露了用户的隐私,将用户访问的网址透漏给了CA OCSP Server。
更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:www.yuque.com/riverzmm/uu… 《安全》