Saya memiliki kelas yang akan mengunduh file dari server https . Ketika saya menjalankannya, ia mengembalikan banyak kesalahan. Tampaknya saya memiliki masalah dengan sertifikat saya. Apakah mungkin untuk mengabaikan otentikasi klien-server? Jika ya, bagaimana caranya?
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;
}
}
}
Kesalahan:
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
sumber
sumber
Jawaban:
Masalah muncul ketika server Anda memiliki sertifikat yang ditandatangani sendiri. Untuk mengatasinya, Anda dapat menambahkan sertifikat ini ke daftar sertifikat tepercaya JVM Anda.
Dalam artikel ini penulis menjelaskan cara mengambil sertifikat dari browser Anda dan menambahkannya ke file cacerts JVM Anda. Anda dapat mengedit
JAVA_HOME/jre/lib/security/cacerts
file atau menjalankan aplikasi Anda dengan-Djavax.net.ssl.trustStore
parameter. Verifikasi JDK / JRE mana yang Anda gunakan juga karena ini sering menjadi sumber kebingungan.Lihat juga: Bagaimana nama server sertifikat SSL teratasi / Bisakah saya menambahkan nama alternatif menggunakan keytool? Jika Anda mengalami
java.security.cert.CertificateException: No name matching localhost found
pengecualian.sumber
cacerts
harus diperbaruiInilah yang andal bekerja untuk saya di macOS. Pastikan untuk mengganti example.com dan 443 dengan nama host dan port aktual yang Anda coba sambungkan, dan berikan alias khusus. Perintah pertama mengunduh sertifikat yang disediakan dari server jarak jauh dan menyimpannya secara lokal dalam format x509. Perintah kedua memuat sertifikat yang disimpan ke toko kepercayaan SSL Java.
sumber
Saya memiliki masalah yang sama dengan sertifikat wildcard ditandatangani yang valid dari symantec.
Pertama coba jalankan aplikasi java Anda dengan -Djavax.net.debug = SSL untuk melihat apa yang sebenarnya terjadi.
Saya akhirnya mengimpor sertifikat perantara yang menyebabkan rantai sertifikat terputus.
Saya mengunduh sertifikat perantara yang hilang dari symantec (Anda dapat melihat tautan unduhan ke sertifikat yang hilang di log jabat tangan ssl: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer dalam kasus saya).
Dan saya mengimpor sertifikat di java keystore. Setelah mengimpor sertifikat perantara, sertifikat wildcard ssl saya akhirnya mulai berfungsi:
sumber
-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
atauJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
sumber
changeit
( stackoverflow.com/a/22782035/1304830 ). Pastikan juga untuk menjalankan cmd sebagai administrator.@Gabe Martin-Dempesy membantu saya. Dan saya menulis skrip kecil yang terkait dengannya. Penggunaannya sangat sederhana.
Pasang sertifikat dari host:
Hapus sertifikat yang sudah diinstal.
java-cert-importer.sh
sumber
./java-cert-importer.sh example.com 1234
). Itu dia.Mengutip dari Tidak ada lagi 'tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta'
Coba kode yang disediakan di sana. Mungkin membantu.
sumber
Ini memecahkan masalah saya,
Kita perlu mengimpor sertifikat ke java lokal. Jika tidak kita bisa mendapatkan pengecualian di bawah ini.
SSLPOKE adalah alat untuk menguji konektivitas https dari mesin lokal Anda.
Perintah untuk menguji konektivitas:
ini pertama kali akan meminta "Masukkan kata sandi keystore:"
changeit
adalah kata sandi default. dan akhirnya prompt "Percayai sertifikat ini? [tidak]:", berikan "ya" untuk menambahkan sertifikat ke keystore.Verifikasi:
sumber
Saya bisa membuatnya bekerja hanya dengan kode, yaitu tidak perlu menggunakan keytool:
sumber
Sumber kesalahan ini pada instance Apache 2.4 saya (menggunakan sertifikat wildcard Comodo) adalah jalur yang tidak lengkap ke sertifikat root bertanda tangan SHA-1. Ada beberapa rantai dalam sertifikat yang diterbitkan, dan rantai yang mengarah ke sertifikat akar SHA-1 tidak memiliki sertifikat perantara . Browser modern tahu cara menangani ini, tetapi Java 7 tidak menanganinya secara default (meskipun ada beberapa cara berbelit-belit untuk mencapai ini dalam kode). Hasilnya adalah pesan kesalahan yang terlihat identik dengan kasus sertifikat yang ditandatangani sendiri:
Dalam kasus ini, pesan "tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta" sedang diproduksi karena sertifikat perantara yang hilang. Anda dapat memeriksa sertifikat mana yang hilang menggunakan tes Labs SSL terhadap server. Setelah Anda menemukan sertifikat yang sesuai, unduh dan (jika server berada di bawah kendali Anda) tambahkan ke bundel sertifikat. Atau, Anda dapat mengimpor sertifikat yang hilang secara lokal. Mengakomodasi masalah ini di server adalah solusi yang lebih umum untuk masalah tersebut.
sumber
Untuk Windows saja, ikuti langkah-langkah ini:
sumber
Bagi mereka yang menyukai Debian dan Java yang dipaket:
Jangan lupa untuk memeriksa
/etc/default/cacerts
:Untuk menghapus cert:
sumber
Ini juga dapat disebabkan oleh penggunaan sertifikat GoDaddy dengan Java 7 yang ditandatangani menggunakan SHA2.
Chrome dan semua browser lain mulai mencabut sertifikat SSL yang ditandatangani menggunakan SHA1, karena tidak aman.
Info lebih lanjut tentang masalah ini dapat ditemukan di sini , serta cara mengatasinya di server Anda jika perlu sekarang.
sumber
Saya memiliki masalah yang sama dengan kesalahan sertifikat dan karena SNI, dan klien http yang saya gunakan tidak menerapkan SNI. Jadi pembaruan versi melakukan pekerjaan
sumber
UPDATE: Bahwa reboot membantu adalah kebetulan (saya harap begitu, hore!). Penyebab sebenarnya dari masalahnya adalah ini: Ketika Gradle diarahkan untuk menggunakan keystore tertentu, keystore itu juga harus berisi semua sertifikat root resmi. Kalau tidak, ia tidak dapat mengakses perpustakaan dari repositori reguler. Yang harus saya lakukan adalah ini:
Impor sertifikat yang ditandatangani sendiri:
Tambahkan sertifikat root resmi:
Mungkin daemon Gradle juga menghalangi. Mungkin layak untuk membunuh semua daemon berjalan yang ditemukan
./gradlew --status
jika segala sesuatu mulai tampak suram.POSTING ASLI:
Tidak ada yang akan percaya ini, saya tahu. Namun, jika semuanya gagal, cobalah: Setelah reboot Mac saya, masalahnya hilang. Grrr.
Latar belakang: ./gradlew jar terus memberi saya "tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta"
Saya terjebak dengan sertifikat yang ditandatangani sendiri, disimpan dari browser, diimpor di privateKeystore.jks. Kemudian menginstruksikan Gradle untuk bekerja dengan privateKeystore.jks:
Seperti yang disebutkan, ini hanya berfungsi setelah reboot.
sumber
AVG versi 18.1.3044 (dengan Windows 10) mengganggu aplikasi Spring lokal saya.
Solusi: masuk ke bagian AVG yang disebut "Web dan email" dan nonaktifkan "perlindungan email". AVG memblokir sertifikat jika situs tidak aman.
sumber
Pastikan bahwa https://176.66.3.69:6443/ memiliki sertifikat yang valid. Anda dapat memeriksanya melalui browser terlebih dahulu jika berfungsi di browser itu akan berfungsi di java.
itu bekerja untuk saya
sumber
Ada banyak cara untuk menyelesaikan ini ...
Salah satu caranya adalah mengatur sertifikat TrustStore dalam file keystore dan meletakkannya di jalur aplikasi, dan mengatur properti sistem ini dalam metode utama:
Cara lain adalah menempatkan keystore sebagai file sumber daya di dalam file jar proyek dan memuatnya:
Di windows Anda dapat mencoba solusi ini juga: https://stackoverflow.com/a/59056537/980442
Saya membuat file keystore dari
.crt
file CA otoritas sertifikat dengan cara ini:FYI: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
sumber
Anda memiliki dua opsi, impor sertifikat yang ditandatangani sendiri ke keystore java untuk setiap jvm yang akan dijalankan oleh perangkat lunak atau coba pabrik ssl yang tidak memvalidasi:
sumber
Punya masalah seperti gambar ini.
Mencoba beberapa solusi. Tetapi menemukan bahwa bahkan jika itu proyek yang sama, ketika itu di tempat kerja orang lain, itu benar-benar baik-baik saja. Tidak diperlukan pengaturan tambahan. Jadi kami kira ini masalah lingkungan. Kami mencoba mengubah versi JDK, IDE tetapi tidak berhasil. butuh sekitar 4 jam untuk penyelidikan, sampai kami mencoba jawaban teratas. Saya tidak menemukan kesalahan yang disebutkan dalam jawaban itu tetapi saya menemukan melalui browser saya tentang HTTP URL (kunci) bahwa ada sertifikasi Charles. Kemudian saya menyadari bahwa charles saya selalu ada. Selama saya mematikannya, itu berfungsi dengan baik.
Jadi saya meninggalkan pengalaman saya yang bisa membantu untuk kasus Anda.
sumber
Dalam kasus saya, saya menjalankan MacOs High Sierra dengan Java 1.6. File cacert berada di lokasi yang berbeda dari yang disebutkan di atas dalam jawaban Gabe Martin-Dempesy. File cacert juga sudah ditautkan ke lokasi lain (/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts).
Menggunakan FireFox, saya mengekspor sertifikat dari situs web yang dimaksud ke file lokal yang disebut "dieksporCertFile.crt". Dari sana, saya menggunakan keytool untuk memindahkan sertifikat ke file cacert. Ini memperbaiki masalah.
sumber
pertama-tama Unduh sertifikat ssl kemudian Anda dapat pergi ke jalur bin java Anda, jalankan perintah di bawah ini di konsol.
sumber
Dalam kasus saya, saya memiliki keystore dan truststore memiliki sertifikat yang sama sehingga menghapus truststore membantu. Terkadang rantai sertifikat dapat menjadi masalah jika Anda memiliki beberapa salinan sertifikat.
sumber