java使用bouncy castle从证书中提取keyUsage扩展
我正在编写一个小型CA实现。可以从现有证书引导此CA。执行此操作后,我想验证输入是否具有正确的扩展名:
private static final Set<String> REQUIRED_CA_EXTENSIONS = Set.of(
Extension.keyUsage.getId(),
Extension.subjectKeyIdentifier.getId());
private static void validateExtensions(final X509Certificate certificate) {
if (!CertificateExtensions.getAll(certificate).containsAll(REQUIRED_CA_EXTENSIONS)) {
throw new RuntimeException("Attempted to create a CA from a certificate without required extensions");
}
}
// Util method
public static Set<String> getAll(final X509Certificate certificate) {
final Set<String> extensions = new HashSet<>();
extensions.addAll(certificate.getCriticalExtensionOIDs());
extensions.addAll(certificate.getNonCriticalExtensionOIDs());
return extensions;
}
但是,这仅验证扩展是否存在。我还需要验证keyUsage
扩展是否同时包含keyCertSign
和cRLSign
才能对证书进行签名
如何使用bouncy castle和/或JCA实现这一点
# 1 楼答案
JCA^{} 上有一种方法可以返回keyUsage扩展的位,称为^{} 。根据Java文档,由返回数组中的布尔值表示的密钥用法的各个位
也可以使用Bouncycastle库做更多的工作来实现相同的结果。我展示这两种方法是因为Bouncycastle库为检查X509证书提供了更完整的支持,因此有一个示例演示一些简单的方法非常有用,以防您想做一些更困难的事情
请注意,在撰写本文时,这需要两个Bouncycastle库,即主提供程序/加密库和PKIX/CMS库