我有以下要求:
我的私钥存储在如下文件中:
public static void writePrivateKey(PrivateKey privateKey, OutputStream os) throws IOException
{
BufferedOutputStream bos = new BufferedOutputStream(os);
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
privateKey.getEncoded());
bos.write(pkcs8EncodedKeySpec.getEncoded());
bos.close();
}
我的私钥按如下方式加载:
public PrivateKey loadPrivatekey(InputStream privateKeyInputStream)
throws InvalidKeySpecException, NoSuchAlgorithmException, IOException
{
return KeyFactory.getInstance(algorithamForCreatingAndLoadingKeys)
.generatePrivate(new PKCS8EncodedKeySpec(IOUtils.toByteArray(privateKeyInputStream)));
}
我的算法定义为RSA
private String algorithamForCreatingAndLoadingKeys = "RSA";
我签署我的证书如下:
private static X509CertImpl buildAndSignCert(X509CertInfo certInfo, PrivateKey privateKey)
throws CertificateException, NoSuchAlgorithmException, InvalidKeyException,
NoSuchProviderException, SignatureException, IOException
{
X509CertImpl cert = new X509CertImpl(certInfo);
String algorithm = "SHA1withRSA";
// Sign the cert to identify the algorithm that's used.
cert.sign(privateKey, algorithm);
// Update the algorith, and resign.
certInfo.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM,
cert.get(X509CertImpl.SIG_ALG));
X509CertImpl newCert = new X509CertImpl(certInfo);
newCert.sign(privateKey, algorithm);
return newCert;
}
问题:如果我创建CA证书并结束证书而不保存并加载密钥文件,我能够正确验证结束证书:
C:\ Workspace ..... \ src \ main \ resources> openssl verify -CAfile ca.pem end.pem
end.pem:好的
但是,如果我保存并加载密钥文件并进行验证,我会收到以下错误,这清楚地表明我的结束证书未通过我的证书签名正确
C:\ Workspace ..... \ src \ main \ resources> openssl verify -CAfile ca.pem end.pem
end.pem:C = AU,L = ABC,CN = XYZ
错误20在0深度查找:无法获得本地颁发者证书
因此,Iam得出结论,我保存私钥并加载它是错误的。
任何一个请求都能帮助我在保存和阅读私钥方面做错吗?
非常感谢提前。
答案 0 :(得分:0)
我在上面发布的所有代码都是正确且准确的,可以创建和阅读私钥文件。
我发现加载Created CA Cert本身(不是私钥)的问题,以及我们如何生成X509证书的方法如下:
CertificateFactory f = CertificateFactory.getInstance("X.509");
X509Certificate loadedCaCert = (X509Certificate) f
.generateCertificate(CertificateGenerator.class.getResourceAsStream("/ca.pem"));
上面生成的X509Certificate所产生的序列号与我在创建CA certtificate时所传递的序列号不同(这是另一个问题,但无论如何都未通过该线程)并且我们将此序列号传递给订阅者用于标识其父CA的证书,用于链接其失败的证书。
谢谢