在Java中需要有关加密例程的帮助。
给定PKCS#7签名,我想针对受信任的存储验证它包含的所有证书。我假设签名中包含的所有证书均以正确的顺序形成有效的证书路径(或链,无论如何),因此
最后一个证书(#N)由CA签名。
到目前为止,这是我设法破解的:
// Exception handling skipped for readability
//byte[] signature = ...
pkcs7 = new PKCS7(signature); // `sun.security.pkcs.PKCS7;`
// *** Checking some PKCS#7 parameters here
X509Certificate prevCert = null; // Previous certificate we've found
X509Certificate[] certs = pkcs7.getCertificates(); // `java.security.cert.X509Certificate`
for (int i = 0; i < certs.length; i++) {
// *** Checking certificate validity period here
if (cert != null) {
// Verify previous certificate in chain against this one
prevCert.verify(certs[i].getPublicKey());
}
prevCert = certs[i];
}
//String keyStorePath = ...
KeyStore keyStore = KeyStore.getInstance("JKS"); // `java.security.KeyStore`
keyStore.load(new FileInputStream(keyStorePath), null);
// Get trusted VeriSign class 1 certificate
Certificate caCert = keyStore.getCertificate("verisignclass1ca"); // `java.security.cert.Certificate`
// Verify last certificate against trusted certificate
cert.verify(caCert.getPublicKey());
所以问题是-
如何使用标准Java类(例如,CertPath
和朋友)来完成此任务?我有种很强烈的感觉,我正在重新发明自行车。或者,如果有人使用BouncyCastle库提供示例,那也可以。
额外的问题:如何针对受信任的存储验证证书,以便自动选择根证书?
自己找到解决方案。因此,这是如何针对受信任的存储提取和验证证书链的方法(为便于阅读,跳过了异常处理):
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// Get ContentInfo
//byte[] signature = ... // PKCS#7 signature bytes
InputStream signatureIn = new ByteArrayInputStream(signature);
DERObject obj = new ASN1InputStream(signatureIn).readObject();
ContentInfo contentInfo = ContentInfo.getInstance(obj);
// Extract certificates
SignedData signedData = SignedData.getInstance(contentInfo.getContent());
Enumeration certificates = signedData.getCertificates().getObjects();
// Build certificate path
List certList = new ArrayList();
while (certificates.hasMoreElements()) {
DERObject certObj = (DERObject) certificates.nextElement();
InputStream in = new ByteArrayInputStream(certObj.getDEREncoded());
certList.add(cf.generateCertificate(in));
}
CertPath certPath = cf.generateCertPath(certList);
// Load key store
//String keyStorePath = ...
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(keyStorePath), null);
// Set validation parameters
PKIXParameters params = new PKIXParameters(keyStore);
params.setRevocationEnabled(false); // to avoid exception on empty CRL
// Validate certificate path
CertPathValidator validator = CertPathValidator.getInstance("PKIX");
CertPathValidatorResult result = validator.validate(certPath, params);
validate()
如果验证失败,将抛出异常。
文档:ASN1Set
,ContentInfo
,SignedData
。其他所有外来名称和相关文档都可以在中找到java.security.cert
。
这里没有SUN依赖项,仅需要BouncyCastle提供程序库。
我试图实现PDFS的签名验证。这是一个很大的主题,所以我一步一步地进行,首先,我试图在我自己签名的PDF中实际返回一个正值,使用当前Acrobat的所有默认值--对于摘要,应该是SHA256和PKCS7分离签名。因此,我破解了openssl,通过读取PDF中给出的字节范围并调用函数,我得到了一个哈希值来进行比较。因此,现在我需要读取证书数据等,并使用函数。这个看起来就是我想要的: 如文档中所示。除
我能够成功提取PKCS#7容器数据,并使用以下代码验证数据类型代码值是否为: 然而,我现在已经到了一个我被卡住的地步。如何从PKCS#7有效载荷获取X.509证书数据?我可以看到数据结构应该包含证书链数据。它的数据类型是,我想一旦我在内存中获得X.509证书数据,我就可以找到使用OpenSSL的方法的代码。我只是不知道怎么做那部分。 我找到了这个关于在OSX/IOS上验证收据的资源,它涉及到许多相
我有一个签名的PKCS#7结构:
为了在OpenSSL中签名证书,我使用函数,向它提供一个请求(作为)、一个签名密钥和一个摘要。 现在我有我的签名密钥存储在HSM中,所以我无法提取它来签名证书。不幸的是,PKCS#11没有提供的等价物。它只有系列函数,这些函数对原始数据进行操作,而不是对证书进行操作。 有人能帮助我使用示例C/C++代码如何使用PKCS#11签署一个用OpenSSL创建的证书吗?
我一直在试用Vaadin 7。首先,我必须说明我对Vaadin是个安静的呆子,对JAVA Perstression不是很熟悉。因此,我试图学习bean验证以及如何使用它。我已经学习了几个教程,但是很难确定哪一个是Vaadin7的最新和正确的教程。尽管如此,我尝试下载并使用JPA容器和BeanValidator,但无法使其工作。下面是我正在使用的代码: 而且 classnotfound异常已消失,但
假设我编写了两个Java应用程序:和,它们在两个独立的服务器上部署和运行(部署到和部署到