私は、自分の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"
しかし、成功しませんでした。以下は、twittersを取得する手順です。
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
1。 firefoxブラウザーのURLに移動し、HTTPS証明書チェーン(URLアドレスの横)をクリックします。 "more info"をクリック> "セキュリティ"> 「証明書を表示」> "詳細"> "エクスポート。."
。 名前を取得し、ファイルタイプのexample.cerを選択します。 これでキーストアにファイルがあり、それをJVMに追加する必要があります。
2。 サケルトファイルの場所を決定します。
C:\ Program Files(x86)\ Java \ jre1.6.0_22 \ lib \ security \ cacerts。
。
3。 次に、コマンドラインのカセルに example.cer
ファイルをインポートします。
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。
私のJava 6インストールを新しいtwitter cert'sで動作させるためにcertファイルを構築しようと何時間も試した後、私はついに、あるメッセージボードのコメントに埋もれた信じられないほど簡単な解決策につまずいたのです。Java 7のインストールからcacertsファイルをコピーして、Java 6のインストールにあるものを上書きするだけです。おそらく、最初にcacertsファイルのバックアップを作成するのがベストですが、その後、新しいものをコピーするだけで、すぐに動作するようになります。
なお、私は実際にWindowsのcacertsファイルをLinuxのインストールにコピーしましたが、問題なく動作しました。
このファイルは、古い Java jdk と新しい Java jdk の両方において、jre/lib/security/cacerts
に配置されています。
これで誰かの悩みの種が減ることを祈っています。
MY UIアプローチ:
1。 http://www.keystore-explorer.org/をダウンロードしてください。 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にすることができます)を入力します。
特に自動生成された証明書は、公式のものと違ってかなり厄介で、Javaはあまり好まないのですが、この問題を解決するために何時間も研究しました。
以下のリンク先をご確認ください。Javaにおける証明書に関する問題の解決をご覧ください。
基本的には、サーバーから取得した証明書をJavaホームの証明書に追加する必要があります。
1.証明書を生成または取得し、Servers.xmlでそれを使用するようにTomcatを設定する。
2.クラス InstallCert
の Java ソースコードをダウンロードし、サーバーの実行中に以下の引数 server[:port]
を与えて実行します。Java証明書では元のパスワードが機能するため、パスワードは不要です("changeit")。
3.3. プログラムはサーバーに接続し、Javaは例外を投げます。サーバーが提供する証明書を分析し、プログラムを実行したディレクトリに jssecerts
ファイルを作成することができます (Eclipse から実行した場合は、Run -> Configurations
で作業ディレクトリを構成してください).
4.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);
}
}
}
1。 証明書を確認してください。 ------------------------------------------------- -------------------------------。
ブラウザでターゲットURLをロードして、サイトの証明書を表示してみてください(通常、ロックサインのあるアイコンからアクセスできます)。 有効期限が切れているか、他の理由で信頼されていないかに関係なく、ブラウザのアドレスバーの左側または右側にあります。
2。 JREおよびJDKの最新バージョンをインストールします。 -------------------------------------------------- ---------。 新しいバージョンには通常、信頼できる証明書の更新されたセットが付属しています。
また、可能であれば、古いバージョンをアンインストールします。 これにより、誤構成エラーが明示されます。
3。 構成を確認してください。
4。 新しいJavaバージョンからキーストア全体をコピーします。 -------------------------------------------------- -。
利用可能な最新のもの以外のJDKで開発する場合- %JAVA_HOME%/ jre / lib / security / cacerts
ファイルを、@ jeremyとしてインストールされた最新のJREの新しいファイルに置き換える(最初にバックアップコピーを作成する) -goodellは彼の回答で示唆しています。
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:チェーン内のすべての証明書について、サイトの証明書に対してこれを繰り返す必要がある場合があります。 ルート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
私のシステムにはJDKとJRE 1.8.0_112の両方が存在していたときに、少し異なる状況がありました。
新しいCA証明書を、既知のコマンドを使用して [JDK_FOLDER] \ jre \ lib \ security \ cacerts
にインポートしました。
keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>
それでも、同じ PKIXパス構築に失敗したエラーを取得し続けました。
java -Djavax.net.debug = allを使用して、デバッグ情報をjava CLIに追加しました。 ... > debug.log
。 debug.logファイルでは、 trustStoreで始まる行は次のとおりです。実際には、 [JRE_FOLDER] \ lib \ security \ cacerts
にあるcacertsストアを指しています。
私の場合、解決策は、JREが使用したカセルファイル(新しいCAが追加された)をJREが使用したファイルよりもコピーして、問題を修正することでした。
問題の背景:。
プロジェクトでmvn clean installを実行しようとしたとき、およびNetbeans IDEのクリーンアンドビルドオプションを実行しようとしたときに、次のエラーが発生していました。 この問題は、NET bean IDE / throughコマンドプロンプトからダウンロードしたが、ブラウザからファイルをダウンロードできる場合は、証明書が利用できないためです。
エラー:
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->にURLを入力します。 https://url/local-repo。 (私の場合、このURLには信頼できない証明書がありました。。)。 -証明書のエラーをクリックして証明書をダウンロード->証明書を表示します。 -[詳細]タブを選択->ファイルにコピー->次-> [DERエンコードされたバイナリX.509(.CER)]を選択します。 -証明書をいくつかの場所に保存します。例:c:/user/sheldon/desktop/product.cer。 -おめでとうございます。! サイトの証明書をダウンロードしました。
2。 次に、キーストアをインストールして問題を修正します。。
-keytoolコマンドを実行して、ダウンロードしたキーストアを追加します。 既存の証明書ファイル。 -コマンド:jdkのbinフォルダー(JAVA_HOME)のコマンドの下。
C:\ Program Files \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file。 "C:/user/sheldon/desktop/product.cer" -エイリアスproduct -keystore。 「C:/ Program Files / Java / jdk1.8.0_141 / jre / lib / security / cacerts」。
-パスワードの入力を求められます。 keystoreパスワードを入力: 「この証明書を信頼してください」に再度「changeit」と入力します? [いいえ]: "、入力します。 "はい"。
コマンドラインコマンド/出力のサンプル:
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」エラーを取り除く必要があります。
smtp.gmail.comの証明書をインポートしたかった。
私のために働いた唯一の解決策はです。 1。 この証明書を表示するには、コマンドを入力します。
D:\ openssl \ bin \ openssl.exe s_client -connect smtp.gmail.com:465。
2。 "----- BEGIN CERTIFICATE -----"と "----- END CERTIFICATE -----"の間の行をコピーしてファイルgmail.cerに保存します。
3。 実行します。
keytool -import -alias smtp.gmail.com -keystore。 "%JAVA_HOME%/ jre / lib / security / cacerts" -ファイル。 C:\ Users \ Admin \ Desktop \ gmail.cer。
4。 パスワードを入力します。 chageit。
5。 [はい]をクリックして証明書をインポートします。
6。 ジャバを再起動します。
コマンドを実行すると、問題ありません。
理由は、JDKが信頼できるCertificate Authority(CA)証明書を「cacerts」と呼ばれるファイルにバンドルされていることですが、このファイルには自己署名証明書の手がかりがありません。 つまり、cacertsファイルには自己署名証明書がインポートされていないため、信頼できるエンティティとして扱われないため、上記のエラーが発生します。
上記のエラーを修正するために必要なのは、自己署名証明書をcacertsファイルにインポートすることだけです。
まず、cacertsファイルを見つけます。 JDKの場所を確認する必要があります。 EclipseやIntelliJ IdeaなどのIDEのいずれかを介してアプリケーションを実行している場合は、プロジェクトの設定に移動して、JDKの場所を確認してください。 たとえば、Mac OSの場合、cacertsファイルの一般的な場所はこの場所にあります/ Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security。 ウィンドウのマシンでは、{{Installation_directory}} / {JDK_version}} / jre / lib / securityの下にあります。
cacertsファイルを見つけたら、今度は自己署名証明書をこのcacertsファイルにインポートする必要があります。 自己署名証明書を正しく生成する方法がわからない場合は、最後の記事を確認してください。
証明書ファイル(.crt)がなく、.jksファイルしかない場合は、以下のコマンドを使用して.crtファイルを生成できます。 .crt / .pemファイルを既にお持ちの場合は、以下のコマンドを無視できます。
keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt
上記のステップでは、selfsigned.crtと呼ばれるファイルが生成されます。次に、証明書をcacertsにインポートします。
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ハンドシェイクの例外が発生する場合。 おそらく、別のドメインを使用して、証明書に登録していることを意味します。
リンク[詳細な説明と段階的な解決策を含む]はこちらです。]1。
これはTwitter固有の回答ではありませんが、このエラーを検索するときに出てくる質問です。 Webブラウザーで表示されたときに有効な証明書があるように見えるWebサイトに接続するときにシステムがこのエラーを受信している場合、これはおそらくそのWebサイトに不完全な証明書チェーンがある**を意味します。
問題の簡単な要約:証明書当局は、ルート証明書を使用して古い証明書のみに署名しません。 代わりに、(通常)Certificate Authorityフラグが設定されている(つまり、証明書に署名することが許可されている)_intermediate_証明書に署名します。 次に、CAから証明書を購入すると、これらの中間証明書の1つでCSRに署名します。
Javaトラストストアには、ルート証明書しかなく、中間ストアはありません。
設定を間違えたサイトは、署名された証明書を_just_返す可能性があります。 問題:それはあなたの信託店にない中間証明書で署名されました。 ブラウザは、キャッシュされた中間証明書をダウンロードまたは使用してこの問題を処理します。これにより、Webサイトの互換性が最大化されます。 ただし、JavaやOpenSSLなどのツールはそうではありません。 そして、それは問題のエラーを引き起こします。
Qualys SSL Testを使用して、この疑惑を確認できます。 あなたがそれをサイトに対して実行し、それが言うなら。
このサーバーの証明書チェーンは不完全です。
その後、それが確認します。 また、認証パスを見て、テキスト_Extra Download_を表示することで、これを見ることができます。
修正方法:サーバー管理者は、中間証明書も返すようにWebサーバーを構成する必要があります。 たとえば、コモドの場合、これは「.ca-bundle」ファイルが役立つ場所です。 たとえば、mod_sslを使用したApache構成では、「SSLCertificateChainFile」構成設定を使用します。 nginxの場合、中間証明書と署名された証明書を連結し、SSL証明書構成で使用する必要があります。 詳細については、オンラインで「不完全な証明書チェーン」を検索してください。
Cucumber-Eclipseプラグインを更新サイトを介して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が次のとおりであることです。
ただし、ブラウザ経由でナビゲートすると、リダイレクトされます(追加された "。github "に注意してください)。
したがって、解決策は、日食に更新サイトを追加するときに、リダイレクトされたバージョンの更新サイトURLを使用するだけです。
私は同じ問題に直面しており、以下の簡単な手順を使用して解決しました。
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。
これは解決策ですが、この問題についての私の話の形で:
上記のすべての解決策を試して(3日間)ほとんど死んでいて、何もうまくいきませんでした。
私はすべての希望を失った。
私は代理人の背後にいて、彼らが最近セキュリティポリシーを更新したと彼らが言ったので、私はこれについて私のセキュリティチームに連絡しました。
私は開発者に知らせなかったために彼らをひどく ⁇ った。
その後、すべての証明書を含む新しい「cacerts」ファイルを発行しました。
%JAVA_HOME%/ jre / lib / security内に存在するcacertsファイルを削除したところ、問題が解決しました。
したがって、この問題に直面している場合は、このようなネットワークチームからの問題である可能性があります。
回答https://stackoverflow.com/a/36427118/1491414に追加されます。 @MagGGGに感謝します。
-管理者の許可があることを確認してください。 -Windows OSではデフォルトのインストール場所がプログラムファイルであり、プログラムファイルであるため、キーストアパス(-keystore C:\ Program Files(x86)\ Java \ jre1.6.0_22 \ lib \ security \ cacerts)には二重引用符を使用してください。プログラムファイル間のスペースによりエラーが発生します。
以下の方法を使用してこれを修正しました-。
1。 接続の問題があるURLをコピーします。 2。 Android Studio-> Settings-> Http設定に移動します。 3。 [テスト接続]で、URLを貼り付けて、okを押します。 4。 [OK]をクリックすると、Android Studioはその証明書をインポートするように求められます。 url、インポートします。 5。 それでおしまい。 他に何もする必要がなく、私の問題はなくなりました。 する必要はありません。 スタジオも再開します。
上記のアトラシアンソフトウェアのエラーがある場合。 ジラ。
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 '[email protected]' 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」を確認します。
その後、単にジラを再起動します。