Menyelesaikan javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Gagal membangun jalur PKIX?

426

Sunting: - Mencoba memformat pertanyaan dan menerima jawaban dengan cara yang lebih rapi di Blog saya

Ini masalah aslinya.

Saya mendapatkan kesalahan ini:

Pesan rinci sun.security.validator.ValidatorException: PKIX bangunan path gagal:
kesalahan sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid untuk target yang diminta

sebab javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: gagal membangun jalur PKIX: sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid untuk target yang diminta

Saya menggunakan Tomcat 6 sebagai server web. Saya memiliki dua aplikasi web HTTPS diinstal pada Tomcats berbeda pada port yang berbeda tetapi pada mesin yang sama. Katakan App1(port 8443)dan App2(port 443). App1terhubung ke App2. Ketika App1terhubung ke App2saya mendapatkan kesalahan di atas. Saya tahu ini adalah kesalahan yang sangat umum sehingga menemukan banyak solusi di berbagai forum dan situs. Saya memiliki entri di bawah ini server.xmldari kedua Tomcats:

keystoreFile="c:/.keystore" 
keystorePass="changeit"

Setiap situs mengatakan alasan yang sama bahwa sertifikat yang diberikan oleh app2 tidak ada di toko tepercaya app1 jvm. Ini tampaknya benar juga ketika saya mencoba untuk menekan URL yang sama di browser IE, itu berfungsi (dengan pemanasan, Ada masalah dengan sertifikat keamanan situs web ini. Di sini saya katakan lanjutkan ke situs web ini). Tetapi ketika URL yang sama terkena oleh klien Java (dalam kasus saya) saya mendapatkan kesalahan di atas. Jadi untuk meletakkannya di truststore saya mencoba tiga opsi ini:

Pilihan 1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Pengaturan Opsi2 di bawah ini dalam variabel lingkungan

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Pengaturan Opsi3 di bawah ini dalam variabel lingkungan

JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Tapi tidak ada yang berhasil .

Apa yang akhirnya berhasil adalah mengeksekusi pendekatan Java yang disarankan dalam Bagaimana menangani sertifikat SSL yang tidak valid dengan Apache HttpClient? oleh Pascal Thivent yaitu menjalankan program InstallCert.

Tetapi pendekatan ini baik untuk pengaturan devbox tapi saya tidak bisa menggunakannya di lingkungan produksi.

Saya bertanya-tanya mengapa tiga pendekatan yang disebutkan di atas tidak bekerja ketika saya sebutkan nilai yang sama di server.xmldari app2server dan sama nilai-nilai dalam truststore oleh pengaturan

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

dalam app1program.

Untuk informasi lebih lanjut, inilah cara saya membuat koneksi:

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

  HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();

  conn1.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  });

  reply.load(conn1.getInputStream());
M Sach
sumber
kemungkinan duplikat HttpClient dan SSL
Marquis of Lorne
Anehnya saya mendapatkan kesalahan ini ketika berkomunikasi antara server cluster yang tidak memiliki masalah SSL secara individual. Setelah saya mengatur dengan benar domainnamedi server RHEL saya masalahnya hilang. Semoga ini bisa membantu seseorang.
DavidG
Satu hal lagi yang perlu diperiksa adalah Anda memiliki versi Java terbaru - saya mendapatkan kesalahan serupa karena ini.
Redzarf
stackoverflow.com/questions/2893819/… - juga relevan dan jawaban yang fantastis.
Siddhartha

Jawaban:

406

Anda perlu menambahkan sertifikat untuk App2 ke file truststore dari JVM bekas yang terletak di %JAVA_HOME%\lib\security\cacerts.

Pertama, Anda dapat memeriksa apakah sertifikat Anda sudah ada di truststore dengan menjalankan perintah berikut: keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(Anda tidak perlu memberikan kata sandi)

Jika sertifikat Anda hilang, Anda bisa mendapatkannya dengan mengunduhnya dengan browser Anda dan menambahkannya ke truststore dengan perintah berikut:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>

Setelah impor, Anda dapat menjalankan perintah pertama lagi untuk memeriksa apakah sertifikat Anda ditambahkan.

Informasi Sun / Oracle dapat ditemukan di sini .

SimonSez
sumber
6
Anda harus menggunakan path lengkap, misalnya c: \ java \ jdk \ lib \ security \ cacerts
SimonSez
48
Seperti kata SimonSez, Anda tidak memerlukan kata sandi, tetapi jika Anda menginginkannya, kata sandi standarnya adalah "ubah".
Felix
16
Juga, di Windows Anda harus menjalankan terminal sebagai administrator, jika tidak, Anda mendapatkan kesalahan keytool error: java.io.FileNotFoundException ... (Access is denied)saat Anda mencoba mengimpor sertifikat Anda.
Felix
2
Ah @SimonSez Anda adalah tuhan saya. Tetapi untuk menambahkannya, seseorang harus menentukan lokasi penyimpanan kepercayaan dan kata sandi seperti yang disebutkan oleh @M Sach untuk membuatnya berfungsi.
BudsNanKis
2
Terus mengalami masalah dengan Java 1.8. Perlu menambahkan sertifikat seperti yang dijelaskan dan menggunakan Java <1.8
Tom Howard
180

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Gagal membangun jalur PKIX: sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid untuk target yang diminta

• Ketika saya mendapatkan kesalahan, saya mencoba untuk Google keluar arti dari ekspresi dan saya menemukan, masalah ini terjadi ketika server mengubah sertifikat SSL HTTPS mereka, dan versi java kami yang lebih lama tidak mengenali otoritas sertifikat akar (CA) .

• Jika Anda dapat mengakses URL HTTPS di browser Anda, maka dimungkinkan untuk memperbarui Java untuk mengenali root CA.

• Di browser Anda, buka URL HTTPS yang tidak dapat diakses Java. Klik pada rantai sertifikat HTTPS (ada ikon kunci di Internet Explorer), klik kunci untuk melihat sertifikat.

• Pergi ke "Detail" dari sertifikat dan "Salin ke file". Salin dalam format Base64 (.cer) . Ini akan disimpan di Desktop Anda.

• Instal sertifikat dengan mengabaikan semua peringatan.

• Inilah cara saya mengumpulkan informasi sertifikat URL yang saya coba akses.

Sekarang saya harus membuat versi java saya untuk mengetahui tentang sertifikat sehingga lebih jauh tidak menolak untuk mengenali URL. Dalam hal ini saya harus menyebutkan bahwa saya googled out bahwa informasi sertifikat root tetap secara default di lokasi keamanan \ jre \ lib \ JDK , dan kata sandi default untuk mengakses adalah: changeit.

Untuk melihat informasi cacerts, berikut adalah prosedur yang harus diikuti:

• Klik pada Tombol Mulai -> Jalankan

• Ketikkan cmd. Command prompt terbuka (Anda mungkin perlu membukanya sebagai administrator).

• Pergi ke Java/jreX/bindirektori Anda

• Ketikkan yang berikut ini

keytool -list -keystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

Ini memberikan daftar sertifikat saat ini yang terkandung dalam keystore. Itu terlihat seperti ini:

C: \ Documents and Settings \ NeelanjanaG> keytool -list -keystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

Masukkan kata sandi keystore: changeit

Jenis keystore: jks

Penyedia keystore: SUN

Keystore Anda berisi 44 entri

verisignclass3g2ca, 26 Mar 2004, tepercayaCertEntry,

Sidik jari sertifikat (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, 9 Jan 2003, dipercayaCertEntry,

Sidik jari sertifikat (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

thawtepersonalbasicca, 13 Feb 1999, tepercayaCertEntry,

Sidik jari sertifikat (MD5): E6: 0B: D2: C9: CA: 2D: 88: DB: 1A: 71: 0E: 4B: 78: EB: 02: 41

addtrustclass1ca, 1 Mei 2006, tepercayaCertEntry,

Sidik jari sertifikat (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

verisignclass2g3ca, 26 Mar 2004, tepercayaCertEntry,

Sidik jari sertifikat (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1D: 1A: 4A: 2B: F6

• Sekarang saya harus memasukkan sertifikat yang sebelumnya diinstal ke dalam cacerts.

• Untuk ini, berikut adalah prosedurnya:

keytool –import –noprompt –trustcacerts –alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

Jika Anda menggunakan Java 7:

keytool –importcert –trustcacerts –alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

• Ini kemudian akan menambahkan informasi sertifikat ke dalam file cacert.

Ini adalah solusi yang saya temukan untuk Pengecualian yang disebutkan di atas !!

NDeveloper
sumber
5
Apa yang Anda lakukan saat sertifikat kedaluwarsa? Ulangi semuanya (tahunan)?
ggkmath
7
Apakah ada cara untuk melakukan ini secara terprogram?
Sutra Meshulam
1
Bagi orang-orang yang berurusan dengan kesalahan PKIX, "Path tidak terhubung dengan salah satu jangkar kepercayaan", sayangnya solusi ini tidak memecahkan masalah itu untuk saya.
IcedDante
3
Satu Pertanyaan - Apakah aliasName adalah alamat web tempat kami mengimpor sertifikat? Misalnya, jika URL adalah domain.site.com/pages/service.asmx maka alias harus domain.site.com atau URL lengkap (domain.site.com/pages/service.asmx) atau harus diawali dengan http : // atau itu hanya nama yang sewenang-wenang?
nanosoft
1
path: \ lib \ security> keytool -import -noprompt -trustcacerts -alias webCert -file webCertResource.cer -keystore c: / Users / Jackie / Desktop -stepass changeit saya mendapatkan "sistem tidak dapat menemukan file yang ditentukan"
Jesse
46

Cara kerja-nya di Tomcat 7

Saya ingin mendukung sertifikat yang ditandatangani sendiri di Aplikasi Tomcat tetapi cuplikan berikut gagal berfungsi

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

Inilah yang memecahkan masalah saya:

1) Unduh .crtfile

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • ganti <your domain>dengan domain Anda (mis. jossef.com)

2) Terapkan .crtfile di cacertstoko sertifikat Java

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • ganti <your domain>dengan domain Anda (mis. jossef.com)
  • ganti <JAVA HOME>dengan direktori home java Anda

3) Retas

Meskipun saya telah menginstal sertifikat saya di Javatoko sertifikat default, Tomcat mengabaikan hal itu (sepertinya tidak dikonfigurasi untuk menggunakan toko sertifikat default Java).

Untuk meretas ini, tambahkan berikut ini di suatu tempat dalam kode Anda:

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...
Jossef Harush
sumber
4
Langkah 2 melakukan trik untuk saya menggunakan SpringBoot dan Tomcat 7. Terima kasih.
Tim Perry
Apakah saya harus menggunakan keytool dari java yang digunakan oleh tomcat? Karena pada satu server saya dapat memiliki banyak java
vikifor
@vikatau ya. Anda juga dapat menjalankannya untuk semua direktori java yang terinstal di sistem Anda
Jossef Harush
1
Ini berhasil! terima kasih banyak @JossefHarush untuk jawaban yang sangat berguna!
Tom Taylor
1
masalah saya terpecahkan setelah menambahkan segmen kode @Jossef Harush ke dalam kode saya.
Chamod Pathirana
10

Dalam kasus saya masalahnya adalah server web hanya mengirim sertifikat dan CA perantara, bukan root CA. Menambahkan opsi JVM ini menyelesaikan masalah:-Dcom.sun.security.enableAIAcaIssuers=true

Dukungan untuk metode akses caIssuers dari ekstensi Akses Informasi Otoritas tersedia. Ini dinonaktifkan secara default untuk kompatibilitas dan dapat diaktifkan dengan mengatur properti sistem com.sun.security.enableAIAcaIssuerske nilai true.

Jika disetel ke true, implementasi PKIX Sun dari CertPathBuilder menggunakan informasi dalam ekstensi AIA sertifikat (selain CertStores yang ditentukan) untuk menemukan sertifikat CA yang mengeluarkan, asalkan itu adalah URI dengan jenis ldap, http, atau ftp.

Sumber

Guillaume
sumber
Ini benar-benar menyelesaikan masalah saya, terima kasih!
Luís Silva
6

Alasan lain bisa jadi versi JDK yang sudah ketinggalan zaman. Saya menggunakan jdk versi 1.8.0_60, hanya memperbarui ke versi terbaru memecahkan masalah sertifikat.

Ali Ismayilov
sumber
2
Saya punya masalah yang sama juga. Memanggil API dengan Sertifikat Enkripsi Lets mungkin tidak berfungsi dengan versi Java yang lebih lama karena tidak dikenali oleh otoritas sertifikasi root tepercaya. Memperbarui Java akan mengatasi masalah ini.
hertg
5

File cacerts saya benar-benar kosong. Saya memecahkan ini dengan menyalin file cacerts dari mesin windows saya (yang menggunakan Oracle Java 7) dan scp'd ke kotak Linux saya (OpenJDK).

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

dan kemudian pada mesin linux

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

Sejauh ini itu bekerja dengan baik.

Ryan Shillington
sumber
1
Ini berfungsi dengan baik jika masalahnya adalah Anda menggunakan versi java yang lebih lama yang tidak memiliki sertifikat terbaru.
atripathi
@atripathi bagaimana dengan Mac?
iOSAndroidWindowsMobileAppsDev
Terjadi kesalahan serius pada pemasangan Java Anda jika file cacerts kosong. Anda harus menginstal ulang semuanya.
Marquis of Lorne
Mungkin, tetapi solusi ini berhasil dan tidak ada yang salah setelah itu.
Ryan Shillington
5

Bagi saya, kesalahan ini juga muncul saat mencoba menyambung ke proses di belakang proxy terbalik NGINX yang menangani SSL.

Ternyata masalahnya adalah sertifikat tanpa seluruh rantai sertifikat digabungkan. Ketika saya menambahkan sertifikat menengah, masalahnya terpecahkan.

Semoga ini membantu.

YaDa
sumber
Thats seperti apa yang saya miliki. dapatkah Anda menjelaskan tentang cara menambahkan sertifikat perantara dan di mana. Saya menggunakan httpd membalikkan proxy dan bukan NGINX.
Asaf Magen
ini membantu saya dalam kasus saya karena saya menggunakan httpd: access.redhat.com/solutions/43575
Asaf Magen
Dengan nginx, Ini hanya menggunakan file .key dan .pem untuk konfigurasi SSL. Pertama, Anda mengonversi .crt ke .pem (cukup: cp yourfile.crt yourfile.pem) dan kemudian untuk rantai sertifikat SSL: Anda menambahkan file .cer ke yang terakhir .pem (cat yourfile.cer >> yourfile.pem)
Thế Anh Nguyễn
5

Menggunakan Tomcat 7 di Linux, ini berhasil.

String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Di Linux, $JAVA_HOMEtidak selalu pengaturan, tetapi biasanya /etc/alternatives/jremenunjuk ke$JAVA_HOME/jre

Cedric Simon
sumber
5

Kode di bawah ini berfungsi untuk saya:

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}

HttpsURLConnection conn = null;
            URL url = new URL(serviceUrl);
            conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  

             conn.setSSLSocketFactory(sc.getSocketFactory());
Sandip S.
sumber
5
Kode ini benar-benar tidak aman dan tidak boleh digunakan.
Marquis of Lorne
@ user207421 Mengapa tidak aman? Apa yang terjadi dalam kode secara singkat.
Govinda Sakhare
Ini melewatkan semua validasi sertifikat, pada dasarnya memungkinkan semua sertifikat diterima. Cara sertifikasi bekerja adalah bahwa ada sertifikat root (secara harfiah) dilindungi secara fisik, di berbagai otoritas sertifikasi. Sertifikat ini kemudian digunakan untuk mengeluarkan sertifikat sekunder lainnya, yang dapat divalidasi sepanjang jalan kembali ke otoritas sertifikasi akar. Ini melewatkan semua pemeriksaan hulu, artinya saya dapat mengirimkan ssl cert (bahkan yang dihasilkan sendiri) dan aplikasi Anda akan menerimanya sebagai aman, meskipun identitas saya sebagai url tidak diverifikasi.
Scott Taylor
4

Saya menggunakan jdk1.8.0_171ketika saya menghadapi masalah yang sama. Saya mencoba 2 solusi teratas di sini (menambahkan sertifikat menggunakan keytool dan solusi lain yang memiliki peretasan di dalamnya) tetapi mereka tidak bekerja untuk saya.

Saya meningkatkan JDK saya ke 1.8.0_181dan itu bekerja seperti pesona.

rata-rata
sumber
2

saya menulis skrip win32 (WinXP 32bit kecil) bodoh cmd (commandline) script yang mencari semua versi java dalam file program dan menambahkan cert kepada mereka. Kata sandi harus berupa "changeit" default atau ubah sendiri dalam skrip :-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause
mons droid
sumber
2

Untuk MacOS X di bawah ini adalah perintah yang tepat untuk saya di mana saya harus mencoba dengan tanda hubung ganda dalam opsi 'importcert' yang berfungsi:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit
Abhishek
sumber
2

Bagi saya tidak bekerja solusi yang diakui dari pos ini: https://stackoverflow.com/a/9619478/4507034 .

Sebaliknya, saya berhasil menyelesaikan masalah dengan mengimpor sertifikasi ke sertifikasi tepercaya mesin saya.

Langkah:

  1. Buka URL (mis. https://localhost:8443/yourpath) Tempat sertifikasi tidak berfungsi.
  2. Ekspor sertifikasi seperti yang dijelaskan dalam pos yang disebutkan.
  3. Di mesin windows Anda terbuka: Manage computer certificates
  4. Pergi ke Trusted Root Certification Authorities->Certificates
  5. Impor your_certification_name.cerfile Anda di sini .
Radu Linu
sumber
1

Untuk Tomcat yang berjalan di server Ubuntu, untuk mengetahui Java mana yang digunakan, gunakan perintah "ps -ef | grep tomcat":

Sampel:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

Kemudian, kita bisa masuk ke: cd /usr/local/java/jdk1.7.0_15/jre/lib/security

File cacerts default ada di sini. Masukkan sertifikat yang tidak dipercaya ke dalamnya.

oraclesoon
sumber
1

untuk keselamatan kita tidak boleh menggunakan sertifikat yang ditandatangani sendiri dalam implementasi kita. Namun, ketika datang ke pengembangan sering kita harus menggunakan lingkungan percobaan yang mendapat sertifikat yang ditandatangani sendiri. Saya mencoba untuk memperbaiki masalah ini secara terprogram dalam kode saya dan saya gagal. Namun, dengan menambahkan sertifikat ke toko kepercayaan jre memperbaiki masalah saya. Silakan temukan langkah-langkah di bawah ini,

  1. Unduh sertifikat situs,

  2. Salin sertifikat (mis: cert_file.cer) ke direktori $ JAVA_HOME \ Jre \ Lib \ Security

  3. Buka CMD di Administrator dan ubah direktori menjadi $ JAVA_HOME \ Jre \ Lib \ Security

  4. Impor sertifikat ke toko kepercayaan menggunakan perintah di bawah ini,

keytool -import -alias ca -file cert_file.cer -keystore cacerts -storepass changeit

Jika Anda mendapat kesalahan mengatakan keytool tidak dikenali, silakan merujuk ini.

Ketik ya seperti di bawah ini

Percayai sertifikat ini: [Ya]

  1. Sekarang coba jalankan kode Anda atau akses URL secara terprogram menggunakan java.

Memperbarui

Jika server aplikasi Anda JBoss coba tambahkan properti sistem di bawah ini

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

Semoga ini membantu!

tk_
sumber
1

SOLUSI YANG DAPAT DITAWARKAN (Alpine Linux)

Untuk dapat memperbaiki masalah ini di lingkungan aplikasi kami, kami telah menyiapkan perintah terminal Linux sebagai berikut:

cd ~

Akan menghasilkan file cert di direktori home.

apk add openssl

Menginstal perintah ini openssl di Linux alpine. Anda dapat menemukan perintah yang tepat untuk distribusi Linux lainnya.

openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

Menghasilkan file cert yang diperlukan.

sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt

Menerapkan file yang dihasilkan ke JRE dengan program 'keytool'.

Catatan: Silakan ganti DNS Anda dengan<host-dns-ssl-belongs>

Note2: Harap dicatat dengan lembut bahwa -noprompttidak akan meminta pesan verifikasi (ya / tidak) dan -storepass changeitparameter akan menonaktifkan prompt kata sandi dan memberikan kata sandi yang diperlukan (standarnya adalah 'ubah'). Dua properti ini akan memungkinkan Anda menggunakan skrip-skrip itu di lingkungan aplikasi Anda seperti membangun gambar Docker.

Note3 Jika Anda menggunakan aplikasi Anda melalui Docker, Anda dapat membuat file rahasia satu kali dan memasukkannya ke file proyek aplikasi Anda. Anda tidak perlu membuatnya lagi dan lagi.

Bahadir Tasdemir
sumber
0

Saya punya masalah ini juga.

Saya mencoba hampir semuanya dengan menambahkan sertifikat SSL ke .keystore, tetapi, itu tidak berfungsi dengan Java1_6_x. Bagi saya itu membantu jika kita mulai menggunakan versi Java yang lebih baru, Java1_8_x sebagai JVM.

Nubian
sumber
1
Sama untuk ku. Pembaruan dari Java 1.8.0_91 ke 1.8.0_121 memecahkan masalah. Saya mendapat pengecualian dengan menggunakan Apache HTTPClient.
Devabc
Saya masih memiliki masalah ini menggunakan otentikasi Oauth2
Sofiane
0

Saya mengalami masalah dengan Android Studio ini ketika saya berada di belakang proxy. Saya menggunakan Crashlytics yang mencoba mengunggah file pemetaan saat membangun.

Saya menambahkan sertifikat proxy yang hilang ke truststore yang berlokasi di /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

dengan perintah berikut: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

misalnya dengan kata sandi truststore default keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt

Wirling
sumber
0

Hanya hack kecil. Perbarui URL dalam file "hudson.model.UpdateCenter.xml" dari https ke http

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>
Harshavardhan
sumber
0

Saya ingin berpadu karena saya memiliki lingkungan QEMU di mana saya harus mengunduh file dalam java. Ternyata /etc/ssl/certs/java/cacertsdi QEMU memang ada masalah karena tidak cocok dengan /etc/ssl/certs/java/cacertsdi lingkungan host. Lingkungan host ada di belakang proksi perusahaan sehingga java cacerts adalah versi yang disesuaikan.

Jika Anda menggunakan lingkungan QEMU, pastikan sistem host dapat mengakses file terlebih dahulu. Misalnya Anda dapat mencoba skrip ini di mesin host Anda terlebih dahulu untuk melihatnya. Jika skrip berjalan dengan baik di mesin host tetapi tidak di QEMU, maka Anda mengalami masalah yang sama seperti saya.

Untuk mengatasi masalah ini, saya harus membuat cadangan file asli di QEMU, menyalin file di lingkungan host ke penjara chroot QEMU, dan kemudian java dapat mengunduh file secara normal di QEMU.

Solusi yang lebih baik akan dipasang /etcke lingkungan QEMU; namun saya tidak yakin apakah file lain akan terkena dampak dalam proses ini. Jadi saya memutuskan untuk menggunakan solusi yang jelek tapi mudah ini.

Batu
sumber
0

Ini sepertinya tempat yang bagus untuk mendokumentasikan alasan lain yang mungkin untuk pesan kesalahan PKIX yang terkenal itu. Setelah menghabiskan terlalu lama melihat isi keystore dan truststore dan berbagai konfigurasi instalasi java saya menyadari bahwa masalah saya adalah ke ... kesalahan ketik.

Kesalahan pengetikan berarti saya juga menggunakan keystore sebagai truststore. Karena perusahaan saya Root CA tidak didefinisikan sebagai sertifikat mandiri di keystore tetapi hanya sebagai bagian dari rantai sertifikat, dan tidak didefinisikan di tempat lain (yaitu cacerts), saya terus mendapatkan kesalahan PKIX.

Setelah rilis yang gagal (ini adalah konfigurasi conf, itu ok di tempat lain) dan dua hari menggaruk kepala akhirnya saya melihat kesalahan ketik, dan sekarang semua baik-baik saja.

Semoga ini bisa membantu seseorang.

Dave Richardson
sumber
-1

tambahkan ini ke kode Anda:

TrustManager[] trustAllCerts = new TrustManager[]{
           new X509TrustManager() {
               @Override
               public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                   return new X509Certificate[0];
               }

               @Override
               public void checkClientTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }

               @Override
               public void checkServerTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }
           }
       };

       try {
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, new java.security.SecureRandom());
           HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
       } catch (GeneralSecurityException e) {
       }

sumber
1
Jawaban khusus kode hanya disukai pada situs ini. Bisakah Anda mengedit jawaban Anda untuk memasukkan beberapa komentar atau penjelasan kode Anda? Penjelasan harus menjawab pertanyaan seperti: Apa fungsinya? Bagaimana cara melakukannya? Kemana perginya? Bagaimana cara mengatasi masalah OP?
mypetlion
1
tambahkan ini ke kode Anda No. Jangan menambahkan ini ke kode Anda . Membuat konteks SSLC dengan cara ini menghapus semua pemeriksaan keamanan yang memverifikasi identitas server yang Anda hubungkan. Jawaban untuk masalah kehilangan kunci Anda BUKAN untuk menghapus semua kunci dari semua milik Anda.
Andrew Henle