2king2
@2king2
Web software developer

Платежная система Rapida. Как сертификаты поместить в java?

Есть файлик Certificate.key (RSA), есть файл Certificate.cer получены от Рапиды, есть софт доставшийся по наследству. Как научить Java пользоваться сертификатом?


у меня в распоряжение есть два файла *.cer (clientCert) и *.key (privateKey)

Покапавшись в коде нашел строки

PEMReader r1 = new PEMReader(new StringReader(data.paramNamed(«privateKey»)));

PEMReader r2 = new PEMReader(new StringReader(data.paramNamed(«clientCert»)));

И тут я повис совсем :(

Как *.key to *.pem и *.cer to *.pem осуществить


А то Java сипит следующие ошибки


INFO 05.03.12 12:04:38.053 [Thread-5] Http GET request (timeout: 0 ms) on gate.rapida.ru/gate?function=getbalance&PaymExtId=...

headers:

status: null

ERROR 05.03.12 12:04:38.291 [Thread-5] Updating balance of ProcessingData(id: 1180;type: 175) failed

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)

at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)

at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)

at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)

at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)

at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1565)

at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116)

at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)

at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)

at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)

at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)

at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)

at fs.core.tools.InternetProvider.executeWithClientCert(InternetProvider.java:181)

at fs.plugins.rapida.RapidaGateway.sendMessage(RapidaGateway.java:189)

at fs.plugins.rapida.RapidaBalanceRequest.execute(RapidaBalanceRequest.java:15)

at fs.core.domain.ProcessingData.updateBalance(ProcessingData.java:261)

at fs.offline.balances.GatewayBalanceUpdater.body(GatewayBalanceUpdater.java:100)

at fs.core.services.Service.run(Service.java:196)

at java.lang.Thread.run(Thread.java:619)

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)

at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)

at sun.security.validator.Validator.validate(Validator.java:218)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1014)

… 24 more

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)

at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)

at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)

… 30 more
  • Вопрос задан
  • 3432 просмотра
Пригласить эксперта
Ответы на вопрос 4
@relgames
Java Developer
Нужно добавить .cer файлы в keystore системы.
Без понятия, где файлы в Rapida, это вам придется выяснить.

Или можно добавить в корневое хранилище JRE (keytool -import -trustcacerts -file Certificate.cer -alias RAPIDA -keystore $JAVA_HOME/jre/lib/security/cacerts)
Дефолтный пароль changeme
Ответ написан
vacuumn
@vacuumn

Попробуй воспользоваться вот этим решением.

Ответ написан
Комментировать
@TzX

На сайте рапиды есть пример, как подключиться к их серверу из Java`ы. Без проблем завелось все. Тесты прошли.

Ответ написан
Комментировать
@jkotkot
режим сарказма
Вариант с добавлеием в jre не очень хороший, так как потребует каждый раз патчить после обновления. Плюс сертификат рано или поздно протухнет, и у вас будут другие ошибки, так что лучше следить за датой программно.
Можно посмотреть и скачать сертификат вручную(например через браузер), и потом каждый раз при старте приложения его динамически подгружать.
Решал тут аналогичную проблему для клиента. Решилось обновление до последней версии в ветке. Там были нужные корневые сертификаты. Какая у вас версия JDK?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы