importlombok.Cleanup;importlombok.Getter;importlombok.Setter;importlombok.SneakyThrows;importlombok.experimental.UtilityClass;importjava.io.FileInputStream;importjava.security.KeyStore;importjava.security.PrivateKey;importjava.security.cert.X509Certificate;importjava.util.Enumeration;/*** An utility class for obtaining {@linkPrivateKey} and the serial number of the trusted {@linkX509Certificate}
* from keystore in PKCS12 format*/@Getter
@Setter
@UtilityClasspublic classSignCertInfo {private static final SignCertInfo DEFAULT = newSignCertInfo();privateString certId;privatePrivateKey privateKey;public staticSignCertInfo createNew(Configs configs) {returncreateNewFrom(getKeyStore(configs), configs);
}
@SneakyThrowsprivate staticSignCertInfo createNewFrom(KeyStore store, Configs configs) {
Enumeration aliases =store.aliases();while(aliases.hasMoreElements()) {
String alia=aliases.nextElement();if(isX509Cert(store, alia)) {
newSignCertInfo(store, alia, configs);
}
}returnDEFAULT;
}
@SneakyThrowsprivate staticKeyStore getKeyStore(Configs configs) {
@Cleanup FileInputStream stream= newFileInputStream(configs.getPfxPath());
KeyStore store=KeyStore.getInstance(Pkcs12KeyStore.TYPE, Pkcs12KeyStore.PROVIDER);
store.load(stream, configs.getPfxPasswd().toCharArray());returnstore;
}
@SneakyThrowsprivate static booleanisX509Cert(KeyStore store, String alia) {returnCertificateType.X509.equalsIgnoreCase(store.getCertificate(alia).getType());
}
@SneakyThrowsprivate staticSignCertInfo newSignCertInfo(KeyStore store, String alia, Configs configs) {
SignCertInfo signCertInfo= newSignCertInfo();
signCertInfo.setCertId(((X509Certificate) store.getCertificate(alia)).getSerialNumber().toString());
signCertInfo.setPrivateKey((PrivateKey) store.getKey(alia, configs.getPfxPasswd().toCharArray()));returnsignCertInfo;
}
}