「PKIXパスの構築に失敗しました」および「要求されたターゲットへの有効な証明書パスが見つかりません」


423

私のJavaプロジェクトのtwitter4jライブラリを使用してツイートを取得しようとしています。最初の実行時に、証明書sun.security.validator.ValidatorExceptionとに関するエラーが発生しましたsun.security.provider.certpath.SunCertPathBuilderException。次に、Twitter証明書を追加しました。

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"

しかし成功せず。ツイートを取得する手順は次のとおりです。

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

そしてここにエラーがあります:

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
こんにちは下記URLをご確認ください。これらはあなたを助けると確信しています。java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/...。ssl証明書をJavaトラストストア証明書に追加する必要があります(パス:jre / lib / security / cacerts)。
sus007 14

ソリューションについてはこの回答を参照しください。また、ソフトウェアをバンドルされたjreとしてパッケージ化していることを確認してください。はいの場合は、cacertsファイルのフォームシステムをコピーし、そのパッケージ化されたjre cacertsファイルを置き換えます。
positivecrux

これを試してくださいstackoverflow.com/a/9210661/4741746これがあなたの答えかもしれません
なだらかなgosavi

2
私はこのJavaコードを使用しただけで、httpsの場合はポートを443に指定することを忘れないでください。github.com/ escline / InstallCert / blob / master / InstallCert.javaの Javaコード CACERTSファイルを取得し、それらすべてを追加します入力として指定したURLの現在の証明書。私の場合、値をhost = "mywebservice.uat.xyz.com"にハードコードしました。port = 443; passphrase = "changeit" .toCharArray(); 次に、プログラムは「jssecacerts」と呼ばれる新しいファイルを作成します。これを「cacerts」に名前変更して、これを使用します。あなたはすべて設定されます。
Reddymails 2017年

回答:


574
  1. ブラウザでURLにアクセスします。
    • firefox-HTTPS証明書チェーン(URLアドレスのすぐ隣にある鍵のアイコン)をクリックします。をクリックし"more info" > "security" > "show certificate" > "details" > "export.."ます。名前をピックアップし、ファイルタイプexample.cerを選択します
    • クロム-アドレスバーのアドレスを指定するには、サイトのアイコンをクリックし、[証明書]-> [詳細]-> [エクスポート]を選択して、「Derエンコードバイナリ、単一証明書」の形式で保存します。
  2. これで、キーストアを含むファイルが作成され、JVMに追加する必要があります。cacertsファイルの場所を決定します。 C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. 次にexample.cer、コマンドラインでファイルをcacertsにインポートします。

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

デフォルトのパスワードを求められます changeit

JVM / PCを再起動します。

ソース:http : //magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html


27
パスを引用符で囲み、DERではなくBase64として保存する必要があった
TheodoreK。16年

3
wow..itsはChromeで魔法のように機能し、左側のアドレスバーのロックアイコンをクリックして、[ 詳細 ]をクリックするだけ で、再起動は必要ありません
aswzen

8
チェーン内のすべての証明書について、手順を繰り返す必要があることに注意してください。またalias、コマンドラインの証明書の名前は一意である必要があります。
Lu55

5
ホームがJDKの場合、jreがその中にあることを必ず指定してください。keytool-import -alias example -keystore "C:\ Program Files \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble

12
「アクセス拒否」エラーが発生した場合は、管理者としてコマンドプロンプトを実行していることを確認してください。
ウォーカークリスティー

81

何時間も証明書ファイルを作成して私のJava 6インストールが新しいTwitter証明書で動作するように試みた後、メッセージボードの1つのコメントに埋め込まれた信じられないほど単純なソリューションに偶然出会いました。Java 7インストールからcacertsファイルをコピーし、Java 6インストールのファイルを上書きするだけです。おそらく最初にcacertsファイルのバックアップを作成するのが最善ですが、それから新しいものをBOOMにコピーするだけです!うまくいきます。

Windows cacertsファイルをLinuxインストールに実際にコピーしたところ、問題なく動作したことに注意してください。

このファイルはjre/lib/security/cacerts、古いJavaインストールと新しいJava jdkインストールの両方にあります。

これが誰か他の人の悪化を救うことを願っています。


4
自己署名証明書を使用してsslサーバーにアクセスしようとしています。keytoolを使用して証明書を追加してみましたが、うまくいきません。
Oleg Belousov 2014

1
それがうまくいったことを嬉しく思います。しかし、根本的な原因が何であったか知っていますか。Java 6
証明書で失敗した理由と

私はicedtea 1.6からoracle 1.7に移行しましたが、これでうまくいきました。:)
nperson325681 2014年

次のソリューションも検討してください:stackoverflow.com/questions/33439905/…–
ピオヘン

10
私のような人は時々明白なものを見逃します-に入るのを忘れ$JAVA_HOME/jre/libないでください$JAVA_HOME/lib-私はその詳細を見逃して少し時間を費やしました。
Ryan Heathcote

35

私のUIアプローチ:

  1. ここからキーストアエクスプローラをダウンロード
  2. $ JAVA_HOME / jre / lib / security / cacertsを開きます
  3. PWを入力してください:changeit(Macではchangemeです)
  4. .crtファイルをインポートする

CMD-Line:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. PWを入力してください:changeit(Macではchangemeです)

1
Macでは、CMD-Lineを使用して、sudoを使用してコマンドを実行する必要があります。#sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi

1
Windowsでは、コマンドはウィッヒ作品:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
パトリシオボニーラ

どこから証明書ファイルを取得しますか?移動先のURLがわかりません。jetty.com
kraftydevil

Webブラウザーから証明書をエクスポートして、南京錠のコンテキストアクションで証明書を取得しました
rtbf

28

特に、自動生成された証明書を使用して修正するのに何時間もかかるこの問題に遭遇しました。特に、自動生成された証明書は、公式のものとは異なり、非常に扱いが難しく、Javaはそれらをあまり好きではありません。

次のリンクを確認してください:Javaの証明書に関する問題を解決します

基本的には、サーバーからJava Home証明書に証明書を追加する必要があります。

  1. 証明書を生成または取得し、それをServers.xmlで使用するようにTomcatを構成します。
  2. クラスのJavaソースコードをダウンロードInstallCertし、サーバーの実行中に次の引数を指定して実行しますserver[:port]。元のパスワードはJava証明書(「changeit」)で機能するため、パスワードは必要ありません。
  3. プログラムはサーバーに接続し、Javaは例外をスローし、サーバーから提供された証明書を分析しjssecerts、プログラムを実行したディレクトリ内にファイルを作成できるようにします(Eclipseから実行した場合は、のディレクトリRun -> Configurations)。
  4. そのファイルを手動でコピーする $JAVA_HOME/jre/lib/security

これらの手順を実行すると、証明書との接続でJava内で例外が発生しなくなります。

次のソースコードは重要であり、(Sun)Oracleブログから消えました。私が見つけた唯一のページは提供されたリンク上にあったため、参照用に回答に添付します。

/*
 * 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
作成されたファイルはjssecacertsです!
DeanDP、2016

Java 7と8にこのソリューションを使用してみました。Java7で実行しているときに、試したすべてのリモートリポジトリURLのprotocol_versionまたはhandshake_failureを取得しました。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.証明書を確認する

ブラウザーでターゲットURLをロードして、サイトの証明書(通常、鍵のアイコンが付いたアイコンでアクセスできます。ブラウザーのアドレスバーの左側または右側にあります)が期限切れか他の理由で信頼されていないかを確認してください。

2. JREおよびJDKの最新バージョンをインストールします。

新しいバージョンには通常、更新された信頼できる証明書のセットが付属しています。

また、可能であれば、古いバージョンをアンインストールしてください。これにより、構成ミスのエラーが明確になります。

3.構成を確認します。

  • JAVA_HOME環境変数が指す場所を確認します。
  • プログラムの実行に使用するJavaのバージョンを確認してください。IntelliJで確認:
    • ファイル->プロジェクト構造...->プロジェクト設定->プロジェクト->プロジェクトSDK:
    • ファイル->プロジェクト構造...->プラットフォーム設定-> SDK

4.新しいJavaバージョンからキーストア全体をコピーします

利用可能な最新のもの以外のJDKで開発している場合- %JAVA_HOME%/jre/lib/security/cacerts@ jeremy-goodellが彼の答えで示唆しているように、最新のインストール済みJREから新しいファイルでファイルを置き換えてみてください(最初にバックアップコピーを作成してください)。

5.キーストアに証明書を追加します

上記のいずれでも問題が解決しない場合はkeytool、証明書をJavaのキーストアに保存します。

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

証明書付きのファイルは、@ MagGGGが回答で示唆しているように、ブラウザから取得できます。

注1:サイトの証明書へのチェーン内のすべての証明書について、これを繰り返す必要がある場合があります。ルートから始めます。

注2:<alias_name>ストア内のキー間で一意である必要がkeytoolあります。そうしないとエラーが表示されます。

ストア内のすべての証明書のリストを取得するには、次のコマンドを実行します。

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

何かがうまくいかない場合、これはストアから証明書を削除するのに役立ちます:

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

これがどれほど精巧であるかで、それは受け入れられた答えであるべきです。
エゴールハンス

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

証明書の検証をジャンプするために使用されます。

警告 これは開発目的でのみ使用するのは安全ではありません!


4
これは、証明書の検証をジャンプするために使用されます
gorums

2
@gorums Eclipseで設定する方法は?
malajisi 2017年

6
マシン上で任意の悪意のあるコードを実行する危険を冒したくない限り、これを行わないでください。それを実行するマシンを危険にさらすリスクがあるため、反対票を投じました。
ブライアン

1
それが「機能する」からといって安全であるとは限らないため、このアドバイスに従うすべての人を危険にさらしています。賛成投票
Paradoxis

1
ポイントを@AceKingすることは、ということですではない証明書を検証していない場合は、コードを信頼できます。とはいえ、これはまだ有用な答えだと思います。それを行う人々は、リスクを理解する必要があるだけです。
Michael Mior

12

私のシステムにJDKとJRE 1.8.0_112の両方が存在するときは、少し異なる状況がありました。

[JDK_FOLDER]\jre\lib\security\cacerts既知のコマンドを使用して、新しいCA証明書をにインポートしました。

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

それでも、同じPKIXパス構築失敗エラー発生し続けました。

を使用して、Java CLIにデバッグ情報を追加しましたjava -Djavax.net.debug=all ... > debug.log。debug.logファイルで、trustStoreで始まる行は次のとおりです。実際には、にあるcacertsストアをポイントしてい[JRE_FOLDER]\lib\security\cacertsます。

私の場合、解決策は、JDKが使用するcacertsファイル(新しいCAが追加されている)を、JREが使用するものにコピーすることであり、それによって問題が修正されました。


keytoolを使用して必要な証明書をJRE / lib / security / cacertsに直接インポートしましたが、何も変わりませんでした:(同じエラーが発生しますが、IDE経由で追加したり、クラスパスに追加したり、Beanをキーストアの場所を指定してください!!ク​​レイジーなAFです!
Alex

8

問題の背景:

プロジェクトで、Netbeans IDEのクリーンおよびビルドオプションを使用してmvn clean installを実行しようとすると、次のエラーが発生しました。この問題は、NET Beans IDE /コマンドプロンプトを介してダウンロードするときに証明書を使用できないが、ブラウザーを介してファイルをダウンロードできるためです。

エラー

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  

解決:

1.問題のURLの証明書をダウンロードします。

  • 「管理者として実行」してIEを起動します(それ以外の場合、証明書をダウンロードできません)
  • IE-> https:// url / local-repoに URLを入力します (私の場合、このURLには信頼されていない証明書が含まれていましたここに画像の説明を入力してください)。
  • 証明書エラーをクリックして証明書をダウンロードします->証明書を表示します
  • [詳細]タブ-> [ファイルにコピー]-> [次へ]-> [DERエンコードされたバイナリX.509(.CER)を選択します
  • 証明書をどこかに保存します。例:c:/user/sheldon/desktop/product.cer
  • おめでとうございます!サイトの証明書が正常にダウンロードされました

2.次に、キーストアをインストールして問題を修正します。

  • keytoolコマンドを実行して、ダウンロードしたキーストアを既存の証明書ファイルに追加します。
  • コマンド:jdk(JAVA_HOME)のbinフォルダーの以下のコマンド

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」。

  • パスワードの入力を求められます。キーストアのパスワードを入力してください:「この証明書を信頼しますか?[いいえ]:」にもう一度「changeit」と入力し、「yes」と入力します

コマンドラインコマンド/出力の例:

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
  • おめでとうございます!これで、Netbeans IDEの「PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException」エラーが解消されました。

こんにちは、すべての手順を実行しましたが、運はありませんでした:(
ManishNegi

パスにcacerts以外の他の証明書がありますか?他にもある場合は、その証明書に追加してみてください
Barani r

@Barani rに感謝します。jreからコマンドを実行し、EclipseでJDKを使用していたのは私の間違いでした
ManishNegi

証明書をダウンロードできませんでしたが、「管理者として実行」した後、うまくいきました。
別のコーダー

8

smtp.gmail.comの証明書をインポートしたい

私にとって有効なソリューションは1のみです。この証明書を表示するにはコマンドを入力してください

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

  1. 「----- BEGIN CERTIFICATE -----」と「----- END CERTIFICATE -----」の間の行をコピーしてファイルgmail.cerに保存します

  2. 走る

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

  3. パスワードを入力してください

  4. [はい]をクリックして証明書をインポートします

  5. Javaを再起動します

今コマンドを実行し、あなたは行ってもいいです


ありがとうございます!それは私の日を救った。これが私の場合の唯一の適切な解決策でした。
Andrew Gans 2017

私の日も救った。ありがとうございました。
クリス

6

これはTwitter固有の回答ではありませんが、このエラーを検索したときに出てくる質問です。Webブラウザー表示したときに有効な証明書を持っているように見える Webサイトに接続しているときに、システムがこのエラーを受け取っている場合は、おそらくサイトに不完全な証明書チェーンがあるをします。

問題の概要について:認証局はルート証明書を使用して、古い証明書に署名するだけではありません。代わりに、彼らは(通常)署名します認証局フラグが設定されている(つまり、証明書への署名が許可されている中間証明書に署名します。次に、CAから証明書を購入すると、これらの証明書のいずれかでCSRに署名します。

ほとんどの場合、Javaトラストストアにはルート証明書のみがあり、中間証明書はありません。

誤って構成されたサイトが戻る可能性があります 、署名された証明書のみをます。問題:トラストストアにない中間証明書で署名されています。ブラウザは、キャッシュされた中間証明書をダウンロードまたは使用することでこの問題を処理します。これにより、Webサイトの互換性が最大化されます。ただし、JavaやOpenSSLなどのツールはサポートされません。そして、それは質問でエラーを引き起こします。

Qualys SSL Testを使用して、この疑いを確認できます。あなたがサイトに対してそれを実行し、それが言うなら

このサーバーの証明書チェーンは不完全です。

その後、それを確認します。これは、認定パスを確認し、「Extra Download」というテキストを確認することでも確認できます。

修正方法:サーバー管理者は、中間証明書も返すようにWebサーバーを設定する必要があります。たとえば、Comodoの場合、この.ca-bundleファイルが役に立ちます。たとえば、mod_sslを使用したApache構成では、SSLCertificateChainFile構成設定を使用します。nginxの場合、中間証明書と署名済み証明書を連結し、SSL証明書構成で使用する必要があります。詳細については、「不完全な証明書チェーン」をオンラインで検索してください。


あなたは素晴らしいです。ありがとうございました!SSLCertificateChainFileの前にある#を削除するのを忘れたため、Javaサーバーの新しいビルドアウトで問題が発生しました!!! 本当によく説明されました。
KisnardOnline

6

上記のエラーが発生する理由は、JDKが多くの信頼できる認証局(CA)証明書と「cacerts」というファイルにバンドルされているためです。このファイルには自己署名証明書の手掛かりがありません。つまり、cacertsファイルには自己署名証明書がインポートされていないため、信頼できるエンティティとして扱われず、上記のエラーが発生します。

上記のエラーを修正する方法

上記のエラーを修正するには、自己署名証明書をcacertsファイルにインポートするだけです。

まず、cacertsファイルを見つけます。JDKの場所を見つける必要があります。EclipseやIntelliJ IdeaなどのIDEのいずれかを介してアプリケーションを実行している場合は、プロジェクト設定に移動して、JDKの場所を特定します。たとえば、Mac OSでは、cacertsファイルの一般的な場所は次の場所になります/ Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security on the Windows's machine is it under {{Installation_directory} } / {{JDK_version}} / jre / lib / security

cacertsファイルを見つけたら、自己署名証明書をこのcacertsファイルにインポートする必要があります。自己署名証明書を正しく生成する方法がわからない場合は、前回の記事を確認してください。

証明書ファイル(.crt)がなく、.jksファイルしかない場合は、以下のコマンドを使用して.crtファイルを生成できます。すでに.crt / .pemファイルがある場合は、以下のコマンドを無視できます

##キーストア(.jksファイル)から証明書を生成するには####

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

上記の手順では、selfsigned.crtと呼ばれるファイルが生成されます。Now証明書をcacertsにインポートします

次に、証明書をJRE / lib / security / cacerts(trustore)に追加します。
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

例えば

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

これですべてです。アプリケーションを再起動すると、問題なく動作するはずです。それでも機能しない場合は、SSLハンドシェイク例外が発生します。おそらく、別のドメインを使用していて、証明書に登録されていることを意味します。

詳細な説明と段階的な解決策とのリンクはこちらです。


4

追加cacertsはうまくいきませんでした。フラグ-Djavax.net.debug=allでログを有効にした後、Javaからの読み取りを知るようになりましたjssecacerts

jssecacertsいよいよ動作するインポート。


2
ここで欠けている説明は、Javaがjssecacerts存在する場合はそれを使用し、それ以外の場合はそれを使用することですcacerts
ローン侯爵

3

これは解決策ですが、この問題に関する私の物語の形で:

上記のすべての解決策を試してみましたが(3日間)、ほとんど死んでいました。

私はすべての希望を失った。

私はプロキシの背後にいて、セキュリティポリシーを最近更新したと彼らが言ったので、これについてセキュリティチームに連絡しました。

私は開発者に知らせなかったのでひどく叱った。

その後、すべての証明書を含む新しい「cacerts」ファイルを発行しました。

%JAVA_HOME%/ jre / lib / security内にあるcacertsファイルを削除し、問題を解決しました。

したがって、この問題に直面している場合は、ネットワークチームからの問題である可能性もあります。


2

更新サイト経由でEclipseにCucumber-Eclipseプラグインをインストールしようとしたときに、この質問に出くわしました。同じSunCertPathBuilderExceptionエラーを受け取りました:

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

他の回答のいくつかは、この質問の所与の状況に適切であり、役立つものですが、それでも役に立たず、私の問題を誤解させるものでした。

私の場合、問題は、更新サイトに提供されたURLが次のとおりであることでした。

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

ただし、ブラウザーを介して移動すると、リダイレクトされます(「.github」が追加されていることに注意してください)。

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

したがって、解決策は、更新サイトをEclipseに追加するときに、リダイレクトされたバージョンの更新サイトURLを使用することです。


3
あなたは正しい質問に答えていますか?元の質問ではキュウリについての言及はありません...
Done Data Solutions

私はそうだと感じています。私はだけでなく、この質問を見つけ、同じSunCertPathBuilderExceptionエラーを受信し、解像度を探しながら、この1。しかし、どちらも私の状況に適切な解決策を持っていませんでした。Cucumber-EclipseプラグインサイトをEclipseに追加する方法に関する特定の質問に答えようとはしていませんでした。私が直面した問題(URLリダイレクト)のコンテキストを提供し、それがどのように解決されたかを説明したいと思いました。
royfripple 2017年

同じエラーが発生したことを明確にするために回答を更新しましたが、根本的な問題と解決策は異なっていました。他の人が同じエラーを検索したときにこの質問が見つかる可能性があるため、これは妥当だと思います。これが理にかなっていると思われる場合は、投票の変更を検討してください。
royfripple 2017年

ありがとうございました。物事がより明確になり、反対票が取り消されました
Done Data Solutions

どういたしまして!また、時間を割いて再度ご確認いただきありがとうございます。
royfripple 2017年

2

私は同じ問題に直面していて、以下の簡単な手順を使用してそれを解決しました:

1)GoogleからInstallCert.javaをダウンロードします

2)javac InstallCert.javaを使用してコンパイルします

3)ホスト名とhttpsポートを指定して、java InstallCert.javaを使用してInstallCert.javaを実行し、入力を要求するときに「1」を押します。「localhost」を信頼できるキーストアとして追加し、「jssecacerts」という名前のファイルを次のように生成します。

java InstallCert localhost:443

4)jssecacertsを$ JAVA_HOME / jre / lib / securityフォルダーにコピーします

ここで問題を解決するための主な情報源は次のとおりです。

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


1

証明書をpkcs12ストアからcacertsキーストアにインポートすることにより、Java 8を搭載したWindows Server 2016でこの問題を解決しました。

:PKCS12ストアへのパス
C:\Apps\pkcs12.pfx

のJavaのcacertsへのパス:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

キーツールへのパス:
C:\Program Files\Java\jre1.8.0_151\bin

から輸入証明書にコマンドプロンプト(管理者など)、コマンドでのkeytoolでフォルダにpossitioningした後pkcs12cacerts次のとおりである
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.ターゲットキーストアのパスワードを入力してください(cacertsパスワード、デフォルトは「changeit」)
2.ソースキーストアのパスワード(pkcs12パスワード)を入力します


変更を有効にするには、サーバーマシンを再起動します(または単にJVMを再起動します)。


1
私はMacでこのアプローチを使用しましたが、うまくいきました。もちろん、証明書は自己署名されて生成されました。Windowsのadfsサーバーで生成した.pfxファイルをインポートしました。アプリでのJava 10の使用ありがとう
Shashikant Soni

0

ここで通常、この種の例外は、信頼できる証明書のPATHに不一致がある場合に発生します。安全な通信のためにこのサーバー証明書が必要な構成またはパスを確認してください。


証明書をインストールできる正確な構成を教えてください。実際、これに関して問題があり、keytoolを使用してこの問題に関する証明書をインストールしました。これは約20〜30分間機能し、サーバーは同じエラーを再度発行します。私を助けてください。私はこの問題に2日間行き詰まっています。
Deepak Gangore 2014年

証明書は20〜30分ごとに変更されると思います
Vishwanath gowda k '29

私は同様の問題に直面していますが、問題は次のとおりです:MY javaはJavaアプリケーションの$ JAVA_HOME / lib / security / cacertsのデフォルトの場所を選択しますが、-Djavax.net.ssl.trustStore = / myapp / app.jksを指定しました:この上 stackoverflow.com/questions/33821785/...
Laxman G

0

私にとっては、フィドラーをバックグラウンドで実行していて、証明書をめちゃくちゃにしていたため、証明書エラーがポップアップしました。それはプロキシとして機能するので、その近くでEclipseを再起動します。


すべてのアプリケーションを閉じた後でも、同じ問題がeclipseで発生します
arvindwill

0

目標:

  1. https接続を使用する
  2. SSLチェーンを確認する
  3. cacertsを扱わない
  4. 実行時に証明書を追加する
  5. cacertsから証明書を失わないでください

どうやってするの:

  1. 独自のキーストアを定義する
  2. 証明書をキーストアに入れる
  3. SSLのデフォルトコンテキストをカスタムクラスで再定義する
  4. ???
  5. 利益

私のキーストアラッパーファイル:

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

このクラスは、必要に応じてキーストアを作成し、その内部で証明書を管理できるようになります。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;
    }
}

許可されるdefaultSSLコンテキストは1つだけであるため、このクラスはシングルトンとして作成されました。だから、今の使い方:

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

おそらく、この設定では機能しないでしょう。証明書ファイルをリソースフォルダー内に保持しているため、パスが絶対パスではないためです。しかし、一般的に、それは完全に動作します。


1
この二重の誤用は、available()Javadocで特に警告されています。
ローン侯爵

0

回答https://stackoverflow.com/a/36427118/1491414への追加です。ありがとう@MagGGG

  • 管理者権限があることを確認してください
  • キーストアパス(-keystore C:\ Program Files(x86)\ Java \ jre1.6.0_22 \ lib \ security \ cacerts ")には二重引用符を使用してください。WindowsOSでは、デフォルトのインストール場所はProgram Filesであり、プログラムファイル間のスペースのため、エラー。

0

私は以下の方法を使用してこれを修正しました-

  1. 接続に問題があるURLをコピー
  2. Android Studio-> Settings-> Http settingsに移動します
  3. 「テスト接続」で、そのURLを貼り付けて「OK」を押します
  4. [OK]をクリックすると、Android StudioはそのURLの証明書をインポートするように求め、インポートします
  5. それでおしまい。他に何もする必要がなく、私の問題はなくなりました。スタジオを再起動する必要もありません。

0

アトラシアンソフトウェアexで上記のエラーが発生した場合。ジラ

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

信頼できるキーストアに証明書を追加できます(missing_caを適切な証明書名に変更します)。

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

パスワードを求められたら changeitして確認しますy

その後、単にjiraを再起動します。


0

リポジトリURLがHTTPでも機能し、セキュリティが問題にならない場合は、settings.xmlにアクセスして(多くの場合、常にではない%USERPROFILE%/.m2)、HTTPSをHTTP置き換え<repository><pluginRepository> URLのます。

たとえば、これ:

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

これで置き換える必要があります:

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

0

argを渡して、JREではなく自分のトラストストアを使用していました。 -Djavax.net.ssl.trustStore=

トラストストアの証明書に関係なく、このエラーが発生していました。私にとっての問題は、arg行で渡されるプロパティの順序でした。私が入れたとき-Djavax.net.ssl.trustStore=-Djavax.net.ssl.trustStorePassword= -Dspring.config.location=-jar引数をiが成功裏にHTTPSを介して、私の残りの通話呼び出しができました。


0

CloudFoundryを使用していて証明書の問題が発生した場合は、証明書が含まれているkeystore-serviceを使用してjarを再度プッシュする必要があります。単にバインド解除し、バインドして再起動するだけでは機能しません。


0

ホストがファイアウォール/プロキシの背後にある場合は、cmdで次のコマンドを使用します。

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

交換する<proxy_hostname><proxy_port>設定されているHTTPプロキシサーバと。交換する<remote_host_name:remote_ssl_port>認証の問題があるリモートホスト(基本的にはurl)とポートのいずれかにます。

印刷された最後の証明書の内容を取り、それをコピーします(開始証明書と終了証明書もコピーします)。それをテキストファイルに貼り付け、.crt 拡張子を付けます。ここで、java keytoolコマンドを使用してこの証明書をcacertsにインポートすると、機能するはずです。

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


0

Javaアプリケーションが別のアプリケーション/サイトと通信しようとしているときにLinuxコンテナーでこの問題が発生する場合は、証明書がロードバランサーに正しくインポートされていないことが原因です。証明書をインポートするための一連の手順があり、正しく実行されない場合、次のような問題が表示されます

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

証明書が正しくインポートされたら、それを実行する必要があります。JDK証明書をいじる必要はありません。


0

私はそれを解くのIntelliJアイデア あなたが表示されます、私のためのソリューションは、あなたのプロジェクトをクリックし.RIGHTた私はproblem.Iを解決するための場所の多くを変更する、私はこの問題Althouhに直面してMavenをそのキーを押した後、ソースとアップデートフォルダを生成し、再度インポートを ここに画像の説明を入力してください

されております。


0

私は同じ問題に直面していました、私は8.1.0-3を使用していましたが、後で9.2.1-0を使用し、手動の手順なしで問題が修正されました。自己署名証明書は正常に機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.