“PKIX yol oluşturma başarısız” ve “istenen hedefe yönelik geçerli sertifika yolu bulunamadı”


422

Java projem için twitter4j kütüphanesini kullanarak tweet almaya çalışıyorum . İlk çalışmamda sertifika sun.security.validator.ValidatorExceptionve ile ilgili bir hata aldım sun.security.provider.certpath.SunCertPathBuilderException. Sonra twitter sertifikası ekledim:

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"

Ama başarılı olamadı. İşte tweets almak için prosedür:

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());
    }

Ve işte hata:

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
Merhaba Lütfen URL'yi kontrol edin. Eminim bunlar size yardımcı olacaktır. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . SSL sertifikanızı java truststore sertifikasına eklemeniz gerekir (Yol: jre / lib / security / cacerts).
sus007

Çözüm için lütfen bu cevaba bakın, ayrıca yazılımınızı paketlenmiş jre olarak paketlediğinizi onaylıyor musunuz? evet ise, o zaman cacerts dosya form sistemini kopyalayın ve paketlenmiş jre cacerts dosyasını değiştirin.
positivecrux


2
Bu java kodunu yeni kullandım ve https için bağlantı noktasını 443 olarak belirtmeyi unutmayın. Java kodu github.com/escline/InstallCert/blob/master/InstallCert.java CACERTS dosyanızı alacak ve tüm bunları artı girdi olarak verdiğiniz URL için geçerli sertifika. Benim durumumda değerleri host = "mywebservice.uat.xyz.com" olarak kodladım; bağlantı noktası = 443; parola = "changeit" .toCharArray (); Sonra program her şeye sahip olacak "jssecacerts" adlı yeni bir dosya oluşturur. Bunu "cacerts" olarak yeniden adlandırın ve kullanın. Her şey hazır olacak.
Reddymails

Yanıtlar:


572
  1. Tarayıcınızda URL'ye gidin:
    • firefox - HTTPS sertifika zincirini tıklayın (URL adresinin hemen yanındaki kilit simgesi). Tıklayın "more info" > "security" > "show certificate" > "details" > "export..". Adı alın ve example.cer dosya türünü seçin
    • chrome - adres çubuğundaki adrese gitmek için soldaki site simgesini tıklayın, "Sertifika" -> "Ayrıntılar" -> "Dışa Aktar" ı seçin ve "Der kodlu ikili, tek sertifika" formatında kaydedin.
  2. Artık anahtar deposu olan bir dosyanız var ve JVM'nize eklemeniz gerekiyor. Cacerts dosyalarının konumunu belirleyin, örn. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Sonra example.cerdosyayı komut satırındaki cacerts'e aktarın:

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

Hangi varsayılan parola istenir changeit

JVM / PC'nizi yeniden başlatın.

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


27
Yolu tırnak içine almak ve DER yerine Base64 olarak kaydetmek zorunda kaldım
Theodore K.

3
wow..its krom arada bir sihir gibi çalıştı, sadece sol adres çubuğundaki kilit simgesini tıklatıp ayrıntıları tıklayın ve yeniden başlatmaya gerek yok
aswzen

8
Zincirdeki tüm sertifikalar için talimatların tekrarlanması gerektiğini unutmayın. Ayrıca aliaskomut satırındaki sertifikanın adı benzersiz olmalıdır.
Lu55

5
Eviniz bir JDK ise, jre'nin bunun içinde olduğunu belirttiğinizden emin olun: keytool -import -alias example -keystore "C: \ Program Files \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble

12
"Erişim engellendi" hatası alan herkes için komut istemini yönetici olarak çalıştırdığınızdan emin olun.
Walker Christie

81

Java 6 kurulumumun yeni twitter sertifikalarıyla çalışmasını sağlamak için cert dosyaları oluşturmaya çalıştıktan birkaç saat sonra, sonunda mesaj panolarından birinde bir yorumda gömülü inanılmaz basit bir çözüme rastladım. Cacerts dosyasını bir Java 7 kurulumundan kopyalayın ve Java 6 kurulumunuzdaki dosyanın üzerine yazın. Muhtemelen cacerts dosyasının bir yedeğini almak için en iyisi, ancak daha sonra yenisini ve BOOM'a kopyalayın! sadece işe yarıyor.

Aslında bir Windows cacerts dosyasını bir Linux kurulumuna kopyaladığımı ve gayet iyi çalıştığını unutmayın.

Dosya jre/lib/security/cacertshem eski hem de yeni Java jdk kurulumlarında bulunur.

Umarım bu saatlerce ağırlaştırır.


4
Kendinden imzalı bir sertifika ile bir ssl sunucusuna erişmeye çalışıyorum, keytool kullanarak sertifikasını eklemeyi denedim, ama şans yok, herhangi bir öneri?
Oleg Belousov

1
Memnun oldum .. Ama bunun temel sebebinin ne olduğunu biliyor musun? Java 6 certs başarısız başarısız oldu .. ve java 7 certs sorunu nasıl çözdü
Vishwanath gowda k

Bunu yaptım, ancak icedtea 1.6'dan oracle 1.7'ye gittim. :)
nperson325681

Ayrıca bu çözümü de göz önünde bulundurun: stackoverflow.com/questions/33439905/…
Piohen

10
Beni sevenler için bazen bariz olanı özlüyorum - girdiğinizden emin olun $JAVA_HOME/jre/lib, değil $JAVA_HOME/lib- bu ayrıntıyı kaçırmak için biraz zaman harcadım.
Ryan Heathcote

35

Kullanıcı arayüzüm yaklaşımı:

  1. Anahtar deposu gezginini buradan indirin
  2. $ JAVA_HOME / jre / lib / security / cacerts açın
  3. PW girin: changeit (Mac'te değişiklik yapılabilir)
  4. .Crt dosyanızı içe aktarın

CMD-Line:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. PW girin: changeit(Mac'te değişiklik olabilir)

1
Mac'te, CMD-Line ile komutu çalıştırmak için sudo kullanmalısınız. # sudo keytool -importcert -file jetty.crt -alias iskelesi -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi

1
Windows'da çalışan komut:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla

sertifika dosyası nereden alınır? Hangi URL'ye gidileceğini söyleyemem. jetty.com ?
kraftydevil

Sertifikamı web tarayıcıdan dışa aktararak sertifikamı aldım, asma
kilitte

28

Özellikle Resmi olanlardan farklı olarak, otomatik olarak oluşturulan sertifikalarla oldukça zor olan ve Java onları bu kadar sevmeyen, düzeltmek için saatlerce süren araştırmaların yapıldığı bu konuyu tökezledim.

Lütfen aşağıdaki bağlantıyı kontrol edin: Java'daki sertifikalarla ilgili sorunu çözme

Temel olarak sertifikayı sunucudan Java Home sertifikalarına eklemeniz gerekir.

  1. Sertifikanızı oluşturun veya alın ve Tomcat'i Servers.xml'de kullanacak şekilde yapılandırın
  2. Sınıfın Java kaynak kodunu indirin ve InstallCertsunucu çalışırken aşağıdaki argümanları sağlayarak yürütün server[:port]. Orijinal şifre Java sertifikaları ("changeit") için çalıştığından şifre gerekmez.
  3. Program sunucuya bağlanır ve Java bir istisna atar, sunucu tarafından sağlanan sertifikayı analiz eder jssecertsve Programı yürüttüğünüz dizinde bir dosya oluşturmanıza izin verir (Eclipse'den çalıştırılırsa, Çalışmayı yapılandırdığınızdan emin olun. dizininde Run -> Configurations).
  4. Bu dosyayı manuel olarak $JAVA_HOME/jre/lib/security

Bu adımları izledikten sonra, sertifika ile bağlantılar artık Java içinde özel durumlar oluşturmaz.

Aşağıdaki kaynak kodu önemlidir ve (Sun) Oracle bloglarından kayboldu, bulduğum tek sayfa sağlanan bağlantıda olduğunu, bu nedenle herhangi bir referans için cevaba ekliyorum.

/*
 * 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
Oluşturulan dosyanın jssecacerts olduğunu unutmayın!
DeanDP

Java 7 ve 8 için bu çözümü kullanmayı denedim. Java 7 üzerinde çalışırken, denediğim tüm uzak havuz URL'leri için protokol_dönüşümü veya el sıkışma_hatası var. 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. Sertifikayı kontrol edin

Hedef URL'yi tarayıcıya yüklemeye çalışın ve sitenin sertifikasını (genellikle kilit işaretli simgeyle erişilebilir. Tarayıcının adres çubuğunun sol veya sağ tarafındadır) başka bir nedenle sona ermesine veya güvenilmemesine bakmaya çalışın.

2. JRE ve JDK'nın en son sürümlerini yükleyin

Yeni sürümler genellikle güncellenmiş güvenilir sertifika kümesiyle birlikte gelir.

Ayrıca mümkünse eski sürümleri kaldırın. Bu, yanlış yapılandırma hatalarını açık hale getirecektir.

3. Yapılandırmanızı kontrol edin:

  • JAVA_HOME ortam değişkeninizin nereye işaret ettiğini kontrol edin.
  • Programı çalıştırmak için hangi java sürümünü kullandığınızı kontrol edin. IntelliJ kontrolünde:
    • Dosya -> Proje Yapısı ... -> Proje Ayarları -> Proje -> Proje SDK'sı:
    • Dosya -> Proje Yapısı ... -> Platform Ayarları -> SDK'lar

4. Anahtar deposunun tamamını yeni Java sürümünden kopyalayın

Eğer son kullanılabilir dışındaki JDK altında geliştirirseniz - yerine deneyin %JAVA_HOME%/jre/lib/security/cacertsJRE yüklü en son gelen yenisi ile dosyayı Jeremy-Goodell onun önerdiklerini @ gibi (önce bir yedekleme kopyasını yapmak) cevap

5. Anahtar deponuza sertifika (lar) ekleyin

Yukarıdaki hiçbir şey sorununuzu çözmezse keytoolsertifikaları Java'nın anahtar deposuna kaydetmek için kullanın :

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

@MagGGG onun içinde anlaşılacağı gibi sertifika ile Dosya tarayıcıdan elde edilebilir cevap .

Not 1: Sitenizin sertifikasına giden zincirdeki her sertifika için bunu tekrarlamanız gerekebilir. Kökten başlayın.

Not 2: <alias_name>mağazadaki anahtarlar arasında benzersiz olmalı veya keytoolbir hata gösterecektir.

Mağazadaki tüm sertifikaların listesini almak için:

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

Bir şeyler ters giderse, sertifikayı mağazadan kaldırmanıza yardımcı olur:

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

Bunun ne kadar ayrıntılı olduğu ile, kabul edilen cevap olmalıdır.
Egor Hans

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

Sertifika doğrulamasını atlamak için kullanılır.

Uyarı Sadece bunun için geliştirme amacıyla kullanın güvenli değildir!


4
Sertifika doğrulamasını atlamak için kullanılır
gorums

2
@gorums Eclipse'de nasıl kurulur?
Ocak

6
Makinenizde keyfi kötü amaçlı kod çalıştırma riskini almak istemiyorsanız bunu YAPMAYIN. Makineyi çalıştıran herhangi bir makinenin güvenliğini tehlikeye atma riski nedeniyle indirildi.
Bryan

1
'Çalıştığı' güvenli olduğu anlamına gelmiyor, bu tavsiyeye uyan herkesi riske atıyorsunuz. Benim downvote var
Paradoxis

1
Noktayı @AceKing o oluyor ki değil sertifikayı doğrulamak yoksa kod güvendim. Bununla birlikte, bunun hala yararlı bir cevap olduğunu söyledi. Bunu yapan insanların sadece riskleri anlamaları gerekir.
Michael Mior

12

Sistemimde hem JDK hem de JRE 1.8.0_112 bulunduğunda biraz farklı bir durum yaşadım.

Yeni CA sertifikalarını [JDK_FOLDER]\jre\lib\security\cacertszaten bilinen komutu kullanarak içe aktardım:

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

Yine de, aynı PKIX yol kurma başarısız hata almaya devam etti .

Java CLI'ye hata ayıklama bilgilerini kullanarak ekledim java -Djavax.net.debug=all ... > debug.log. Debug.log dosyasında trustStore ile başlayan satır : aslında bulunan cacerts mağazasına işaret etti [JRE_FOLDER]\lib\security\cacerts.

Benim durumumda çözüm, JDK tarafından kullanılan (yeni CA'lar eklenmişti) Cacerts dosyasını JRE tarafından kullanılana kopyalamak ve sorunu düzeltmekti.


Keytool kullanarak JRE / lib / security / cacerts'e ihtiyacım olan certs'i doğrudan içe aktardım, ancak benim için hiçbir şey değiştirmedi :( hala aynı hatayı alıyorum, IDE aracılığıyla veya hatta sınıf yoluna ekledim ve bir Bean ekledim anahtar mağaza konumunu belirtin! Bu çılgın AF!
Alex

8

Sorun Arka Planı:

Projemde mvn clean install çalıştırmaya çalıştığımda ve Netbeans IDE clean and build seçeneğiyle aşağıdaki hatayı alıyordum. Bu sorun, NET beans IDE / through komut istemi üzerinden indirdiğimiz ancak dosyaların tarayıcı aracılığıyla indirilebildiği zaman sertifika kullanılamıyor olmasından kaynaklanmaktadır.

Hata :

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  

Çözüm:

1. Söz konusu URL'nin sertifikasını indirin:

  • IE'yi "yönetici olarak çalıştır" ile başlatın (aksi takdirde sertifikayı indiremeyiz)
  • URL'yi IE-> https: // url / local-repo adresine girin (Benim durumumda bu url'nin güvenilmeyen bir sertifikası vardı resim açıklamasını buraya girin.)
  • Sertifika hatası -> sertifikayı görüntüle'yi tıklayarak sertifikayı indirin
  • Ayrıntılar sekmesini seçin -> dosyaya kopyala -> sonraki -> "DER kodlu ikili X.509 (.CER)
  • sertifikayı bir konuma kaydedin, örnek: c: /user/sheldon/desktop/product.cer
  • Tebrikler! sitenin sertifikasını başarıyla indirdiniz

2. Şimdi sorunu çözmek için anahtar deposunu yükleyin.

  • İndirilen anahtar deposunu mevcut sertifika dosyasına eklemek için keytool komutunu çalıştırın.
  • Komut: jdk (JAVA_HOME) bin klasöründeki aşağıdaki komut .

C: \ Program Dosyaları \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file "C: /user/sheldon/desktop/product.cer" -alias product -keystore "C: / Program Dosyaları / Java / jdk1.8.0_141 / jre / lib / güvenlik / cacerts".

  • Şifre girmeniz istenir. Anahtar deposu şifresini girin: "Bu sertifikaya güvenilsin mi? [Hayır]:" için tekrar "changeit" girin, "evet" yazın

Örnek komut satırı komutları / çıktısı:

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! şimdi Netbeans IDE'nizde "PKIX yolu oluşturma başarısız oldu: sun.security.provider.certpath.SunCertPathBuilderException" hatasını ortadan kaldırmış olmalısınız.

Merhaba tüm adımları
izledim

Yolda cacerts dışında başka bir sertifikanız var mı? başka bir
taneniz

Thanks @Barani r, jre komutunu yürütmek ve benim tutulması JDK kullanarak benim hata oldu
ManishNegi 8:01 '

Sertifika indirilemedi, ancak "yönetici olarak çalıştır" sonra iyi çalıştı.
Başka bir kodlayıcı

8

Smtp.gmail.com için sertifika almak istedim

Benim için sadece çözüm 1'dir. Bu sertifikayı görüntüleme komutunu girin

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

  1. "----- BELGE BAŞLAT -----" ve "----- END SERTİFİKASI -----" arasındaki satırları gmail.cer dosyasına kopyalayın ve kaydedin.

  2. Çalıştırmak

    keytool -import -alias smtp.gmail.com -keystore "% JAVA_HOME% / jre / lib / security / cacerts" -dosya C: \ Kullanıcılar \ Yönetici \ Desktop \ gmail.cer

  3. Parola chageit girin

  4. Sertifikayı içe aktarmak için evet'i tıklayın

  5. Java'yı yeniden başlat

şimdi komutu çalıştırın ve başlamaya hazırsınız


Teşekkür ederim dostum! Bu benim günümü kurtardı. Benim durumumdaki tek uygun çözüm buydu.
Andrew Gans

Günümü de kurtardım. Teşekkür ederim.
Kris

6

Bu Twitter'a özgü bir cevap değil, ancak bu hatayı aradığınızda ortaya çıkan soru bu. Sisteminiz, bir web tarayıcısında görüntülendiğinde geçerli bir sertifikaya sahip gibi görünen bir web sitesine bağlanırken bu hatayı alıyorsa , bu büyük olasılıkla web sitesinin eksik bir sertifika zincirine sahip olduğu anlamına gelir .

Sorunun kısa bir özeti için: Sertifika Yetkilileri Kök Sertifikalarını yalnızca eski sertifikaları imzalamak için kullanmazlar. Bunun yerine, (genellikle) Sertifika Yetkilisi bayrağı ayarlanmış (yani sertifika imzalamasına izin verilir ) ara sertifikaları da imzalarlar. Daha sonra bir CA'dan sertifika satın aldığınızda, CSR'nizi bu ara sertifikalardan biriyle imzalarlar.

Java güven deponuz büyük olasılıkla ara köklere değil, yalnızca Kök Sertifikaya sahiptir.

Yanlış yapılandırılmış bir site yalnızca imzalı sertifikalarını döndürebilir . Sorun: Güven mağazanızda olmayan bir ara sertifika ile imzalandı. Tarayıcılar bu sorunu önbelleğe alınmış bir ara sertifika indirerek veya kullanarak halleder; bu, web sitesi uyumluluğunu en üst düzeye çıkarır. Java ve OpenSSL gibi araçlar bunu yapmaz. Ve bu sorudaki hataya neden olacaktır.

Bu şüpheyi Qualys SSL Testini kullanarak doğrulayabilirsiniz . Bunu bir siteye karşı çalıştırırsanız ve

Bu sunucunun sertifika zinciri eksik.

o zaman doğrular. Bunu, sertifika yollarına bakarak ve Ekstra İndir metnini görerek de görebilirsiniz .

Nasıl düzeltilir? Sunucu yöneticisinin web sunucusunu ara sertifikaları da verecek şekilde yapılandırması gerekir. Örneğin, Comodo için .ca-bundledosyanın kullanışlı olduğu yer burasıdır . Örneğin, mod_ssl içeren bir Apache yapılandırmasında SSLCertificateChainFileyapılandırma ayarını kullanırsınız. Nginx için, ara sertifikaları ve imzalı sertifikayı birleştirmeniz ve bunu SSL sertifika yapılandırmasında kullanmanız gerekir. Çevrimiçi "eksik sertifika zinciri" ni arayarak daha fazlasını bulabilirsiniz.


Sen harikasın. Teşekkür ederim! SSLCertificateChainFile önünde # kaldırmayı unuttuğum için Java sunucumun yeni derlemesi ile ilgili bir sorun yaşadım !!! Gerçekten iyi açıkladı.
KisnardOnline

6

Hatayı aşmamızın nedeni, JDK'nın çok sayıda güvenilir Sertifika Yetkilisi (CA) sertifikasıyla 'cacerts' adlı bir dosyada paketlenmesidir, ancak bu dosyanın kendinden imzalı sertifikamızla ilgili hiçbir ipucu yoktur. Başka bir deyişle, cacerts dosyası kendinden imzalı sertifikamıza içe aktarılmadığından bu dosyayı güvenilir bir varlık olarak görmez ve bu nedenle yukarıdaki hatayı verir.

Yukarıdaki hatayı düzeltme

Yukarıdaki hatayı düzeltmek için tek ihtiyacımız olan kendinden imzalı sertifikayı cacerts dosyasına aktarmaktır.

İlk olarak, cacerts dosyasını bulun. JDK konumunu bulmamız gerekecek. Uygulamanızı Eclipse veya IntelliJ Idea gibi IDE'lerden biriyle çalıştırıyorsanız, proje ayarlarına gidin ve JDK konumunun ne olduğunu bulun. Örneğin, bir Mac OS'de, cacerts dosyasının tipik konumu bu konumda olurdu / Kütüphane / Java / JavaVirtualMachines / {{JDK_version}} / İçindekiler / Ana Sayfa / jre / lib / Güvenlik, bir Windows makinesinde {{Installation_directory} } / {{JDK_version}} / jre / lib / güvenlik

Cacerts dosyasını bulduktan sonra, artık kendinden imzalı sertifikamızı bu cacerts dosyasına aktarmamız gerekiyor. Kendinden imzalı sertifikayı nasıl doğru bir şekilde oluşturacağınızı bilmiyorsanız, son makaleye bakın.

Sertifika dosyanız (.crt) yoksa ve yalnızca .jks dosyanız varsa aşağıdaki komutu kullanarak bir .crt dosyası oluşturabilirsiniz. Zaten bir .crt / .pem dosyanız varsa, aşağıdaki komutu yok sayabilirsiniz

## Anahtar deposundan sertifika oluşturmak için (.jks dosyası) ####

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

Yukarıdaki adım selfsigned.crt adlı bir dosya oluşturur.

Şimdi sertifikayı JRE / lib / security / cacerts'e (trustore) ekleyin
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

örneğin

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

Hepsi bu, uygulamanızı yeniden başlatın ve iyi çalışmalıdır. Hala çalışmıyorsa ve bir SSL el sıkışma istisnası alırsanız. Muhtemelen sertifikaya kaydedilen farklı bir alan adı kullandığınız anlamına gelir.

Bağlantı adım kararıyla ayrıntılı bir açıklama ve adımdan burada.


4

Eklemek cacertsbenim için işe yaramadı. Günlüğü bayrakla etkinleştirdikten -Djavax.net.debug=allsonra java okumasını öğrendi jssecacerts.

jssecacertsSonunda ithalat çalıştı.


2
Buradaki eksik açıklama, jssecacertseğer varsa Java'nın kullanacağıdır cacerts.
Lorne Marquis

3

Bu bir çözüm ama bu sorunla ilgili hikayem şeklinde:

Yukarıda verilen tüm çözümü denerken neredeyse ölüydüm (3 gün boyunca) ve hiçbir şey benim için işe yaramadı.

Bütün umudumu kaybettim.

Bu konuda güvenlik ekibimle temasa geçtim çünkü bir vekilin arkasındaydım ve yakın zamanda güvenlik politikalarını güncellediklerini söylediler.

Geliştiricileri bilgilendirmemek için onları çok azarladım.

Daha sonra tüm sertifikaları içeren yeni bir "cacerts" dosyası yayınladılar.

% JAVA_HOME% / jre / lib / security içinde mevcut olan cacerts dosyasını kaldırdım ve sorunumu çözdü.

Yani bu sorunla karşı karşıyaysanız, ağ ekibinizden de böyle olabilir.


2

Eclipse Cucumber-Eclipse eklentisini güncelleme sitesi üzerinden yüklemeye çalışırken bu soruya rastladım. Aynı SunCertPathBuilderException hatasını aldım:

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

Diğer bazı cevaplar bu sorunun verilen durumu için uygun ve yararlı olsa da, benim sorunum için yine de yararsız ve yanıltıcıydı.

Benim durumumda, sorun güncelleme siteleri için sağlanan URL'nin:

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

Bununla birlikte, tarayıcı aracılığıyla tarayıcıya yönlendirilirken şuraya yönlendirilir (eklenen " .github " a dikkat edin ):

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

Dolayısıyla çözüm, güncelleme sitesini tutulmaya eklerken güncelleme sitesi URL'sinin yeniden yönlendirilmiş sürümünü kullanmaktır.


3
Doğru soruyu cevapladığınızdan emin misiniz? Orijinal soruda salatalıktan bahsedilmiyor ...
Done Data Solutions

Öyle olduğumu hissediyorum. Aynı SunCertPathBuilderException hatası aldı ve bir çözüm ararken, bu soruyu hem de bulundu bu bir . Ancak hiçbirinin durumum için uygun çözümü yoktu. Eclipse için Salatalık-Eclipse eklenti sitesi ekleme belirli bir soruya cevap çalışmıyordu. Karşılaştığım sorun için (URL yeniden yönlendirme) bağlam sağlamak ve sorunun nasıl çözüldüğünü açıklamak istedim.
royfripple

Cevabımı güncelleyerek aynı hatayı aldığımı netleştirdim, altta yatan sorunun ve çözümün farklı olduğunu belirttim. Başkalarının aynı hatayı ararken bu soruyu bulabileceğinden bunun geçerli olduğunu düşünüyorum. Bunun mantıklı olduğunu düşünüyorsanız lütfen oyunuzu değiştirmeyi düşünün.
royfripple

Teşekkür ederim. İşleri daha net hale getiriyor, downvote'umu tersine çeviriyor
Done Data Solutions

Rica ederim! Ve tekrar gözden geçirmeye zaman ayırdığınız için teşekkür ederiz.
royfripple

2

Aynı sorunla karşı karşıya kaldım ve aşağıdaki basit adımları kullanarak çözüldüm:

1) InstallCert.java'yı Google'dan indirin

2) Javac InstallCert.java kullanarak derleyin

3) Ana makine adı ve https bağlantı noktasıyla java InstallCert.java'yı kullanarak InstallCert.java'yı çalıştırın ve girdi sorurken “1” e basın. “Localhost” u güvenilir bir anahtar deposu olarak ekler ve aşağıdaki gibi “jssecacerts” adlı bir dosya oluşturur:

java InstallCert localhost: 443

4) jssecacerts $ JAVA_HOME / jre / lib / security klasörüne kopyalayın

Burada sorunu çözmek için ana kaynak:

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


1

Sertifikayı pkcs12mağazadan cacertsanahtar deposuna alarak Java 8 ile Windows Server 2016'da bu sorunu çözdüm.

Pkcs12 store
C:\Apps\pkcs12.pfx

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

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

Komut isteminde keytool içeren klasöre (yönetici olarak) sahip olduktan sonra, sertifikayı almak pkcs12için komut cacertsaşağıdaki gibidir
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

:
1. hedef anahtar deposu şifresini girin (parola cacerts, varsayılan "changeit")
2. kaynak anahtar deposu parolasını girin (pkcs12 parolası)


Değişikliklerin etkili olması için sunucu makinesini yeniden başlatın (veya sadece JVM'yi yeniden başlatın).


1
Bu yaklaşımı bir Mac'te kullandım ve işe yaradı. Benim Cert tabii ki kendinden imzalı ve windows adfs sunucumda oluşturmuştu .pfx dosyasını ithal. Benim app için Java 10 kullanma Teşekkürler
Shashikant Soni

0

Burada normalde bu tür bir istisna, güvenilir sertifikanın PATH'ında uyumsuzluk olduğunda ortaya çıkar. Güvenli iletişim için bu sunucu sertifikasının gerekli olduğu yapılandırmayı veya yolu kontrol edin.


Sertifika yükleyebileceğim tam yapılandırmayı bana söyler misiniz? Actaully ben bu konuda sorun yaşıyorum, ben keytool kullanarak bu konu ile ilgili sertifikayı yüklemişti , bu yaklaşık 20-30 dakika çalışır ve daha sonra sunucu tekrar aynı hata sorunu. Lütfen bana yardım et. Bu konuda 2 gündür sıkışıp kaldım.
Deepak Gangore

Sertifikanın her 20-30 dakikada bir değiştiğini düşünüyorum
Vishwanath gowda k

Benzer bir sorunla karşı karşıyayım ama sorun için: -Javax.net.ssl.trustStore = / myapp / app.jks Sağladığım olsa da benim java $ JAVA_HOME / lib / security / Java uygulamalarının cacerts için varsayılan konumu seç bu konuda: stackoverflow.com/questions/33821785/…
Laxman G

0

Benim için sertifika hatası çıktı çünkü kemancı arka planda çalışıyordu ve bu sertifika ile karışıyordu. O kadar yakın bir proxy gibi davranır ve tutulmayı yeniden başlatır.


Tüm uygulama kapatıldıktan sonra bile tutulmada aynı prob oluyor
arvindwill

0

hedefler:

  1. https bağlantılarını kullan
  2. SSL zincirlerini doğrula
  3. cacerlerle uğraşma
  4. çalışma zamanında sertifika ekle
  5. Cacerts'ten sertifika kaybetme

Nasıl yapılır:

  1. kendi anahtar deposunu tanımla
  2. sertifikayı anahtar deposuna koy
  3. SSL varsayılan içeriğini özel sınıfımızla yeniden tanımlayın
  4. ???
  5. kâr

Anahtar deposu sarma dosyası:

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;
    }
}

Bu sınıf gerekirse anahtar deposu oluşturacak ve içindeki sertifikaları yönetebilecektir. SSL bağlamı için şimdi sınıf:

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;
    }
}

Yalnızca bir defaultSSL içeriğine izin verildiğinden bu sınıf tekil olarak yapıldı. Şimdi kullanım:

            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);

Muhtemelen, bu ayarlarla çalışmaz, çünkü sertifika dosyasını kaynak klasörünün içinde saklıyorum, bu yüzden yolum mutlak değil. Ancak genellikle mükemmel çalışır.


1
Bu çift yanlış kullanımı available(), kendi Javadoc'unda özellikle uyarılır.
Lorne Marquis

0

Cevaba ek olarak https://stackoverflow.com/a/36427118/1491414 . Teşekkürler @MagGGG

  • Lütfen yönetici iznine sahip olduğunuzdan emin olun
  • Anahtar deposu yolu için lütfen çift tırnak kullanın (-keystore C: \ Program Files (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts "), çünkü Windows işletim sisteminde varsayılan yükleme konumu Program Files olacaktır ve Program Dosyaları arasındaki boşluk nedeniyle bir hata.

0

Aşağıdaki yöntemi kullanarak bu düzeltildi-

  1. Bağlantı sorunu olan URL'yi kopyala
  2. Android Studio-> Ayarlar-> Http ayarları'na gidin
  3. 'Bağlantıyı Test Et' alanına, URL'yi yapıştırın ve Tamam'a basın
  4. Tamam tıklandığında, Android Studio o URL'nin sertifikasını içe aktarmayı, içe aktarmayı isteyecektir
  5. Bu kadar. Yapacak başka bir şey yok ve sorunum ortadan kalktı. Stüdyoyu da yeniden başlatmaya gerek yok.

0

Atlassian yazılımı ex ile yukarıdaki hata olduğunda. 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

güvenilen anahtar deposuna sertifika ekleyebilirsiniz (missing_ca dosyasını doğru sertifika adına değiştirin):

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

Parola girmeniz changeitve onaylamanız istenirsey

Bundan sonra jira'yı yeniden başlatın.


0

Deponuzu URL HTTP üzerinde çalışmak ve güvenlik sözkonusu değilse, sen gidebilirsin settings.xml (genellikle, her zaman olmasa da bulunur %USERPROFILE%/.m2) ve HTTP ile HTTPS yerine için <repository>ve <pluginRepository>URL'ler.

Örneğin, bu:

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

bununla değiştirilmelidir:

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

0

Arg ileterek JRE yerine kendi güven mağazamı kullanıyordum -Djavax.net.ssl.trustStore=

Truststore'daki sertifikalardan bağımsız olarak bu hatayı alıyordum. Benim için sorun arg satırında geçirilen özelliklerin sıralamasıydı. İ koyduğunuzda -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= öncesi -Dspring.config.location= & -jarben https üzerinden benim dinlenme çağrısı çağırmak başarıyla başardı args.


0

CloudFoundry kullanıyorsanız ve sertifika sorunu yaşıyorsanız, kavanozu sertifikayı içeren anahtar deposu hizmetiyle tekrar ittiğinizden emin olmanız gerekir. Basitçe ayırmak, bağlamak ve yeniden başlatmak işe yaramaz.


0

Ana makinenizin güvenlik duvarı / proxy'nin arkasında olması durumunda, cmd cinsinden aşağıdaki komutu kullanın:

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

Değiştirin <proxy_hostname>ve <proxy_port>yapılandırılmış HTTP proxy sunucusuyla. Değiştir <remote_host_name:remote_ssl_port>uzak ana biri (temelde url) ve liman sertifikasyon sorunu yaşıyor ile.

Yazdırılan son sertifika içeriğini alın ve kopyalayın (ayrıca başlangıç ​​ve bitiş sertifikasını da kopyalayın). Metin dosyasına yapıştırın ve .crt uzantısını verin . Şimdi bu sertifikayı almak cacerts java keytool komutunu kullanarak ve çalışması gerekir.

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

0

Java cacerts kopyalamayı deneyin:

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

Java uygulaması başka bir uygulama / siteyle iletişim kurmaya çalışırken bir linux kapsayıcısında bu sorunu görüyorsanız, bunun nedeni sertifikanın yük dengeleyiciye yanlış aktarılmış olmasıdır. Sertifikaları içe aktarmak için izlenmesi gereken adımlar dizisi vardır ve doğru yapılmazsa aşağıdaki gibi sorunlar görürsünüz

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

Sertifikalar doğru bir şekilde alındıktan sonra yapılmalıdır. JDK sertifikalarıyla uğraşmanıza gerek yok.


0

Ben bunu çözmüş Intellij Idea , göreceksiniz beni projenizi tıklayın .right için bu sorun Althouh, ben problem.I bir çözüm buldum çözmek için yerinde bir sürü değiştirmek dönük I Maven o basıldıktan sonra, Kaynaklar Ve Güncelleme Klasörler oluşturun ve tekrar içe resim açıklamasını buraya girin

Tamamdır.


0

Aynı sorunla karşı karşıya kaldım, 8.1.0-3 kullanıyordum, ancak daha sonra 9.2.1-0 kullandım ve sorun herhangi bir manuel adım olmadan düzeltildi. Kendinden imzalı sertifika iyi çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.