Я знаю, что хранилище ключей, пароль и протоколы верны, потому что, когда я делаю это полностью программно, как показано в https://stackoverflow.com/a/63080443/796761, соединение и запрос полностью работают. p>
Однако, когда я удаляю все настройки хранилища ключей/SSL и пытаюсь вернуться к тому, что я настроил в server.xml, я получаю ту же ошибку, что и при SSL вообще не настраиваю. (В данном случае это исключение java.io.IOException: анализатор заголовка HTTP/1.1 не получил байтов.)
Соответствующие элементы server.xml:
Соответствующие элементы server.xml:
Код: Выделить всё
webProfile-8.0
...
...
Код: Выделить всё
HttpRequest request = HttpRequest.newBuilder().uri(validationEndpoint)
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString(jsonRequest))
.build();
HttpClient client = HttpClient.newBuilder().build();
return client.send(request, BodyHandlers.ofString()).body();
Опять же, если вместо этого я заменю указанный выше клиент следующим, запрос будет выполнен успешно:
Код: Выделить всё
char[] passwordChars = keystorePassword.toCharArray();
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("/keys/MerchID.AZMVDNOW.p12"), passwordChars);
KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509");
keyMgrFactory.init(keyStore, passwordChars);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(keyMgrFactory.getKeyManagers(), null, null);
SSLParameters sslParam = new SSLParameters();
sslParam.setNeedClientAuth(true);
HttpClient client = HttpClient.newBuilder()
.sslContext(sslContext)
.sslParameters(sslParam).build();
Итак, вопрос в том, как я могу заставить Liberty использовать это конкретное хранилище ключей при подключении https к указанный сервер?
Я пока не нашел примера автоматического установления такого соединения с Liberty с использованием настроенной конфигурации SSL, поэтому надеюсь, что мне просто не хватает простого связующего звена.
Изменить:
Код: Выделить всё
javax.net.debug=ssl
Код: Выделить всё
[err] javax.net.ssl|DEBUG|69|HttpClient-1-Worker-0|2024-07-12 20:30:31.041 UTC|SSLCipher.java:1870|KeyLimit read side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
[err] javax.net.ssl|DEBUG|69|HttpClient-1-Worker-0|2024-07-12 20:30:31.041 UTC|SSLCipher.java:2024|KeyLimit write side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
[err] javax.net.ssl|DEBUG|69|HttpClient-1-Worker-0|2024-07-12 20:30:31.051 UTC|SSLCipher.java:1870|KeyLimit read side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
[err] javax.net.ssl|ALL|69|HttpClient-1-Worker-0|2024-07-12 20:30:31.053 UTC|X509Authentication.java:223|No X.509 cert selected for [RSA, EC]
[err] javax.net.ssl|DEBUG|69|HttpClient-1-Worker-0|2024-07-12 20:30:31.053 UTC|SSLCipher.java:2024|KeyLimit write side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
[err] javax.net.ssl|DEBUG|91|Finalizer thread|2024-07-12 20:30:31.127 UTC|SSLSocketImpl.java:577|duplex close of SSLSocket
[err] javax.net.ssl|DEBUG|91|Finalizer thread|2024-07-12 20:30:31.129 UTC|SSLSocketImpl.java:1785|close the SSL connection (passive)
При трассировке Liberty SSL похоже, что соответствующие объекты загружены успешно, включая эту запись, показывающую, что Liberty смогла увидеть сертификат в магазине:
[12.07.24, 20:49:04:920 UTC] 00000031 id=00000000 com.ibm.ws. ssl.config.WSKeyStore 3 псевдоним: сертификат удостоверения продавца Apple Pay
И сопоставил имя хоста с конфигурацией:
< blockquote>
[12.07.24, 20:49:05:241 UTC] 00000031 id=00000000
com.ibm.ws.channel.ssl.internal.SSLChannelProvider 3
setSslConfig
id=applePaySSL
{com.ibm.ws.ssl.internal.RepertoireConfigService,
com.ibm.wsspi.ssl.SSLConfiguration}={verifyHostname=false,
service.scope=bundle,
comComponent.name=com.ibm.ws.ssl.internal.RepertoireConfigService,
TrustStore.target=(service.pid=com.ibm.ws.ssl.keystore_0),
trustDefaultCerts=false,
KeyStore.target=(service.pid=com.ibm.ws.ssl.keystore_0),
sslProtocol=TLSv1.2, config.source=file,
outboundConnection.0.host=apple-pay-gateway-cert.apple.com,
id=applePaySSL, service.pid=com.ibm.ws.ssl.repertoire_0,clientAuthenticationSupported=false, service.id=621,
keyStoreRef=com.ibm.ws.ssl.keystore_0, EnforceCipherOrder=false,
service.bundleid=132,
outboundConnection.0 .config.referenceType=com.ibm.ws.ssl.repertoire.config.outboundConnection,
osgi.ds.satisfying.condition.target=(osgi.condition.id=true),
config.overrides =true, clientAuthentication=true, компонент.id=487,
efficientTrustStore=com.ibm.ws.ssl.keystore_0,
config.id=com.ibm.ws.ssl.repertoire[applePaySSL], SecurityLevel=HIGH,
service.factoryPid=com.ibm.ws.ssl.repertoire, service.vendor=IBM,
config.displayId=ssl[applePaySSL]
< /blockquote>
Но я думаю, что исходящее соединение использовало SSLConfig по умолчанию вместо applePaySSL:
[12.07.24, 20:50:43:868 UTC] 00000046 id=00000000 com.ibm.ws.ssl.SSLPropertyUtils > lookupProperties alias=defaultSSLConfig Entry
[12.07.24, 20:50 :43:868 UTC] 00000046 id=00000000 com.ibm.ws.ssl.SSLPropertyUtils > getProperties sslAliasName=defaultSSLConfig
currentConnectionInfo={com.ibm.ssl.direction=outbound
< /blockquote>
Я не могу вставить сюда всю огромную трассировку, но при необходимости могу предоставить подробности.
Подробнее здесь: https://stackoverflow.com/questions/787 ... m-keystore