Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-使用系统信任库验证证书_Java_Security_X509certificate_Pki_Truststore - Fatal编程技术网

Java-使用系统信任库验证证书

Java-使用系统信任库验证证书,java,security,x509certificate,pki,truststore,Java,Security,X509certificate,Pki,Truststore,前提:我有一个证书,我想验证系统是否信任此证书(由Java/操作系统的受信任根CA签名) 我已经找到了一些不同的解决方案来实现这一点 备选案文1: 使用SSL类来派生信任 TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmfactory.init((KeyStore) null); for (TrustManager trust

前提:我有一个证书,我想验证系统是否信任此证书(由Java/操作系统的受信任根CA签名)

我已经找到了一些不同的解决方案来实现这一点

备选案文1:

使用SSL类来派生信任

TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmfactory.init((KeyStore) null);
for (TrustManager trustManager : tmfactory.getTrustManagers()) {
    if (trustManager instanceof X509TrustManager) {
        try {
            ((X509TrustManager) trustManager).checkClientTrusted(new X509Certificate[] {new JcaX509CertificateConverter().getCertificate(holder)}, "RSA");
            System.out.println("This certificate is trusted by a Root CA");
        } catch (CertificateException e) {
            e.printStackTrace();
        }
    }
}
由于这种方法严重依赖于SSL类(当前项目不需要这些类),我们正在寻找替代方法

备选案文2: 将Java的
cacerts
文件加载到密钥库中,并根据我的证书检查每个“最受信任”的证书是否相等

String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar);
FileInputStream is = new FileInputStream(filename);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
String password = "changeit";
keystore.load(is, password.toCharArray());

// This class retrieves the most-trusted CAs from the keystore
PKIXParameters params = new PKIXParameters(keystore);
// Get the set of trust anchors, which contain the most-trusted CA certificates
Set<X509Certificate> rootCertificates = params.getTrustAnchors().parallelStream().map(TrustAnchor::getTrustedCert).collect(Collectors.toSet());
return rootCertificates.contains(holderX509);
String filename=System.getProperty(“java.home”)+“/lib/security/cacerts.replace(“/”,File.separatorChar);
FileInputStream is=新的FileInputStream(文件名);
KeyStore KeyStore=KeyStore.getInstance(KeyStore.getDefaultType());
字符串password=“changeit”;
load(is,password.toCharArray());
//此类从密钥库检索最受信任的CA
PKIXParameters params=新的PKIXParameters(密钥库);
//获取信任锚点集,其中包含最受信任的CA证书
Set rootCertificates=params.getTrustAnchors().parallelStream().map(信任锚::getTrustedCert.collect(Collectors.toSet());
返回rootCertificates.contains(holderX509);
这种方法的问题是需要密码来验证JKS编码文件的完整性。而SSL似乎没有(或者更确切地说是使用
System.getProperty(“javax.net.SSL.trustStorePassword”)
,后者又与SSL紧密相连


问:是否存在一种介于从文件手动加载证书和纯SSL之间的解决方案?我觉得似乎应该有一个类,我可以调用它来简单地验证证书的系统信任度,而无需跳转几圈。

除了下载第三方库之外,可能没有其他类了另类

为什么要避免使用“SSL”库?它是标准库的一部分,因此不会给程序带来负担


在任何情况下,证书验证都是SSL的一个重要组成部分。我怀疑是否有人在不实现SSL协议的某些实质子集的情况下创建了这样一个库。这样做没有真正的理由。

在阅读了David Hook的《用Java开始加密》之后,我给出了以下示例验证证书链(实现了使用系统信任库验证根CA的原始目标)


这也实现了不必使用SSL类的目标,而是使用Java安全类/算法。

在这里使用TrustManager没有错。这就是它的目的。克服你的反感。
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", new BouncyCastleProvider());
InputStream is = new ByteArrayInputStream(some bytes in an array);
CertPath certPath = certificateFactory.generateCertPath(is, "PKCS7"); // Throws Certificate Exception when a cert path cannot be generated
CertPathValidator certPathValidator = CertPathValidator.getInstance("PKIX", new BouncyCastleProvider());
PKIXParameters parameters = new PKIXParameters(KeyTool.getCacertsKeyStore());

PKIXCertPathValidatorResult validatorResult = (PKIXCertPathValidatorResult) certPathValidator.validate(certPath, parameters); // This will throw a CertPathValidatorException if validation fails