@Override
public List<String> autoSelectCertificates() {
String keystoreFile = "src/main/resources/16733424.p12";
String keystorePassword = "sAB33333";
String selector = CertificateSelectorFactory.fromP12(
"https://auth-dmz-ift.sigma.sbrf.ru",
keystoreFile,
keystorePassword
);
System.out.println("[CustomPlaywrightServiceConfiguration] Auto-select certificate loaded: " + selector);
return List.of(selector);
}
public final class CertificateUtils {
private CertificateUtils() {
}
public static X509Certificate loadCertificate(String path, String password) {
return loadCertificateChain(path, password).stream().findFirst()
.orElseThrow(() -> new IllegalStateException("=== В PKCS12 не найден X509 сертификат ==="));
}
/**
* Загружает всю цепочку сертификатов из PKCS12.
* Возвращает список: [end-entity, intermediate..., root].
*/
public static List<X509Certificate> loadCertificateChain(String path, String password) {
List<X509Certificate> chain = new ArrayList<>();
try (InputStream is = Files.newInputStream(Paths.get(path))) {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(is, password.toCharArray());
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
if (keyStore.isKeyEntry(alias)) {
Certificate[] certs = keyStore.getCertificateChain(alias);
if (certs != null) {
for (Certificate cert : certs) {
if (cert instanceof X509Certificate x509) {
chain.add(x509);
}
}
}
break;
}
}
} catch (Exception e) {
throw new RuntimeException("=== Не удалось прочитать сертификат ===", e);
}
if (chain.isEmpty()) {
throw new IllegalStateException("=== В PKCS12 не найден X509 сертификат ===");
}
return chain;
}
}
public final class CertificateSelectorFactory {
private CertificateSelectorFactory() {
}
public static String fromP12(
String pattern,
String path,
String password) {
List<X509Certificate> chain =
CertificateUtils.loadCertificateChain(path, password);
return CertificateSelector
.certificateSelector()
.pattern(pattern)
.certs(chain)
.build();
}
}