javax.net.ssl.SSLHandshakeExceptionの解決:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しましたエラー?


426

編集:-私のブログで質問と受け入れられた回答をより見やすい方法でフォーマットしようとしました

これが元の問題です。

このエラーが発生しています:

詳細メッセージsun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:
sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません

原因javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません

Tomcat 6をWebサーバーとして使用しています。2つのHTTPS Webアプリケーションが異なるTomcatの異なるポートにインストールされていますが、同じマシン上にあります。言ってやるApp1(port 8443)App2(port 443)App1に接続しApp2ます。にApp1接続するApp2と、上記のエラーが発生します。これは非常に一般的なエラーであるため、さまざまなフォーラムやサイトで多くの解決策を見つけました。私はserver.xml両方のTomcatの以下のエントリを持っています:

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

すべてのサイトが、app2によって提供された証明書がapp1 jvmの信頼できるストアにないという同じ理由を述べています。これは、IEブラウザーで同じURLにアクセスしようとしたときにも当てはまるようです。これは機能します(温暖化により、このWebサイトのセキュリティ証明書に問題があります。ここでは、このWebサイトに進みます)。しかし、同じURLがJavaクライアントによってヒットされると(私の場合)、上記のエラーが発生します。したがって、トラストストアに配置するために、次の3つのオプションを試しました。

オプション1

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

Option2 環境変数の以下の設定

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

Option3 環境変数の以下の設定

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

しかし、何もうまくいきませんでした

Apache HttpClientを使用して無効なSSL証明書を処理 する方法」で提案されているJavaアプローチを実行すると、最終的に何が機能しますか?Pascal Thiventによって、つまりプログラムInstallCertを実行します。

しかし、このアプローチはdevboxのセットアップには問題ありませんが、実稼働環境では使用できません。

3つのアプローチは、上記の理由を私は疑問に思って私は同じ値を記載している時に仕事をしませんでしたserver.xmlapp2設定でトラストストアに、サーバーと同じ値

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

app1プログラム。

詳細については、これが私がどのように接続するかです:

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

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

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

  reply.load(conn1.getInputStream());


残念ながら、個別にSSLの問題がなかったクラスター化されたサーバー間で通信するときに、このエラーが発生しました。domainnameRHELサーバーを適切に設定すると、問題はなくなりました。それが誰かを助けることを願っています。
DavidG 2014年

チェックすべきもう1つのことは、Javaの最新バージョンを使用していることです。これが原因で同様のエラーが発生しました。
Redzarf 2016年

stackoverflow.com/questions/2893819/…-関連性があり、素晴らしい答えでもあります。
シッダールタ

回答:


406

App2の証明書を、使用されているJVMのトラストストアファイルに追加する必要があります%JAVA_HOME%\lib\security\cacerts

最初に、次のコマンドを実行して、証明書がトラストストアにすでにあるかどうかを確認できます keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(パスワードを入力する必要はありません)。

証明書がない場合は、ブラウザーでダウンロードして取得し、次のコマンドでトラストストアに追加できます。

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

インポート後、最初のコマンドを再度実行して、証明書が追加されたかどうかを確認できます。

Sun / Oracleの情報はこちらにあります


6
フルパスを使用する必要があります。例:c:\ java \ jdk \ lib \ security \ cacerts
SimonSez

48
SimonSezが言ったように、パスワードは必要ありませんが、必要な場合、デフォルトのパスワードは「changeit」です。
Felix

16
また、Windowsでは端末を管理者として実行する必要があります。そうしないとkeytool error: java.io.FileNotFoundException ... (Access is denied)、証明書をインポートしようとするとエラーが発生します。
Felix

2
ああ@SimonSezあなたは私の神です。しかし、それに追加するには、それを機能させるために@M Sachによって言及されているように、トラストストアの場所とパスワードを指定する必要があります。
BudsNanKis 2013年

2
Java 1.8で引き続き問題が発生します。説明されているように証明書を追加し、Java <1.8を使用する必要がありました
Tom Howard

180

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません

•エラーが発生したとき、式の意味をGoogleで調べてみたところ、この問題はサーバーがHTTPS SSL証明書を変更し、旧バージョンのJavaがルート認証局(CA)を認識しない場合に発生します。

•ブラウザでHTTPS URLにアクセスできる場合は、Javaを更新してルートCAを認識できます。

•ブラウザで、JavaがアクセスできなかったHTTPS URLにアクセスします。HTTPS証明書チェーン(Internet Explorerにはロックアイコンがあります)をクリックし、ロックをクリックして証明書を表示します。

•証明書の「詳細」と「ファイルにコピー」に移動します。Base64(.cer)形式でコピーします。デスクトップに保存されます。

•すべてのアラートを無視して証明書をインストールします。

•これが、アクセスしようとしたURLの証明書情報を収集する方法です。

次に、証明書を認識するようにJavaバージョンを作成して、URLの認識を拒否しないようにする必要がありました。この点で、ルート証明書情報はデフォルトでJDKの\ jre \ lib \ securityの場所に残り、アクセスするためのデフォルトのパスワードはchangeitであることをグーグルアウトしたことを言及する必要があり ます

cacerts情報を表示するには、次の手順に従います。

•[スタート]ボタンをクリック-> [実行]

•cmdと入力します。コマンドプロンプトが開きます(管理者として開く必要がある場合があります)。

Java/jreX/binディレクトリに移動します

•次のように入力します

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

キーストア内に含まれている現在の証明書のリストが表示されます。次のようになります。

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

キーストアのパスワードを入力してください:changeit

キーストアタイプ:jks

キーストアプロバイダー:SUN

キーストアには44エントリが含まれています

verisignclass3g2ca、2004年3月26日、trustedCertEntry、

証明書のフィンガープリント(MD5):A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9

entrustclientca、2003年1月9日、trustedCertEntry、

証明書のフィンガープリント(MD5):0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4

thawtepersonalbasicca、1999年2月13日、trustedCertEntry、

証明書のフィンガープリント(MD5):E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41

addtrustclass1ca、2006年5月1日、trustedCertEntry、

証明書のフィンガープリント(MD5):1E:42:95:02:33:92:6B:B9:5F:C0:7F:DA:D6:B2:4B:FC

verisignclass2g3ca、2004年3月26日、trustedCertEntry、

証明書のフィンガープリント(MD5):F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6

•次に、以前にインストールした証明書をcacertsに含める必要がありました。

•このための手順は次のとおりです。

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

Java 7を使用している場合:

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

•次に、証明書情報をcacertファイルに追加します。

上記の例外に対して私が見つけた解決策です!!


5
証明書の有効期限が切れたらどうしますか?すべて(毎年)を繰り返しますか?
ggkmath

7
これをプログラムで行う方法はありますか?
メシュラムシルク

1
PKIXエラー「パスがどのトラストアンカーともチェーンしない」を扱っている人々にとって、この解決策は残念ながら私にとってその問題を解決しませんでした。
IcedD​​ante 2014年

3
1つの質問-aliasNameは、証明書をインポートするWebアドレスですか?たとえば、URLがdomain.site.com/pages/service.asmxの場合、エイリアスはdomain.site.comまたは完全なURL(domain.site.com/pages/service.asmx)にするか、プレフィックスとしてhttpを付ける必要があります://それは単なる任意の名前ですか?
nanosoft、2014

1
path:\ lib \ security> keytool -import -noprompt -trustcacerts -alias webCert -file webCertResource.cer -keystore c:/ Users / Jackie / Desktop -storepass changeit「システムが指定されたファイルを見つけられない」
Jesse

46

Tomcat 7での作業方法

Tomcatアプリで自己署名証明書をサポートしたいのですが、次のスニペットが機能しませんでした

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

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

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

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

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

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

これは私の問題を解決したものです:

1).crtファイルをダウンロードする

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • 置き換え<your domain>ドメインで(例えばjossef.com

2).crtJavaのcacerts証明書ストアにファイルを適用します

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • 置き換え<your domain>ドメインで(例えばjossef.com
  • <JAVA HOME>あなたのJavaホームディレクトリに置き換えてください

3)ハックする

iv'eがJavaデフォルトの証明書ストアに証明書をインストールした場合でも、Tomcatはそれを無視します(Javaのデフォルトの証明書ストアを使用するように構成されていないようです)。

これをハックするには、次のコードのどこかに追加します。

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

// ...

4
ステップ2は、SpringBootとTomcat 7を使用して私にトリックをもたらしました。ありがとうございます。
Tim Perry

1つのサーバーに多くのJavaを
インストール

@vikiforはい。システムにインストールされているすべてのJava
ディレクトリ

1
これはうまくいきました!このような便利な答えを提供してくれた@JossefHarushに感謝します。
トムテイラー

1
@Jossef Harushのコードセグメントをコードに追加した後、私の問題は解決しました。
Chamod Pathirana

10

私の場合の問題は、WebサーバーがルートCAではなく、証明書と中間CAのみを送信していたことでした。このJVMオプションを追加すると、問題が解決しました。-Dcom.sun.security.enableAIAcaIssuers=true

Authority Information Access拡張機能のcaIssuersアクセスメソッドのサポートが利用可能です。互換性のためにデフォルトでは無効になっており、システムプロパティcom.sun.security.enableAIAcaIssuersを値trueに設定することで有効にできます。

trueに設定されている場合、CertPathBuilderのSunのPKIX実装は、証明書のAIA拡張の情報(指定されたCertStoreに加えて)を使用して、発行されたCA証明書を検索します(それがタイプldap、http、またはftpのURIである場合)。

ソース


これは実際に私の問題を解決しました、ありがとう!
ルイス・シルバ

6

もう1つの理由は、古いバージョンのJDKである可能性があります。jdkバージョン1.8.0_60を使用していましたが、最新バージョンに更新するだけで証明書の問題が解決しました。


2
私も同じ問題を抱えていました。Lets Encrypt証明書を使用してAPIを呼び出すと、信頼できるルート証明機関によって認識されないため、古いバージョンのJavaでは機能しない場合があります。Javaを更新すると、この問題が解決します。
hertg 2018

5

cacertsファイルは完全に空でした。これを解決するには、cacertsファイルをWindowsマシン(Oracle Java 7を使用している)からコピーし、それをLinuxボックス(OpenJDK)にscpしました。

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

そしてLinuxマシン上で

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

これまでのところうまくいきました。


1
最新の証明書を持たない古いバージョンのJavaを使用していることが問題である場合、これは素晴らしい働きをします。
atripathi 14

@atripathi Macはどうですか?
iOSAndroidWindowsMo​​bileAppsDev 2017

cacertsファイルが空の場合、Javaインストールに深刻な問題がありました。すべてを再インストールする必要があります。
ローン侯爵

おそらく、しかし、この解決策は機能し、その後何も問題はありませんでした。
ライアン

5

私にとって、SSLを処理していたNGINXリバースプロキシの背後にあるプロセスに接続しようとしたときに、このエラーも表示されました。

問題は、証明書チェーン全体が連結されていない証明書であることが判明しました。中間証明書を追加したところ、問題は解決しました。

お役に立てれば。


それは私が持っているもののように見えます。中間証明書を追加した方法と場所を説明できますか。NGINXではなく、httpdのリバースプロキシを使用しています。
Asaf Magen

これは私の場合、httpd:access.redhat.com/solutions/43575
Asaf Magen

nginxでは、SSL構成に.keyおよび.pemファイルのみを使用します。最初に.crtを.pemに変換し(単純に:cp yourfile.crt yourfile.pem)、次にSSL証明書チェーンの場合:.cerファイルを.pemの最後に追加します(cat yourfile.cer >> yourfile.pem)
ThếAnhNguyễn19年

5

LinuxでTomcat 7を使用して、これでうまくいきました。

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

Linuxでは、$JAVA_HOME常に設定されていないが、通常/etc/alternatives/jreを指し$JAVA_HOME/jre


5

以下のコードは私にとってはうまくいきます:

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

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

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

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

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

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

             conn.setSSLSocketFactory(sc.getSocketFactory());

5
このコードは完全に安全ではないため、使用しないでください。
ローン侯爵

@ user207421なぜ安全でないのですか?コードで簡単に何が起こっているか。
Govinda Sakhare

これにより、すべての証明書の検証がスキップされます。基本的には、任意の証明書を受け入れることができます。証明書が機能する方法は、さまざまな証明機関に(文字通り)物理的に保護されたルート証明書があることです。この証明書は、他のセカンダリ証明書を発行するために使用されます。セカンダリ証明書は、ルート証明機関までさかのぼって検証できます。これはすべての上流チェックをスキップします。つまり、URLとしてのIDが検証されていなくても、任意のssl証明書(自己生成であっても)を送信でき、アプリケーションはそれを安全として受け入れます。
スコットテイラー

4

jdk1.8.0_171同じ問題が発生したときに使用していました。私はここでトップ2のソリューションを試しました(keytoolを使用して証明書を追加し、ハッキングされている別のソリューションを追加しました)が、私にはうまくいきませんでした。

私はJDKをにアップグレードしましたが1.8.0_181、それは魅力のように機能しました。


2

私は小さなwin32(WinXP 32ビットtestet)の愚かなcmd(コマンドライン)スクリプトを記述しました。このスクリプトは、プログラムファイル内のすべてのJavaバージョンを探し、それらに証明書を追加します。パスワードはデフォルトの「changeit」にするか、スクリプトで自分で変更する必要があります:-)

@echo off

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

pause

2

以下のMacOS Xの場合、「importcert」オプションでダブルハイフンを使用する必要があった、正確に機能するコマンドを以下に示します。

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

2

私にとって、この投稿から認識された解決策は機能しませんでした:https : //stackoverflow.com/a/9619478/4507034

代わりに、自分のマシンの信頼できる証明書に証明書をインポートすることで問題を解決することができました。

手順:

  1. https://localhost:8443/yourpath認定が機能していないURL(など)にアクセスします。
  2. 前述の投稿の説明に従って、証明書をエクスポートします。
  3. Windowsマシンで次を開きます。 Manage computer certificates
  4. 移動Trusted Root Certification Authorities->Certificates
  5. ここにyour_certification_name.cerファイルをインポートします。

1

Ubuntuサーバーで実行されているTomcatの場合、使用されているJavaを確認するには、「ps -ef | grep tomcat」コマンドを使用します。

サンプル:

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

次に、次の場所に移動します。cd/usr/local/java/jdk1.7.0_15/jre/lib/security

デフォルトのcacertsファイルはここにあります。そこに信頼されていない証明書を挿入します。


1

安全のため、実装では自己署名証明書を使用しないでください。ただし、開発に関しては、自己署名証明書を取得したトライアル環境を使用する必要があります。プログラムでこの問題をコードで修正しようとしましたが、失敗しました。ただし、証明書をjreトラストストアに追加することで問題が解決しました。以下の手順を見つけてください、

  1. サイト証明書をダウンロードし、

  2. 証明書(ex:cert_file.cer)をディレクトリ$ JAVA_HOME \ Jre \ Lib \ Securityにコピーします

  3. AdministratorでCMDを開き、ディレクトリを$ JAVA_HOME \ Jre \ Lib \ Securityに変更します

  4. 以下のコマンドを使用して、証明書をトラストストアにインポートします。

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

keytoolが認識できないというエラーが発生した場合は、こちらを参照してください。

以下のように「はい」と入力します

この証明書を信頼する:[はい]

  1. 次に、コードを実行するか、Javaを使用してプログラムでURLにアクセスします。

更新

アプリサーバーがjbossの場合は、以下のシステムプロパティを追加してみてください

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

お役に立てれば!


1

展開可能なソリューション(Alpine Linux)

アプリケーション環境でこの問題を修正できるように、次のようにLinux端末コマンドを用意しています。

cd ~

ホームディレクトリに証明書ファイルを生成します。

apk add openssl

このコマンドは、高山Linuxにopensslをインストールします。他のLinuxディストリビューション用の適切なコマンドを見つけることができます。

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

必要な証明書ファイルを生成しました。

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

生成されたファイルをプログラム 'keytool'を使用してJREに適用しました。

注: DNSを次のものに置き換えてください<host-dns-ssl-belongs>

注2:-nopromptは確認メッセージを表示しない(yes / no)-storepass changeitことに注意してください。パラメーターはパスワードプロンプトを無効にし、必要なパスワードを提供します(デフォルトは 'changeit')。これら2つのプロパティにより、Dockerイメージの構築などのアプリケーション環境でこれらのスクリプトを使用できます。

注3 Docker経由でアプリをデプロイする場合は、シークレットファイルを一度生成して、アプリケーションプロジェクトファイルに配置できます。何度も生成する必要はありません。


0

私にもこの問題があります。

SSL証明書を.keystoreに追加してほとんどすべてを試しましたが、Java1_6_xでは機能しませんでした。私にとっては、Javaの新しいバージョンであるJava1_8_xをJVMとして使い始めると役に立ちました。


1
わたしも。Java 1.8.0_91から1.8.0_121へのアップデートで問題が解決しました。Apache HTTPClientを使用して例外を取得しました。
Devabc 2017

私はまだOauth2認証を使用してこの問題を抱えています
Sofiane

0

プロキシの背後にいるときにAndroid Studioでこの問題が発生していました。ビルド中にマッピングファイルをアップロードしようとするCrashlyticsを使用していました。

見つからないプロキシ証明書を次の場所にあるトラストストアに追加しました /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

次のコマンドで: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

たとえば、デフォルトのトラストストアのパスワード keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt


0

ほんの小さなハック。ファイル「hudson.model.UpdateCenter.xml」のURLをhttpsからhttpに更新します

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

0

QEMU環境でJavaでファイルをダウンロードする必要があるので、チャイムしたいと思います。それは判明/etc/ssl/certs/java/cacerts、それが一致しないため、QEMUでは問題がない/etc/ssl/certs/java/cacertsホスト環境で。ホスト環境は会社のプロキシの背後にあるため、Java cacertsはカスタマイズされたバージョンです。

QEMU環境を使用している場合は、ホストシステムが最初にファイルにアクセスできることを確認してください。たとえば、最初にこのスクリプトをホストマシンで試して確認できます。ホストマシンでスクリプトが正常に実行され、QEMUでは実行されない場合、私と同じ問題が発生しています。

この問題を解決するには、QEMUで元のファイルのバックアップを作成し、ホスト環境のファイルをQEMU chroot jailにコピーし、javaがQEMUでファイルを正常にダウンロードできるようにする必要がありました。

より良いソリューションは/etc、QEMU環境にマウントすることです。ただし、他のファイルがこのプロセスで影響を受けるかどうかはわかりません。だから私はこの醜いが簡単な回避策を使用することにしました。


0

これは、悪名高いPKIXエラーメッセージの別の考えられる理由を文書化するのに適した場所のようです。キーストアとトラストストアの内容とさまざまなJavaインストール構成を調べるのにあまりにも長い時間を費やした後、私の問題は...タイプミスにあることに気付きました。

タイプミスは、キーストアをトラストストアとしても使用していたことを意味しました。私の会社のルートCAは、キーストアのスタンドアロン証明書としてではなく、証明書チェーンの一部としてのみ定義されていたため、他の場所(cacerts)で定義されていなかったため、PKIXエラーが発生し続けました。

失敗したリリース(これは製品構成であり、他の場所では問題ありませんでした)と2日間の頭のスクラッチの後、ようやくタイプミスがわかりました。

これが誰かを助けることを願っています。


-1

これをコードに追加します。

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

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

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

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

1
このサイトでは、コードのみの回答は一般に嫌われています。回答を編集して、コードのコメントや説明を含めていただけませんか?説明では、次のような質問に答える必要があります。どうやってやるの?どこに行くの?OPの問題をどのように解決しますか?
mypetlion

1
あなたのコードにこれを追加 いいえ 、あなたのコードにこれを追加しないでください。この方法でSSLContextを作成すると、接続しているサーバーのIDを検証するすべてのセキュリティチェックが削除されます。キーを紛失するという問題に対する答えは、所有しているすべてのものからすべてのロックを削除することではありません
Andrew Henle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.