Я пытаюсь получить сертификат X509, который уже хранится в хранилище ключей, используя псевдоним и пароль.Но я часто получаю исключение нулевого указателя при получении закрытого ключа, который использовался для подписи сертификата.Иногда это работает, а иногда нет.Небольшая помощь будет оценена.Спасибо!
В следующем коде я попытался удалить условие, чтобы проверить, является ли это экземпляром PrivateKey или нет.Это не работает.
public X509Certificate generateCertificate(String userId, char[] password, KeyPair newKeyPair, String algorithm) throws Exception
{
KeyPair groupManagerKeyPair = LoadKeyPair(gmPath, "EC");
PrivateKey gmPrivateKey = groupManagerKeyPair.getPrivate();
String dn = "CN="+userId;
//char[] password = user.getPassword().toCharArray();
String alias = userId;
X509CertInfo info = new X509CertInfo();
Date from = new Date();
Date to = new Date(from.getTime() + 365 * 86400000l);
CertificateValidity interval = new CertificateValidity(from, to);
BigInteger sn = new BigInteger(64, new SecureRandom());
X500Name owner = new X500Name(dn);
info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
info.set(X509CertInfo.SUBJECT, owner);
info.set(X509CertInfo.ISSUER, owner);
info.set(X509CertInfo.KEY, new CertificateX509Key((PublicKey) newKeyPair.getPublic()));
info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V1));
AlgorithmId algo = new AlgorithmId(AlgorithmId.sha256WithECDSA_oid);
info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));
// Sign the cert to identify the algorithm that's used.
X509CertImpl cert = new X509CertImpl(info);
cert.sign(gmPrivateKey, algorithm);
X509Certificate[] certificateChain = new X509Certificate[1];
certificateChain[0] = cert;
System.out.println("cert::"+cert);
//save certificate into keyStore
saveCertificateInKeyStore(alias, password, gmPrivateKey, certificateChain);
// Update the algorithm, and resign.
/*algo = (AlgorithmId)cert.get(X509CertImpl.SIG_ALG);
info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
cert = new X509CertImpl(info);
cert.sign(privkey, algorithm);*/
return cert;
}
public void storeKeyAndCertificateChain(String alias, char[] password, Key key, X509Certificate[] chain) throws Exception{
String keystore = "D:\\testkeys.jks";
KeyStore keyStore=KeyStore.getInstance("jks");
keyStore.load(null,null);
keyStore.setKeyEntry(alias, key, password, chain);
keyStore.store(new FileOutputStream(keystore),password);
}
public X509Certificate loadAndDisplayChain(String alias,char[] password) throws Exception{
//Reload the keystore
String keystore = "D:\\testkeys.jks";
KeyStore keyStore=KeyStore.getInstance("jks");
keyStore.load(new FileInputStream(keystore),password);
Key key=keyStore.getKey(alias, password);
X509Certificate x509Certificate = null;
if(key instanceof PrivateKey){
System.out.println("Get private key : ");
System.out.println(key.toString());
Certificate[] certs=keyStore.getCertificateChain(alias);
System.out.println("Certificate chain length : "+certs.length);
for(Certificate cert:certs){
System.out.println(cert.toString());
if(certs.length == 1)
x509Certificate = (X509Certificate) cert;
}
}else{
System.out.println("Key is not private key");
}
return x509Certificate;
}
I expect that it should load the certificate using the parameters.. alias and password.