“Pembuatan jalur PKIX gagal” dan “tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta”


423

Saya mencoba mendapatkan tweet menggunakan perpustakaan twitter4j untuk proyek java saya. Pada jalankan pertama saya, saya mendapat kesalahan tentang sertifikat sun.security.validator.ValidatorExceptiondan sun.security.provider.certpath.SunCertPathBuilderException. Kemudian saya menambahkan sertifikat twitter dengan:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

Tetapi tanpa hasil. Berikut adalah prosedur untuk mendapatkan tweet:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("Total amount of tweets: " + result.getTweets().size());
        List<Status> tweets = result.getTweets();

        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to search tweets: " + te.getMessage());
    }

Dan inilah kesalahannya:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=d35baff5 or
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: 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 sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
    ... 5 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 sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 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)
    ... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

6
Halo Silakan periksa di bawah URL. Saya yakin ini akan membantu Anda. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Anda harus menambahkan sertifikat ssl ke sertifikat java truststore (Path: jre / lib / security / cacerts).
sus007

Silakan merujuk jawaban ini untuk solusi dan pastikan Anda mengemas perangkat lunak Anda sebagai bundre jre? jika ya maka salin sistem formulir file cacerts Anda dan ganti file cacerts jre yang sudah dikemas.
positivecrux

coba ini stackoverflow.com/a/9210661/4741746 mungkin ini jawaban Anda
sushant gosavi

2
Saya hanya menggunakan kode java ini dan untuk https jangan lupa untuk menentukan port sebagai 443. Kode Java di github.com/escline/InstallCert/blob/master/InstallCert.java Ini akan mengambil file CACERTS Anda dan akan menambahkan semua yang ditambah sertifikat saat ini untuk URL yang Anda berikan sebagai input. Dalam kasus saya, saya hardcoded nilai untuk menjadi tuan rumah = "mywebservice.uat.xyz.com"; port = 443; passphrase = "changeit" .toCharArray (); Kemudian program membuat file baru yang disebut "jssecacerts" yang akan memiliki segalanya. Ganti nama ini menjadi "cacerts" dan gunakan ini. Anda akan siap.
Reddymails

Jawaban:


574
  1. Buka URL di browser Anda:
    • firefox - klik pada rantai sertifikat HTTPS (ikon kunci tepat di sebelah alamat URL). Klik "more info" > "security" > "show certificate" > "details" > "export..". Ambil nama dan pilih tipe file example.cer
    • chrome - klik ikon situs di sebelah kiri untuk alamat di bilah alamat, pilih "Sertifikat" -> "Perincian" -> "Ekspor" dan simpan dalam format "Biner yang disandikan, sertifikat tunggal".
  2. Sekarang Anda memiliki file dengan keystore dan Anda harus menambahkannya ke JVM Anda. Tentukan lokasi file cacerts, mis. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Selanjutnya impor example.cerfile ke dalam cacerts di baris perintah:

keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

Anda akan dimintai kata sandi yang standarnya changeit

Mulai ulang JVM / PC Anda.

sumber: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html


27
Saya harus memberi tanda kutip pada path dan menyimpannya sebagai Base64 alih-alih DER
Theodore K.

3
wow..itu bekerja seperti sulap dengan cara di chrome Anda cukup klik ikon kunci pada bilah alamat kiri, dan kemudian klik detail ditambah tidak ada restart diperlukan
aswzen

8
Perhatikan bahwa instruksi harus diulang untuk semua sertifikat dalam rantai. aliasNama sertifikat di baris perintah juga harus unik.
Lu55

5
Jika rumah Anda adalah JDK, pastikan untuk menentukan bahwa jre berada di dalamnya: keytool -import -ali contoh -keystore "C: \ Program Files \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble

12
Bagi siapa pun yang mendapatkan kesalahan "akses ditolak", pastikan Anda menjalankan command prompt sebagai administrator.
Walker Christie

81

Setelah berjam-jam mencoba untuk membangun file cert untuk mendapatkan instalasi Java 6 saya bekerja dengan cert twitter baru, saya akhirnya menemukan solusi yang sangat sederhana terkubur dalam komentar di salah satu papan pesan. Cukup salin file cacerts dari instalasi Java 7 dan timpa yang ada di instalasi Java 6 Anda. Mungkin yang terbaik untuk membuat cadangan file cacerts terlebih dahulu, tetapi kemudian Anda tinggal menyalin yang baru ke dalam dan BOOM! itu hanya berfungsi.

Perhatikan bahwa saya benar-benar menyalin file Windows cacerts ke instalasi Linux dan itu berfungsi dengan baik.

File ini terletak di jre/lib/security/cacertskedua instalasi Java jdk lama dan baru.

Semoga ini bisa menyelamatkan seseorang dari kejengkelan.


4
Saya mencoba mengakses server ssl dengan sertifikat yang ditandatangani sendiri, mencoba menambahkan sertifikat itu menggunakan keytool, tetapi tidak berhasil, ada saran?
Oleg Belousov

1
Senang itu berhasil .. Tapi tahukah Anda apa penyebab utamanya? apa yang membuatnya gagal dengan java 6 certs .. dan bagaimana java 7 certs memperbaiki masalah
Vishwanath gowda k

Ini berhasil, meskipun saya beralih dari icedtea 1.6 ke oracle 1.7. :)
nperson325681

Juga pertimbangkan solusi ini: stackoverflow.com/questions/33439905/…
Piohen

10
Bagi mereka yang menyukai saya kadang-kadang ketinggalan hal yang jelas - pastikan Anda masuk $JAVA_HOME/jre/lib, tidak $JAVA_HOME/lib- saya menghabiskan sedikit waktu melewatkan detail itu.
Ryan Heathcote

35

Pendekatan UI SAYA:

  1. Unduh keystore explorer dari sini
  2. Buka $ JAVA_HOME / jre / lib / security / cacerts
  3. masukkan PW: changeit (Dapat changeme di Mac)
  4. Impor file .crt Anda

CMD-Line:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. masukkan PW: changeit(Bisa berupa changeme di Mac)

1
Di mac, dengan CMD-Line, harus menggunakan sudo untuk menjalankan perintah. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / keamanan / cacerts
malajisi

1
Pada Windows, perintah yang berfungsi:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla

dari mana mendapatkan file cert? Saya tidak tahu URL mana yang harus saya kunjungi. jetty.com ?
kraftydevil

Saya mendapatkan sertifikat saya dengan mengekspornya dari browser web, tindakan konteks pada gembok
rtbf

28

Saya telah menemukan masalah ini yang membutuhkan waktu berjam-jam penelitian untuk diperbaiki, khususnya dengan sertifikat yang dibuat secara otomatis, yang tidak seperti yang resmi, cukup rumit dan Java tidak begitu menyukainya.

Silakan periksa tautan berikut: Selesaikan Masalah dengan sertifikat di Jawa

Pada dasarnya Anda harus menambahkan sertifikat dari server ke sertifikat Java Home.

  1. Hasilkan atau Dapatkan sertifikat Anda dan konfigurasikan Tomcat untuk menggunakannya di Servers.xml
  2. Unduh kode sumber Java kelas InstallCertdan jalankan saat server berjalan, berikan argumen berikut server[:port]. Tidak diperlukan kata sandi, karena kata sandi asli berfungsi untuk sertifikat Java ("changeit").
  3. Program akan terhubung ke server dan Java akan mengeluarkan pengecualian, itu akan menganalisis sertifikat yang disediakan oleh server dan memungkinkan Anda untuk membuat jssecertsfile di dalam direktori tempat Anda mengeksekusi Program (Jika dijalankan dari Eclipse maka pastikan Anda mengkonfigurasi Pekerjaan direktori di Run -> Configurations).
  4. Salin file itu secara manual ke $JAVA_HOME/jre/lib/security

Setelah mengikuti langkah-langkah ini, koneksi dengan sertifikat tidak akan menghasilkan pengecualian lagi di Jawa.

Kode sumber berikut ini penting dan menghilang dari blog Oracle (Sun), satu-satunya halaman yang saya temukan ada di tautan yang disediakan, oleh karena itu saya lampirkan dalam jawaban untuk referensi apa pun.

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Originally from:
 * http://blogs.sun.com/andreas/resource/InstallCert.java
 * Use:
 * java InstallCert hostname
 * Example:
 *% java InstallCert ecc.fedora.redhat.com
 */

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Class used to add the server's certificate to the KeyStore
 * with your trusted certificates.
 */
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert [:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                    + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
                ("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

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

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}

2
Perhatikan file yang dibuat adalah jssecacerts!
DeanDP

Saya mencoba menggunakan solusi ini untuk Java 7 dan 8. Saat berjalan di Java 7, saya mendapatkan protocol_version atau handshake_failure untuk semua url repositori jarak jauh yang saya coba. SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
Sandeepan Nath

20

1. Periksa sertifikat

Cobalah untuk memuat URL target di browser dan lihat sertifikat situs (biasanya itu dapat diakses oleh ikon dengan tanda kunci. Itu ada di sisi kiri atau kanan bilah alamat browser) apakah itu kedaluwarsa atau tidak dipercaya oleh alasan lain.

2. Instal versi JRE dan JDK terbaru

Versi baru biasanya datang dengan set sertifikat tepercaya yang diperbarui.

Juga jika memungkinkan, hapus instalasi versi lama. Ini akan membuat kesalahan kesalahan konfigurasi eksplisit.

3. Periksa konfigurasi Anda:

  • Periksa ke mana variabel lingkungan JAVA_HOME Anda tunjuk.
  • Periksa versi java yang Anda gunakan untuk menjalankan program. Dalam cek IntelliJ:
    • File -> Struktur Proyek ... -> Pengaturan Proyek -> Proyek -> Proyek SDK:
    • File -> Struktur Proyek ... -> Pengaturan Platform -> SDK

4. Salin seluruh keystore dari versi Java yang baru

Jika Anda mengembangkan di bawah JDK selain yang terbaru yang tersedia - coba ganti %JAVA_HOME%/jre/lib/security/cacertsfile dengan yang baru dari JRE terinstal terbaru (buat salinan cadangan terlebih dahulu) seperti yang disarankan @ jeremy-goodell dalam jawabannya.

5. Tambahkan sertifikat ke keystore Anda

Jika tidak ada yang di atas menyelesaikan masalah Anda gunakan keytooluntuk menyimpan sertifikat ke keystore Java:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

File dengan sertifikat dapat diperoleh dari browser seperti yang disarankan @MagGGG dalam jawabannya .

Catatan 1: Anda mungkin perlu mengulang ini untuk setiap sertifikat dalam rantai ke sertifikat situs Anda. Mulai dari yang root.

Catatan 2: <alias_name>harus unik di antara kunci-kunci di toko atau keytoolakan menunjukkan kesalahan.

Untuk mendapatkan daftar semua sertifikat di toko Anda dapat menjalankan:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

Jika terjadi kesalahan, ini akan membantu Anda menghapus sertifikat dari toko:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

Dengan betapa rumitnya hal ini, itu seharusnya menjadi jawaban yang diterima.
Egor Hans

13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Ini digunakan untuk melompati validasi sertifikat.

Peringatan Hanya digunakan untuk tujuan pengembangan karena ini tidak aman!


4
Ini digunakan untuk melompati validasi sertifikat
gorums

2
@gorums Cara mengaturnya di Eclipse?
malajisi

6
JANGAN lakukan ini kecuali Anda ingin mengambil risiko menjalankan kode jahat sewenang-wenang di mesin Anda. Diturunkan karena berisiko membahayakan mesin apa pun yang menjalankannya.
Bryan

1
Hanya karena 'berfungsi' tidak berarti itu aman, Anda membahayakan semua orang yang mengikuti saran ini. Dapatkan downvote saya
Paradoxis

1
@AceKing Intinya adalah bahwa itu bukan kode tepercaya jika Anda tidak memvalidasi sertifikat. Yang mengatakan, saya pikir ini masih merupakan jawaban yang berguna. Orang yang melakukannya hanya perlu memahami risikonya.
Michael Mior

12

Saya memiliki situasi yang sedikit berbeda, ketika JDK dan JRE 1.8.0_112 hadir di sistem saya.

Saya mengimpor sertifikat CA baru ke [JDK_FOLDER]\jre\lib\security\cacertsmenggunakan perintah yang sudah dikenal:

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

Namun, saya terus mendapatkan kesalahan gagal membangun jalur PKIX yang sama .

Saya menambahkan informasi debug ke CLI java, dengan menggunakan java -Djavax.net.debug=all ... > debug.log. Dalam file debug.log, baris yang dimulai dengan trustStore adalah: sebenarnya menunjuk ke toko cacerts yang ditemukan di [JRE_FOLDER]\lib\security\cacerts.

Dalam kasus saya, solusinya adalah menyalin file cacerts yang digunakan oleh JDK (yang memiliki CA baru ditambahkan) dari yang digunakan oleh JRE dan yang memperbaiki masalah tersebut.


Saya langsung mengimpor sertifikat yang saya perlukan ke JRE / lib / security / cacerts menggunakan keytool, tetapi tidak mengubah apa pun untuk saya :( masih mendapatkan kesalahan yang sama, saya juga menambahkannya melalui IDE, atau bahkan ke classpath dan menambahkan Bean ke tentukan lokasi keystore !! Ini gila AF!
Alex

8

Latar Belakang Masalah:

Saya mendapatkan error berikut ketika saya mencoba menjalankan mvn clean install di proyek saya dan melalui Netbeans IDE clean and build option. Masalah ini disebabkan oleh sertifikat yang tidak tersedia ketika kami mengunduh melalui NET beans IDE / melalui command prompt, tetapi dapat mengunduh file melalui browser.

Kesalahan :

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  

Resolusi:

1. Unduh sertifikat Url yang dimaksud:

  • Luncurkan IE dengan "run as adminstrator" (jika tidak, kami tidak akan dapat mengunduh sertifikat)
  • Masukkan url di IE-> https: // url / local-repo (Dalam kasus saya url ini memiliki sertifikat yang tidak dipercaya masukkan deskripsi gambar di sini.)
  • Unduh sertifikat dengan mengklik pada Kesalahan sertifikat -> lihat sertifikat
  • Pilih tab Detail -> salin ke file -> selanjutnya -> pilih "DER biner yang disandikan X.509 (.CER)
  • simpan sertifikat di beberapa lokasi, contoh: c: /user/sheldon/desktop/product.cer
  • Selamat! Anda telah berhasil mengunduh sertifikat untuk situs tersebut

2. Sekarang instal penyimpanan kunci untuk memperbaiki masalah.

  • Jalankan perintah keytool untuk menambahkan keystore yang diunduh ke file sertifikat yang ada.
  • Perintah: Perintah di bawah ini di folder bin jdk (JAVA_HOME) .

C: \ Program Files \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file "C: /user/sheldon/desktop/product.cer" -alias product -keystore "C: / Program Files / Java / jdk1.8.0_141 / jre / lib / security / cacerts ".

  • Anda akan diminta memasukkan kata sandi. Masukkan kata sandi keystore: masukkan lagi "ubah" untuk "Percayai sertifikat ini? [Tidak]:", masukkan "ya"

Contoh perintah baris perintah / output:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Contgrats! sekarang Anda harus menyingkirkan kesalahan "pembangunan jalur PKIX: sun.security.provider.certpath.SunCertPathBuilderException" kesalahan dalam Netbeans IDE Anda.

Hai, saya mengikuti semua langkah tetapi tidak berhasil :(
ManishNegi

apakah Anda memiliki sertifikat lain di jalur selain cacerts? jika Anda memiliki yang lain, cobalah untuk menambahkannya ke sertifikat itu
Barani

Terima kasih @Barani r, itu adalah kesalahan saya, saya mengeksekusi perintah dari jre dan menggunakan JDK dalam gerhana saya
ManishNegi

Tidak dapat mengunduh sertifikat tetapi setelah, "jalankan sebagai administrator", berfungsi dengan baik.
Pembuat kode lain

8

Saya ingin mengimpor sertifikat untuk smtp.gmail.com

Satu-satunya solusi yang berfungsi untuk saya adalah 1. Masukkan perintah untuk melihat sertifikat ini

D: \ openssl \ bin \ openssl.exe s_client -connect smtp.gmail.com:465

  1. Salin dan simpan garis antara "----- BEGIN CERTIFICATE -----" dan "----- END CERTIFICATE -----" ke dalam file, gmail.cer

  2. Lari

    keytool -import -alias smtp.gmail.com -keystore "% JAVA_HOME% / jre / lib / security / cacerts" -file C: \ Users \ Admin \ Desktop \ gmail.cer

  3. Masukkan kata sandi chageit

  4. Klik ya untuk mengimpor sertifikat

  5. Mulai ulang java

sekarang jalankan perintah dan Anda baik untuk pergi


Terima kasih kawan! Itu menyelamatkan hari saya. Ini adalah satu-satunya solusi yang tepat dalam kasus saya.
Andrew Gans

Menyelamatkan hari saya juga. Terima kasih.
Kris

6

Ini bukan jawaban khusus Twitter, tetapi ini adalah pertanyaan yang muncul ketika Anda mencari kesalahan ini. Jika sistem Anda menerima kesalahan ini saat menyambung ke situs web yang tampaknya memiliki sertifikat yang valid ketika dilihat di browser web , itu mungkin berarti situs web itu memiliki rantai sertifikat yang tidak lengkap .

Untuk ringkasan singkat masalah: Otoritas Sertifikat tidak menggunakan Sertifikat Root mereka untuk menandatangani sembarang sertifikat lama. Sebagai gantinya, mereka (biasanya) menandatangani sertifikat perantara yang juga memiliki set bendera Otoritas Sertifikat (yaitu, diizinkan untuk menandatangani sertifikat). Kemudian ketika Anda membeli sertifikat dari CA, mereka menandatangani CSR Anda dengan salah satu dari sertifikat perantara ini.

Toko trust Java Anda kemungkinan besar hanya memiliki Root Cert, bukan yang intermediate.

Situs yang salah konfigurasi dapat mengembalikan hanya sertifikat yang telah ditandatangani. Masalah: ditandatangani dengan sertifikat perantara yang tidak ada di toko kepercayaan Anda. Browser akan menangani masalah ini dengan mengunduh atau menggunakan sertifikat perantara dalam cache; ini memaksimalkan kompatibilitas situs web. Java dan alat-alat seperti OpenSSL, bagaimanapun, tidak akan. Dan itu akan menyebabkan kesalahan dalam pertanyaan.

Anda dapat memverifikasi kecurigaan ini dengan menggunakan Uji Qualys SSL . Jika Anda menjalankannya terhadap sebuah situs dan dikatakan

Rantai sertifikat server ini tidak lengkap.

maka itu menegaskan. Anda juga dapat melihat ini dengan melihat jalur sertifikasi dan melihat teks Unduh Ekstra .

Cara memperbaikinya: administrator server perlu mengkonfigurasi server web untuk mengembalikan sertifikat perantara juga. Untuk Comodo, misalnya, ini adalah tempat .ca-bundlefile berguna. Misalnya, dalam konfigurasi Apache dengan mod_ssl, Anda akan menggunakan SSLCertificateChainFilepengaturan konfigurasi. Untuk nginx, Anda harus menggabungkan sertifikat antara dan sertifikat yang ditandatangani dan menggunakannya dalam konfigurasi sertifikat SSL. Anda dapat menemukan lebih banyak dengan mencari "rantai sertifikat tidak lengkap" online.


Kamu brilian. Terima kasih! Saya mengalami masalah dengan pembangunan baru server Java saya karena saya lupa menghapus # di depan SSLCertificateChainFile !!! Dijelaskan dengan sangat baik.
KisnardOnline

6

Alasannya, kita mendapatkan kesalahan di atas adalah bahwa JDK dibundel dengan banyak sertifikat Certificate Authority (CA) yang tepercaya ke dalam file yang disebut 'cacerts' tetapi file ini tidak memiliki petunjuk dari sertifikat yang ditandatangani sendiri. Dengan kata lain, file cacerts tidak memiliki sertifikat yang ditandatangani sendiri kami diimpor dan karenanya tidak memperlakukannya sebagai entitas tepercaya dan karenanya memberikan kesalahan di atas.

Cara memperbaiki kesalahan di atas

Untuk memperbaiki kesalahan di atas, yang kita butuhkan adalah mengimpor sertifikat yang ditandatangani sendiri ke file cacerts.

Pertama, cari file cacerts. Kita perlu mencari tahu lokasi JDK. Jika Anda menjalankan aplikasi melalui salah satu IDE seperti Eclipse atau IntelliJ Idea, buka pengaturan proyek dan cari tahu apa lokasi JDK. Untuk mis. Pada Mac OS, lokasi khas file cacerts akan berada di lokasi ini / Library / Java / JavaVirtualMachines / {{JDK_version}} / Isi / Rumah / jre / lib / keamanan pada mesin Window itu akan berada di bawah {{Installation_directory} } / {{JDK_version}} / jre / lib / security

Setelah Anda menemukan file cacerts, sekarang kami perlu mengimpor sertifikat yang ditandatangani sendiri ke file cacerts ini. Periksa artikel terakhir, jika Anda tidak tahu cara membuat sertifikat yang ditandatangani sendiri dengan benar.

Jika Anda tidak memiliki file sertifikat (.crt) dan hanya memiliki file .jks Anda dapat menghasilkan file .crt dengan menggunakan perintah di bawah ini. Jika Anda sudah memiliki file .crt / .pem maka Anda dapat mengabaikan perintah di bawah ini

## Untuk menghasilkan sertifikat dari keystore (file .jks) ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

Langkah di atas akan menghasilkan file bernama selfsigned.crt.Now Impor sertifikat ke cacerts

Sekarang tambahkan sertifikat ke JRE / lib / security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

untuk mis

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Itu saja, restart aplikasi Anda dan itu akan berfungsi dengan baik. Jika masih tidak berhasil dan dapatkan pengecualian jabat tangan SSL. Itu mungkin berarti Anda menggunakan domain yang berbeda kemudian terdaftar dalam sertifikat.

Tautan dengan penjelasan terperinci dan resolusi langkah demi langkah ada di sini.


4

Menambahkan cacertstidak berfungsi untuk saya. Setelah mengaktifkan log dengan flag -Djavax.net.debug=all, kemudian datang untuk mengetahui membaca java dari jssecacerts.

Impor untuk jssecacertsbekerja akhirnya.


2
Penjelasan yang hilang di sini adalah bahwa Java akan digunakan jssecacertsjika ada, jika tidak cacerts.
Marquis of Lorne

3

Ini adalah solusi tetapi dalam bentuk cerita saya dengan masalah ini:

Saya hampir mati mencoba semua solusi yang diberikan di atas (selama 3 hari) dan tidak ada yang berhasil untuk saya.

Saya kehilangan semua harapan.

Saya menghubungi tim keamanan saya mengenai hal ini karena saya berada di belakang proxy dan mereka mengatakan bahwa mereka baru saja memperbarui kebijakan keamanan mereka.

Saya memarahi mereka karena tidak memberi tahu Pengembang.

Kemudian mereka mengeluarkan file "cacerts" baru yang berisi semua sertifikat.

Saya menghapus file cacerts yang ada di dalam% JAVA_HOME% / jre / lib / security dan itu memecahkan masalah saya.

Jadi, jika Anda menghadapi masalah ini, mungkin dari tim jaringan Anda juga seperti ini.


2

Saya menemukan pertanyaan ini ketika mencoba untuk menginstal plugin Cucumber-Eclipse di Eclipse melalui situs pembaruan mereka. Saya menerima kesalahan SunCertPathBuilderException yang sama:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Sementara beberapa jawaban lain sesuai dan bermanfaat untuk situasi yang diberikan pertanyaan ini, mereka tetap tidak membantu dan menyesatkan untuk masalah saya.

Dalam kasus saya, masalahnya adalah bahwa URL yang disediakan untuk situs pembaruan mereka adalah:

https://cucumber.io/cucumber-eclipse/update-site

Namun ketika menavigasi ke sana melalui browser, itu diarahkan ke (perhatikan " .github " yang ditambahkan ):

http://cucumber.github.io/cucumber-eclipse/update-site/

Jadi resolusinya adalah dengan hanya menggunakan versi yang diarahkan dari URL situs pembaruan ketika menambahkan situs pembaruan di gerhana.


3
Anda yakin menjawab pertanyaan yang benar? Tidak ada menyebutkan mentimun dalam pertanyaan asli ...
Selesai Data Solutions

Saya merasakannya. Saya menerima kesalahan SunCertPathBuilderException yang sama dan saat mencari resolusi, menemukan pertanyaan ini dan juga yang ini . Namun, keduanya tidak memiliki solusi yang sesuai untuk situasi saya. Saya tidak mencoba menjawab pertanyaan spesifik tentang cara menambahkan situs plugin Cucumber-Eclipse ke gerhana. Saya ingin memberikan konteks untuk masalah yang saya hadapi (pengalihan URL) dan menjelaskan bagaimana itu diselesaikan.
royfripple

Saya telah memperbarui jawaban saya untuk menjelaskan bahwa saya menerima kesalahan yang sama, mencatat bahwa masalah mendasar dan solusinya berbeda. Saya merasa ini valid karena orang lain mungkin menemukan pertanyaan ini ketika mencari kesalahan yang sama. Harap pertimbangkan untuk mengubah suara Anda jika Anda merasa ini masuk akal.
royfripple

Terima kasih. Menjadikan segalanya lebih jelas, membalikkan downvote saya
Done Data Solutions

Sama-sama! Dan terima kasih telah meluangkan waktu untuk mengulasnya kembali.
royfripple

2

Saya menghadapi masalah yang sama dan menyelesaikannya menggunakan langkah-langkah sederhana di bawah ini:

1) Unduh InstallCert.java dari google

2) Kompilasi menggunakan javac InstallCert.java

3) Jalankan InstallCert.java menggunakan java InstallCert.java , dengan hostname dan port https, dan tekan “1” ketika meminta input. Ini akan menambahkan "localhost" sebagai keystore tepercaya, dan menghasilkan file bernama "jssecacerts" seperti di bawah ini:

java InstallCert localhost: 443

4) salin jssecacerts ke dalam folder $ JAVA_HOME / jre / lib / security

Sumber utama untuk menyelesaikan masalah di sini adalah:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html


1

Saya memecahkan masalah ini pada Windows Server 2016 dengan Java 8, dengan mengimpor cert dari pkcs12store ke cacertskeystore.

Path ke pkcs12 store:
C:\Apps\pkcs12.pfx

Path to Java cacerts:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Path to keytool:
C:\Program Files\Java\jre1.8.0_151\bin

Setelah memiliki ke folder dengan keytool di command prompt (sebagai administrator), perintah untuk mengimpor cert dari pkcs12ke cacertsadalah sebagai berikut:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Anda akan diminta untuk:
1. memasukkan password keystore tujuan (cacerts pasword, standarnya adalah "changeit")
2. masukkan kata sandi keystore sumber (kata sandi pkcs12)


Agar perubahan diterapkan, mulai ulang mesin server (atau cukup restart JVM).


1
Saya menggunakan pendekatan ini pada Mac dan hanya berhasil. Sertifikat saya tentu saja ditandatangani sendiri dan dibuat untuk saya mengimpor file .pfx yang saya buat di server adfs windows saya. Menggunakan Java 10 untuk aplikasi saya Terima kasih
Shashikant Soni

0

Di sini biasanya pengecualian semacam ini terjadi ketika ada ketidaksesuaian dalam PATH sertifikat tepercaya. Periksa konfigurasi atau jalur di mana sertifikat server ini diperlukan untuk komunikasi yang aman.


Bisakah Anda memberi tahu saya konfigurasi yang tepat di mana saya dapat menginstal sertifikat. Actaully saya mengalami masalah tentang ini, saya telah menginstal sertifikat tentang masalah ini menggunakan keytool , ini berfungsi sekitar 20-30 menit dan kemudian server mengeluarkan kesalahan yang sama lagi. Tolong bantu aku. Saya telah terjebak dalam masalah ini selama 2 hari.
Deepak Gangore

Saya pikir sertifikat berubah setiap 20-30 menit
Vishwanath gowda k

Saya menghadapi masalah serupa tetapi untuk masalah ini adalah: MY java memilih lokasi default untuk $ JAVA_HOME / lib / security / cacerts aplikasi Java meskipun saya telah menyediakan -Djavax.net.ssl.trustStore = / myapp / app.jks Dapatkah ada yang membantu saya tentang ini: stackoverflow.com/questions/33821785/…
Laxman G

0

Bagi saya, kesalahan sertifikat muncul karena saya menjalankan fiddler di latar belakang dan itu mengacaukan sertifikat. Kerjanya sebagai proxy yang sangat dekat sehingga dan memulai kembali gerhana.


prob yang sama terjadi pada gerhana, bahkan setelah menutup semua aplikasi
arvindwill

0

tujuan:

  1. gunakan koneksi https
  2. verifikasi rantai SSL
  3. jangan berurusan dengan cacerts
  4. tambahkan sertifikat dalam runtime
  5. jangan kehilangan sertifikat dari cacerts

Bagaimana cara melakukannya:

  1. tentukan keystore sendiri
  2. masukkan sertifikat ke dalam keystore
  3. mendefinisikan kembali konteks default SSL dengan kelas khusus kami
  4. ???
  5. keuntungan

File pembungkus Keystore saya:

public class CertificateManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private String keyStoreLocation;
    private String keyStorePassword;
    private X509TrustManager myTrustManager;
    private static KeyStore myTrustStore;

    public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
        this.keyStoreLocation = keyStoreLocation;
        this.keyStorePassword = keyStorePassword;
        myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
    }

    public void addCustomCertificate(String certFileName, String certificateAlias)
            throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);
        Certificate certificate = myTrustStore.getCertificate(certificateAlias);
        if (certificate == null) {
            logger.info("Certificate not exists");
            addCertificate(certFileName, certificateAlias);
        } else {
            logger.info("Certificate exists");
        }
        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(myTrustStore);
        for (TrustManager tm : tmf.getTrustManagers()) {
            if (tm instanceof X509TrustManager) {
                setMytrustManager((X509TrustManager) tm);
                logger.info("Trust manager found");
                break;
            }
        }
    }

    private InputStream fullStream(String fname) throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream resource = classLoader.getResourceAsStream(fname);
        try {
            if (resource != null) {
                DataInputStream dis = new DataInputStream(resource);
                byte[] bytes = new byte[dis.available()];
                dis.readFully(bytes);
                return new ByteArrayInputStream(bytes);
            } else {
                logger.info("resource not found");
            }
        } catch (Exception e) {
            logger.error("exception in certificate fetching as resource", e);
        }
        return null;
    }

    public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
        try {
            InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(in, pass.toCharArray());
            logger.info("Keystore was created from resource file");
            return keyStore;
        } catch (Exception e) {
            logger.info("Fail to create keystore from resource file");
        }

        File file = new File(keystore);
        KeyStore keyStore = KeyStore.getInstance("JKS");
        if (file.exists()) {
            keyStore.load(new FileInputStream(file), pass.toCharArray());
            logger.info("Default keystore loaded");
        } else {
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream(file), pass.toCharArray());
            logger.info("New keystore created");
        }
        return keyStore;
    }

    private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
            IOException, KeyStoreException, NoSuchAlgorithmException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream certStream = fullStream(certFileName);
        Certificate certs = cf.generateCertificate(certStream);
        myTrustStore.setCertificateEntry(certificateAlias, certs);
        FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
        myTrustStore.store(out, getKeyStorePassword().toCharArray());
        out.close();
        logger.info("Certificate pushed");
    }

    public String getKeyStoreLocation() {
        return keyStoreLocation;
    }

    public String getKeyStorePassword() {
        return keyStorePassword;
    }
    public X509TrustManager getMytrustManager() {
        return myTrustManager;
    }
    public void setMytrustManager(X509TrustManager myTrustManager) {
        this.myTrustManager = myTrustManager;
    }
}

Kelas ini akan membuat keystore jika perlu, dan akan dapat mengelola sertifikat di dalamnya. Sekarang kelas untuk konteks SSL:

public class CustomTrustManager implements X509TrustManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private static SSLSocketFactory socketFactory;
    private static CustomTrustManager instance = new CustomTrustManager();
    private static List<CertificateManager> register = new ArrayList<>();

    public static CustomTrustManager getInstance() {
        return instance;
    }

    private X509TrustManager defaultTm;

    public void register(CertificateManager certificateManager) {
        for(CertificateManager manager : register) {
            if(manager == certificateManager) {
                logger.info("Certificate manager already registered");
                return;
            }
        }
        register.add(certificateManager);
        logger.info("New Certificate manager registered");
    }

    private CustomTrustManager() {
        try {
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);

            tmf.init((KeyStore) null);
            boolean found = false;
            for (TrustManager tm : tmf.getTrustManagers()) {
                if (tm instanceof X509TrustManager) {
                    defaultTm = (X509TrustManager) tm;
                    found = true;
                    break;
                }
            }
            if(found) {
                logger.info("Default trust manager found");
            } else {
                logger.warn("Default trust manager was not found");
            }

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{this}, null);
            SSLContext.setDefault(sslContext);
            socketFactory = sslContext.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);


            logger.info("Custom trust manager was set");
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            logger.warn("Custom trust manager can't be set");
            e.printStackTrace();
        }
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        List<X509Certificate> out = new ArrayList<>();
        if (defaultTm != null) {
            out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
        }
        int defaultCount = out.size();
        logger.info("Default trust manager contain " + defaultCount + " certficates");
        for(CertificateManager manager : register) {
            X509TrustManager customTrustManager = manager.getMytrustManager();
            X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
            out.addAll(Arrays.asList(issuers));
        }
        logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
        X509Certificate[] arrayOut = new X509Certificate[out.size()];
        return out.toArray(arrayOut);
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        for(CertificateManager certificateManager : register) {
            X509TrustManager customTrustManager = certificateManager.getMytrustManager();
            try {
                customTrustManager.checkServerTrusted(chain, authType);
                logger.info("Certificate chain (server) was aproved by custom trust manager");
                return;
            } catch (Exception e) {
            }
        }
        if (defaultTm != null) {
            defaultTm.checkServerTrusted(chain, authType);
            logger.info("Certificate chain (server) was aproved by default trust manager");
        } else {
            logger.info("Certificate chain (server) was rejected");
            throw new CertificateException("Can't check server trusted certificate.");
        }
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        try {
            if (defaultTm != null) {
                defaultTm.checkClientTrusted(chain, authType);
                logger.info("Certificate chain (client) was aproved by default trust manager");
            } else {
                throw new NullPointerException();
            }
        } catch (Exception e) {
            for(CertificateManager certificateManager : register) {
                X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                try {
                    customTrustManager.checkClientTrusted(chain, authType);
                    logger.info("Certificate chain (client) was aproved by custom trust manager");
                    return;
                } catch (Exception e1) {
                }
            }
            logger.info("Certificate chain (client) was rejected");
            throw new CertificateException("Can't check client trusted certificate.");
        }
    }

    public SSLSocketFactory getSocketFactory() {
        return socketFactory;
    }
}

Kelas ini dibuat sebagai singleton, karena hanya satu konteks defaultSSL yang diizinkan. Jadi, sekarang penggunaan:

            CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
            String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
            try {
                certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
            } catch (Exception e) {
                log.error("Can't add custom certificate");
                e.printStackTrace();
            }
            CustomTrustManager.getInstance().register(certificateManager);

Mungkin, ini tidak akan berfungsi dengan pengaturan ini, karena saya menyimpan file sertifikat di dalam folder resource, jadi jalur saya tidak mutlak. Tetapi secara umum, ini bekerja dengan sempurna.


1
Penyalahgunaan ganda available()ini secara khusus diperingatkan terhadap Javadoc sendiri.
Marquis of Lorne

0

Ini tambahan untuk jawaban https://stackoverflow.com/a/36427118/1491414 . Terima kasih @MagGGG

  • Pastikan Anda memiliki izin administrator
  • Silakan gunakan tanda kutip ganda untuk jalur keystore (-keystore C: \ Program Files (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts ") karena pada OS Windows lokasi pemasangan default adalah File Program dan Anda akan mendapatkan kesalahan karena ruang antara File Program.

0

Saya memperbaikinya menggunakan metode di bawah ini-

  1. Salin url yang mengalami masalah koneksi
  2. Pergi ke Android Studio-> Pengaturan-> Pengaturan Http
  3. Di 'Uji Koneksi', rekatkan url itu dan tekan ok
  4. Pada klik Oke, Android Studio akan meminta untuk mengimpor sertifikat dari url itu, impor
  5. Itu dia. Tidak ada lagi yang harus dilakukan dan masalah saya hilang. Tidak perlu me-restart studio juga.

0

Ketika Anda memiliki kesalahan di atas dengan perangkat lunak atlassian ex. jira

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user 'jira@xyz.pl' via protocol 'imaps, caused by: 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

Anda dapat menambahkan sertifikat ke keystore tepercaya (ubah missing_ca ke nama sertifikat yang tepat):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

Jika diminta kata sandi, masukkan changeitdan konfirmasiy

Setelah itu cukup restart jira.


0

Jika URL repositori Anda juga berfungsi pada HTTP dan keamanannya tidak menjadi masalah, Anda dapat pergi ke settings.xml (sering, tetapi tidak selalu, terletak di %USERPROFILE%/.m2) dan mengganti HTTPS dengan HTTP untuk <repository>dan <pluginRepository>URL.

Sebagai contoh, ini:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

harus diganti dengan ini:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

0

Saya menggunakan toko kepercayaan saya sendiri daripada JRE satu dengan melewati arg -Djavax.net.ssl.trustStore=

Saya mendapatkan kesalahan ini terlepas dari sertifikat di truststore. Masalahnya bagi saya adalah pemesanan properti yang diteruskan pada baris arg. Ketika saya meletakkan -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= sebelum -Dspring.config.location= & -jarargs saya berhasil memanggil panggilan istirahat saya melalui https.


0

Jika Anda menggunakan CloudFoundry dan mengalami masalah sertifikat maka Anda harus memastikan bahwa Anda mendorong toples lagi dengan layanan keystore dengan sertifikat di dalamnya. Cukup lepaskan ikatan, ikat, dan mulai ulang tidak akan berfungsi.


0

Jika tuan rumah Anda duduk di belakang firewall / proxy , gunakan perintah berikut dalam cmd:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

Ganti <proxy_hostname>dan <proxy_port>dengan server proxy HTTP yang dikonfigurasi. Ganti <remote_host_name:remote_ssl_port>dengan salah satu host jarak jauh (pada dasarnya url) dan port mengalami masalah sertifikasi.

Ambil konten sertifikat terakhir yang dicetak dan salin (salin juga sertifikat awal dan akhir). Rekatkan di file teks dan berikan ekstensi .crt ke sana. Sekarang impor sertifikat ini ke cacerts menggunakan perintah java keytool dan seharusnya berfungsi.

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

0

Coba salin cacerts java:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts


0

Jika Anda melihat masalah ini dalam wadah linux ketika aplikasi java mencoba berkomunikasi dengan aplikasi / situs lain, itu karena sertifikat telah diimpor secara salah ke load balancer. Ada urutan langkah yang harus diikuti untuk mengimpor sertifikat dan bahwa jika tidak dilakukan dengan benar, Anda akan melihat masalah seperti

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

Setelah sertifikat diimpor dengan benar, itu harus dilakukan. Tidak perlu mengotak-atik sertifikat JDK.


0

Saya menyelesaikannya untuk Intellij Idea Saya menghadapi masalah ini Althouh, saya mengubah banyak tempat untuk menyelesaikan masalah. Saya menemukan solusi untuk saya. Klik kanan proyek Anda, Anda akan melihat Maven , setelah itu tekan Hasilkan Sumber dan Perbarui Folder dan ReImport masukkan deskripsi gambar di sini

Sudah selesai.


0

Saya menghadapi masalah yang sama, saya menggunakan 8.1.0-3, tetapi kemudian saya menggunakan 9.2.1-0 dan masalah ini diperbaiki tanpa langkah manual. Sertifikat yang ditandatangani sendiri berfungsi dengan baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.