我正在使用以下代码:
public static boolean isCertChainValid(ArrayList<X509Certificate> certificateList) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
CertPath certPath = certificateFactory.generateCertPath(certificateList);
CertPathValidator validator = CertPathValidator.getInstance("PKIX");
KeyStore keystore = KeyStore.getInstance("JKS");
InputStream is = new FileInputStream(System.getProperty("java.home") + "/lib/security/" + "cacerts");
keystore.load(is, "changeit".toCharArray());
PKIXParameters params = new PKIXParameters(keystore);
params.setRevocationEnabled(true);
Security.setProperty("ocsp.enable", "true");
System.setProperty("com.sun.net.ssl.checkRevocation", "true");
System.setProperty("com.sun.security.enableCRLDP", "true");
PKIXCertPathValidatorResult r = (PKIXCertPathValidatorResult) validator.validate(certPath, params);
return true;
} catch (CertificateException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (KeyStoreException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
} catch (CertPathValidatorException e) {
throw new RuntimeException(e);
}
}
这是我获取证书列表的方式:
public static void main(String args[]) throws Exception {
CertVal certVal = new CertVal(new File("/home/varun/Documents/SampleCerts/google.pem"), "X.509");
X509Certificate cert = (X509Certificate) certVal.getCert();
certVal = new CertVal(new File("/home/varun/Documents/SampleCerts/google.int.pem"), "X.509");
X509Certificate int_cert = (X509Certificate) certVal.getCert();
certVal = new CertVal(new File("/home/varun/Documents/SampleCerts/google.root.pem"), "X.509");
X509Certificate root_cert = (X509Certificate) certVal.getCert();
System.out.println(cert.toString());
ArrayList<X509Certificate> cList = new ArrayList<>();
cList.add(cert);
cList.add(int_cert);
cList.add(root_cert);
System.out.println(isCertChainValid(cList));
}
Google.pem、Google.int.pem、Google.root.pem分别是在浏览器中使用导出选项获得的端证书、中间证书和根证书。
密钥:Sun EC公钥,256位公用x Coord:46177506158937302063723158048612066903199153823785912505310712717097913459047公用y Coord:11380901548809011503210296172948380830057126799034749740821637608868220331参数:secp256r1[NIST P-256,X9.62 prime256v1](1.2.840.10045.3.1.7)有效期:[From:Thu Jun 16 14:07:32 IST 2016,To:Thu SEP256V1](1.2.840.10045.3.1.7)P08 13:59:00 IST 2016]发行人:CN=Google Internet Authority G2,O=Google Inc,C=US序列号:[
51E47ED1 28A4436E]
如证书例外9:[1]和[2]所示,OSCP URL和CRL URL都可与证书一起使用。这两个东西在中间证书中也有,但它们在根证书中没有,这是合理的,因为它们不需要与它们一起使用。
我发现了问题所在。
正是根证书在certpath中的存在造成了所有的麻烦。
根证书不包含CRL和OSCP链接。不断更新存储库是可信证书存储库或信任存储库的工作。
而且
线程“main”java.lang.RuntimeException中出现异常:java.Security.Cert.CertPathValidatorException:证书未在以下位置指定OCSP响应程序
简而言之,要检查证书链中证书的吊销状态,需要排除根证书。验证器算法可以确定最后一个中间证书是否由根CA签名。
问题内容: 我目前正在使用SSL编写网络TCP服务器。在生产中,我们最终将要求客户使用证书进行身份验证。 为了在紧急情况下吊销证书,我们还想建立一个CRL。 我的问题是:Java是否开箱即用地检查CRL(如果提供了证书),还是需要手动实施此类检查? 为了进行测试,我准备了带有CRL设置的证书,但是Java似乎没有尝试对其进行验证(我将其放入本地Web服务器中并且无法访问)。 我仅找到 _com.s
我试图使用Github桌面和git shell从Github进行克隆,但不断出现以下错误: 拉取现有存储库时也会出现同样的问题。 我已经尝试上载在
我对PKI的世界是新的,一般的证书。我正在写一个服务,需要验证证书链。 感谢所有的指示和帮助提前。感激不尽。 致以最诚挚的问候
提前谢谢你
问题内容: 我在各地搜索过Google,并在其他社区中询问过,并且继续前进到讨论该规范的Oracle文档。但是,该文档更多地涵盖了方法的命名以及整个体系结构,实际上并未提出讨论如何实际编写一些代码来检查x509证书是否被撤销的方法。 也许这只是我头上的办法?但是如果有人可以帮助我,我肯定会感激不尽,我已经将头撞在墙上的墙上已经有大约一周的时间了。 问题答案: 每个CA都会发布已撤销的证书列表。此列
如果这种理解是正确的,那么我希望x509Chain对象能够通过吊销检查,即使检查是在上面文件的2014年3/1/之后的最新吊销列表存在的情况下进行的。不幸的是,结果是验证失败,因为它认为证书已被吊销。 在这种情况下,我是否必须做进一步的测试以查看撤销日期并覆盖结果并忽略它?我是不是做了什么蠢事?我是不是误会了撤销?