У меня есть класс, который будет загружать файл с сервера https . Когда я запускаю его, он возвращает много ошибок. Кажется, у меня проблема с моим сертификатом. Можно ли проигнорировать аутентификацию клиент-сервер? Если да, то как?
package com.da;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.concurrent.Future;
import org.apache.http.HttpResponse;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.HttpAsyncClient;
import org.apache.http.nio.client.methods.AsyncCharConsumer;
import org.apache.http.nio.client.methods.HttpAsyncGet;
import org.apache.http.nio.client.methods.HttpAsyncPost;
public class RSDDownloadFile {
static FileOutputStream fos;
public void DownloadFile(String URI, String Request) throws Exception
{
java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
"Lang=EN&AuthToken=package", null);
System.out.println("URI Query: " + uri.toString());
HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
httpclient.start();
try {
Future<Boolean> future = httpclient.execute(
new HttpAsyncGet(uri),
new ResponseCallback(), null);
Boolean result = future.get();
if (result != null && result.booleanValue()) {
System.out.println("\nRequest successfully executed");
} else {
System.out.println("Request failed");
}
}
catch(Exception e){
System.out.println("[DownloadFile] Exception: " + e.getMessage());
}
finally {
System.out.println("Shutting down");
httpclient.shutdown();
}
System.out.println("Done");
}
static class ResponseCallback extends AsyncCharConsumer<Boolean> {
@Override
protected void onResponseReceived(final HttpResponse response) {
System.out.println("Response: " + response.getStatusLine());
System.out.println("Header: " + response.toString());
try {
//if(response.getStatusLine().getStatusCode()==200)
fos = new FileOutputStream( "Response.html" );
}catch(Exception e){
System.out.println("[onResponseReceived] Exception: " + e.getMessage());
}
}
@Override
protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
try
{
while (buf.hasRemaining())
{
//System.out.print(buf.get());
fos.write(buf.get());
}
}catch(Exception e)
{
System.out.println("[onCharReceived] Exception: " + e.getMessage());
}
}
@Override
protected void onCleanup() {
try
{
if(fos!=null)
fos.close();
}catch(Exception e){
System.out.println("[onCleanup] Exception: " + e.getMessage());
}
System.out.println("onCleanup()");
}
@Override
protected Boolean buildResult() {
return Boolean.TRUE;
}
}
}
Ошибки:
URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
at javax.net.ssl.SSLEngine.wrap(Unknown Source)
at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:154)
at org.apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.java:276)
at org.apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.java:79)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:161)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:335)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180)
... 9 more
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(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
... 16 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 21 more
onCleanup()
[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
java
ssl
https
ssl-certificate
neztreh
источник
источник
Ответы:
Проблема появляется, когда ваш сервер имеет самозаверяющий сертификат. Чтобы обойти это, вы можете добавить этот сертификат в список доверенных сертификатов вашей JVM.
В этой статье автор описывает, как получить сертификат из вашего браузера и добавить его в файл cacerts вашей JVM. Вы можете редактировать
JAVA_HOME/jre/lib/security/cacerts
файл или запустить приложение с-Djavax.net.ssl.trustStore
параметром. Проверьте, какой JDK / JRE вы тоже используете, поскольку это часто приводит к путанице.См. Также: Как разрешаются имена серверов сертификатов SSL / Можно ли добавить альтернативные имена с помощью keytool? Если вы столкнетесь с
java.security.cert.CertificateException: No name matching localhost found
исключением.источник
cacerts
должны быть обновленыВот что у меня надёжно работает на macOS. Обязательно замените example.com и 443 фактическим именем хоста и портом, к которому вы пытаетесь подключиться, и укажите собственный псевдоним. Первая команда загружает предоставленный сертификат с удаленного сервера и сохраняет его локально в формате x509. Вторая команда загружает сохраненный сертификат в доверенное хранилище SSL Java.
источник
У меня была та же проблема с действующим подписанным сертификатом подстановочного знака от Symantec.
Сначала попробуйте запустить ваше Java-приложение с -Djavax.net.debug = SSL, чтобы увидеть, что на самом деле происходит.
Я закончил тем, что импортировал промежуточный сертификат, который вызывал разрыв цепочки сертификатов.
Я загрузил недостающий промежуточный сертификат из symantec (вы можете увидеть ссылку для загрузки отсутствующего сертификата в журнале рукопожатия ssl: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer в моем случае).
И я импортировал сертификат в хранилище ключей Java. После импорта промежуточного сертификата мой шаблонный сертификат ssl наконец заработал:
источник
-Djavax.net.debug=ssl,handshake -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStore=our-client-certs -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=their-server-certs
JRE_HOME/bin
илиJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
источник
changeit
( stackoverflow.com/a/22782035/1304830 ). Также обязательно запустите cmd от имени администратора.Ответ @Gabe Martin-Dempesy мне помог. И я написал небольшой сценарий, связанный с этим. Использование очень просто.
Установить сертификат с хоста:
Удалите сертификат, который уже установлен.
java-cert-importer.sh
источник
./java-cert-importer.sh example.com 1234
). Вот и все.Цитата из Нет больше «невозможно найти действительный путь сертификации для запрашиваемой цели»
Попробуйте приведенный там код. Это может помочь.
источник
Это решило мою проблему,
Нам нужно импортировать сертификат на локальную Java. Если нет, мы могли бы получить следующее исключение.
SSLPOKE - это инструмент, с помощью которого вы можете проверить соединение https с вашего локального компьютера.
Команда для проверки подключения:
Сначала будет предложено «Введите пароль хранилища ключей:»
changeit
- пароль по умолчанию. и, наконец, приглашение «Доверять этому сертификату? [нет]:», укажите «да», чтобы добавить сертификат в хранилище ключей.Verfication:
источник
Я смог заставить его работать только с кодом, то есть нет необходимости использовать keytool:
источник
Источником этой ошибки в моем экземпляре Apache 2.4 (с использованием группового сертификата Comodo) был неполный путь к подписанному корневому сертификату SHA-1. В выданном сертификате было несколько цепочек, а в цепочке, ведущей к корневому сертификату SHA-1, отсутствовал промежуточный сертификат . Современные браузеры знают, как справиться с этим, но Java 7 не справляется с этим по умолчанию (хотя в коде есть несколько запутанных способов сделать это). Результатом являются сообщения об ошибках, которые выглядят идентично случаю самозаверяющих сертификатов:
В этом случае создается сообщение «невозможно найти действительный путь сертификации к запрошенной цели» из-за отсутствия промежуточного сертификата. Вы можете проверить, какой сертификат отсутствует с помощью теста SSL Labs на сервере. Как только вы найдете соответствующий сертификат, загрузите его и (если сервер находится под вашим контролем) добавьте его в комплект сертификатов. Кроме того, вы можете импортировать отсутствующий сертификат локально. Размещение этой проблемы на сервере является более общим решением проблемы.
источник
Только для Windows, выполните следующие действия:
источник
Для тех, кто любит Debian и готовую Java:
Не забудьте проверить
/etc/default/cacerts
:Чтобы удалить сертификат:
источник
Это также может быть вызвано использованием сертификатов GoDaddy с Java 7, которые подписаны с использованием SHA2.
Chrome и все другие браузеры начинают отказываться от сертификатов SSL, подписанных с использованием SHA1, поскольку это не так безопасно.
Более подробную информацию о проблеме можно найти здесь , а также о том, как решить ее на вашем сервере, если вам нужно сейчас.
источник
У меня была та же проблема с ошибкой сертификатов, и это было из-за SNI, и у http-клиента, который я использовал, не было реализовано SNI. Таким образом, обновление версии сделало свою работу
источник
ОБНОВЛЕНИЕ: То, что перезагрузка помогла, было случайным (я надеялся, ура!). Настоящая причина проблемы заключалась в следующем: когда Gradle получает указание использовать определенное хранилище ключей, это хранилище ключей также должно содержать все официальные корневые сертификаты. В противном случае он не сможет получить доступ к библиотекам из обычных репозиториев. Что мне нужно было сделать, это:
Импортируйте самоподписанный сертификат:
Добавьте официальные корневые сертификаты:
Может быть, Демон Gradle тоже помешал. Возможно, стоит убить всех найденных демонов,
./gradlew --status
если все начнет выглядеть мрачно.ОРИГИНАЛЬНАЯ ПУБЛИКАЦИЯ:
Никто не поверит этому, я знаю. Тем не менее, если ничего не помогает, попробуйте: после перезагрузки моего Mac проблема исчезла. Хмм.
Справочная информация: ./gradlew jar постоянно давал мне сообщение «невозможно найти действительный путь сертификации для запрашиваемой цели»
Я застрял с самозаверяющим сертификатом, сохраненным из браузера, импортированным в privateKeystore.jks. Затем поручил Gradle работать с privateKeystore.jks:
Как уже упоминалось, это работало только после перезагрузки.
источник
AVG версии 18.1.3044 (с Windows 10) мешает моему локальному приложению Spring.
Решение: войдите в раздел AVG под названием «Интернет и электронная почта» и отключите «Защита электронной почты». AVG блокирует сертификат, если сайт не защищен.
источник
Убедитесь, что https://176.66.3.69:6443/ имеет действительный сертификат. Вы можете проверить это через браузер, во-первых, если он работает в браузере, он будет работать в Java.
это работает для меня
источник
Есть много способов решить эту проблему ...
Один из способов - установить сертификаты TrustStore в файле хранилища ключей и поместить его в путь приложения, а также установить следующие системные свойства в основном методе:
Другой способ - поместить хранилище ключей как файл ресурсов в файл jar проекта и загрузить его:
В Windows вы можете попробовать это решение тоже: https://stackoverflow.com/a/59056537/980442
Я создал файл хранилища ключей из
.crt
файла CA центра сертификации следующим образом:К вашему сведению: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
источник
У вас есть два варианта: импортировать самоподписанный сертификат в хранилище ключей java для каждого jvm, на котором будет работать программное обеспечение, или попробовать не проверяющую фабрику ssl:
источник
Была проблема, как это изображение.
Перепробовал несколько решений. Но обнаружил, что даже если это тот же проект, когда он находится на рабочем месте другого, это совершенно нормально. Никаких дополнительных настроек не требуется. Итак, мы догадались, что это проблема окружающей среды. Мы пытались изменить версию JDK, IDE, но не работали. на расследование ушло около 4 часов, пока мы не попробовали самый лучший ответ. Я не нашел ошибку, упомянутую в этом ответе, но через браузер я обнаружил, что HTTP URL (блокировка) был сертифицирован Чарльзом. Потом я понял, что мои чарльзы были включены все время. Пока я это выключил, все работает нормально.
Поэтому я оставил свой опыт, который мог бы помочь вашему делу.
источник
В моем случае я использую MacOs High Sierra с Java 1.6. Файл cacert находится в другом месте, чем указано в ответе Гейба Мартина-Демпси. Файл cacert также уже был связан с другим местоположением (/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts).
Используя FireFox, я экспортировал сертификат с соответствующего веб-сайта в локальный файл с именем «exportedCertFile.crt». Оттуда я использовал keytool для перемещения сертификата в файл cacert. Это решило проблему.
источник
Сначала загрузите ssl-сертификат, затем вы можете перейти к своему пути в java bin, выполнив в консоли следующую команду.
источник
В моем случае у обоих хранилищ ключей и хранилищ доверенных сертификатов был один и тот же сертификат, поэтому удаление хранилища доверенных сертификатов помогло. Иногда цепочка сертификатов может быть проблемой, если у вас есть несколько копий сертификатов.
источник