Я пытаюсь создать файл PKCS12, содержащий только сертификат (без закрытых ключей). Я использую следующую команду:
openssl pkcs12 -export -in ca.crt -out server-ca.pfx -name server-ca -nokeys
Я могу успешно использовать этот файл pkcs12 с curl, и он подтверждает мой сертификат сервера.
Если я пытаюсь использовать этот файл в качестве хранилища доверия в Java, я получаю следующую ошибку:
javax.net.ssl.SSLHandshakeException, with message: sun.security.validator.ValidatorException: No trusted certificate found.
Я использую этот файл с:
val trustInput = new FileInputStream(".../server-ca.pfx")
val trustKeyStore = KeyStore.getInstance("PKCS12")
trustKeyStore.load(trustInput, "123456".toCharArray())
trustInput.close()
val trustFactory = TrustManagerFactory.getInstance("SunX509")
trustFactory.init(trustKeyStore)
val context = SSLContext.getInstance("TLS")
context.init(null, trustFactory.getTrustManagers, new SecureRandom())
Однако, если я создаю хранилище ключей JKS, содержащее файл ca.crt
, а затем преобразую его в файл pkcs12, мое java-приложение правильно проверяет сертификат сервера, используя тот же код.
keytool -importkeystore -srckeystore server-ca.jks -destkeystore from-jks.pfx -srcstoretype JKS -deststoretype PKCS12
Какую команду openssl
мне нужно использовать для создания файла pkcs12, содержащего один сертификат, который jvm принимает в качестве действительного хранилища доверия?