web-dev-qa-db-ja.com

Java:Sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません

https サーバからファイルをダウンロードするクラスがあります。実行すると、たくさんのエラーが返されます。証明書に問題があるようです。クライアントサーバー認証を無視することは可能ですか?もしそうなら、どうですか?

package com.da;

import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.nio.CharBuffer;
import Java.util.concurrent.Future;

import org.Apache.http.HttpResponse;
import org.Apache.http.client.utils.URIUtils;
import org.Apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.Apache.http.nio.IOControl;
import org.Apache.http.nio.client.HttpAsyncClient;
import org.Apache.http.nio.client.methods.AsyncCharConsumer;
import org.Apache.http.nio.client.methods.HttpAsyncGet;
import org.Apache.http.nio.client.methods.HttpAsyncPost;

public class RSDDownloadFile {
    static FileOutputStream fos;

    public void DownloadFile(String URI, String Request) throws Exception
    {
        Java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
                "Lang=EN&AuthToken=package", null);
        System.out.println("URI Query: " + uri.toString());

        HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
        httpclient.start();
        try {
            Future<Boolean> future = httpclient.execute(
                    new HttpAsyncGet(uri),
                    new ResponseCallback(), null);

            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("\nRequest successfully executed");
            } else {
                System.out.println("Request failed");
            }              
        } 
        catch(Exception e){
            System.out.println("[DownloadFile] Exception: " + e.getMessage());
        }
        finally {
            System.out.println("Shutting down");
            httpclient.shutdown();
        }
        System.out.println("Done");  

    }

    static class ResponseCallback extends AsyncCharConsumer<Boolean> {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Header: " + response.toString());
             try {   
                 //if(response.getStatusLine().getStatusCode()==200)
                     fos = new FileOutputStream( "Response.html" );
             }catch(Exception e){
                 System.out.println("[onResponseReceived] Exception: " + e.getMessage());
             }
        }

        @Override
        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
            try
            {
                while (buf.hasRemaining()) 
                {
                    //System.out.print(buf.get());
                    fos.write(buf.get());
                }
            }catch(Exception e)
            {
                System.out.println("[onCharReceived] Exception: " + e.getMessage());
            }
        }

        @Override
        protected void onCleanup() {
            try
            {             
                if(fos!=null)
                    fos.close();
            }catch(Exception e){
                System.out.println("[onCleanup] Exception: " + e.getMessage());         
            }
             System.out.println("onCleanup()");
        }

        @Override
        protected Boolean buildResult() {
            return Boolean.TRUE;
        }

    }
}

エラー:

URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.Apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.Sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
    at javax.net.ssl.SSLEngine.wrap(Unknown Source)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.Java:154)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.Java:276)
    at org.Apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.Java:79)
    at org.Apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.Java:161)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.Java:335)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.Java:315)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.Java:275)
    at org.Apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.Java:104)
    at org.Apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.Java:542)
    at Java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.Sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at com.Sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.Java:180)
    ... 9 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 com.Sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
    ... 16 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)
    ... 21 more
onCleanup()

[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
199
neztreh

サーバーに自己署名証明書があると問題が発生します。これを回避するには、この証明書をJVMの信頼できる証明書のリストに追加します。

この記事の中で authorはあなたのブラウザから証明書を取得し、それをあなたのJVMのcacertsファイルに追加する方法を説明しています。 Java_HOME/jre/lib/security/cacertsファイルを編集するか、-Djavax.net.ssl.trustStoreパラメータを付けてアプリケーションを実行することができます。どちらのJDK/JREを使用しているかも確認してください。混乱の原因になることがよくあります。

SSL証明書サーバー名はどのように解決されますか?/ keytoolを使用して代替名を追加できますか?Java.security.cert.CertificateException: No name matching localhost found例外が発生した場合.

181
Maxim Mazin

これが私にとってmacOS上で確実に機能するものです。 example.comと443を実際に接続しようとしている実際のホスト名とポートに置き換えて、カスタムエイリアスを指定してください。最初のコマンドは、提供された証明書をリモートサーバーからダウンロードしてx509形式でローカルに保存します。 2番目のコマンドは、保存された証明書をJavaのSSLトラストストアにロードします。

openssl x509 -in <(openssl s_client -connect example.com:443 -prexit 2>/dev/null) -out ~/example.crt
Sudo keytool -importcert -file ~/example.crt -alias example -keystore $(/usr/libexec/Java_home)/jre/lib/security/cacerts -storepass changeit
127

私はSymantecからの有効な署名されたワイルドカード証明書に関して同じ問題を抱えていました。

最初に-Djavax.net.debug = SSLを指定してJavaアプリケーションを実行し、実際に何が起こっているのかを確認してください。

中間証明書のインポートで終わり、証明書チェーンが壊れていました。

不足している中間証明書をsymantecからダウンロードしました(sslハンドシェイクログで、不足している証明書へのダウンロードリンクを確認できます: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer 私の場合)。 。

そして証明書をJavaキーストアにインポートしました。中間証明書をインポートした後、私のワイルドカードssl証明書がついに働き始めました。

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer
40
  1. Firefoxを使用してSSL証明書をエクスポートしてください。ブラウザでURLをクリックして証明書をエクスポートするオプションを選択すると、エクスポートできます。証明書ファイル名を your.ssl.server.name.crt とします。
  2. あなたのJRE_HOME/binまたはJDK/JRE/binに行きます
  3. コマンドを入力
  4. keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
  5. Javaプロセスを再起動します
34
Robin

からの引用「これ以上要求されたターゲットへの有効な証明書パスが見つかりません」

jSSEを使用してホストへのSSL接続を開こうとしたとき。これが通常意味するのは、サーバーがVerisignやGoDaddyなどのよく知られた商用認証局からの証明書ではなくテスト証明書(おそらくkeytoolを使用して生成された)を使用しているということです。この場合、Webブラウザに警告ダイアログが表示されますが、JSSEは対話型ユーザが存在すると想定できないため、デフォルトで例外をスローするだけです。

証明書の検証はSSLセキュリティの非常に重要な部分ですが、詳細を説明するためにこのエントリを書いていません。あなたが興味を持っているなら、あなたはウィキペディアの宣伝文句を読むことから始めることができます。あなたが本当にしたいのであれば、私はこの証明書でそのホストと話す簡単な方法を示すためにこのエントリを書いています。

基本的には、信頼できる証明書とともにサーバーの証明書をKeyStoreに追加します。

そこに提供されているコードを試してください。それは助けるかもしれません。

17
Nishant

@Gabe Martin-Dempesyさんの回答が助けられます。そして私はそれに関連した小さなスクリプトを書きました。使い方はとても簡単です。

ホストから証明書をインストールします。

> Sudo ./Java-cert-importer.sh example.com

既にインストールされている証明書を削除します。

> Sudo ./Java-cert-importer.sh example.com --delete

Java-cert-importer.sh

#!/usr/bin/env bash

# Exit on error
set -e

# Ensure script is running as root
if [ "$EUID" -ne 0 ]
  then echo "WARN: Please run as root (Sudo)"
  exit 1
fi

# Check required commands
command -v openssl >/dev/null 2>&1 || { echo "Required command 'openssl' not installed. Aborting." >&2; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo "Required command 'keytool' not installed. Aborting." >&2; exit 1; }

# Get command line args
Host=$1; port=${2:-443}; deleteCmd=${3:-${2}}

# Check Host argument
if [ ! ${Host} ]; then
cat << EOF
Please enter required parameter(s)

usage:  ./Java-cert-importer.sh <Host> [ <port> | default=443 ] [ -d | --delete ]

EOF
exit 1
fi;

if [ "$Java_HOME" ]; then
    javahome=${Java_HOME}
Elif [[ "$OSTYPE" == "linux-gnu" ]]; then # Linux
    javahome=$(readlink -f $(which Java) | sed "s:bin/Java::")
Elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS X
    javahome="$(/usr/libexec/Java_home)/jre"
fi

if [ ! "$javahome" ]; then
    echo "WARN: Java home cannot be found."
    exit 1
Elif [ ! -d "$javahome" ]; then
    echo "WARN: Detected Java home does not exists: $javahome"
    exit 1
fi

echo "Detected Java Home: $javahome"

# Set cacerts file path
cacertspath=${javahome}/lib/security/cacerts
cacertsbackup="${cacertspath}.$$.backup"

if ( [ "$deleteCmd" == "-d" ] || [ "$deleteCmd" == "--delete" ] ); then
    Sudo keytool -delete -alias ${Host} -keystore ${cacertspath} -storepass changeit
    echo "Certificate is deleted for ${Host}"
    exit 0
fi

# Get Host info from user
#read -p "Enter server Host (E.g. example.com) : " Host
#read -p "Enter server port (Default 443) : " port

# create temp file
tmpfile="/tmp/${Host}.$$.crt"

# Create Java cacerts backup file
cp ${cacertspath} ${cacertsbackup}

echo "Java CaCerts Backup: ${cacertsbackup}"

# Get certificate from speficied Host
openssl x509 -in <(openssl s_client -connect ${Host}:${port} -prexit 2>/dev/null) -out ${tmpfile}

# Import certificate into Java cacerts file
Sudo keytool -importcert -file ${tmpfile} -alias ${Host} -keystore ${cacertspath} -storepass changeit

# Remove temp certificate file
rm ${tmpfile}

# Check certificate alias name (same with Host) that imported successfully
result=$(keytool -list -v -keystore ${cacertspath} -storepass changeit | grep "Alias name: ${Host}")

# Show results to user
if [ "$result" ]; then
    echo "Success: Certificate is imported to Java cacerts for ${Host}";
else
    echo "Error: Something went wrong";
fi;
16
bhdrk

私はそれをコードだけで動かすことができました、すなわちkeytoolを使う必要はありませんでした:

import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import org.Apache.http.client.config.RequestConfig;
import org.Apache.http.config.Registry;
import org.Apache.http.config.RegistryBuilder;
import org.Apache.http.conn.ssl.SSLContexts;
import org.Apache.http.conn.ssl.TrustStrategy;
import org.Apache.http.conn.ssl.X509HostnameVerifier;
import org.Apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.Apache.http.impl.nio.client.HttpAsyncClients;
import org.Apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.Apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.Apache.http.impl.nio.reactor.IOReactorConfig;
import org.Apache.http.nio.conn.NoopIOSessionStrategy;
import org.Apache.http.nio.conn.SchemeIOSessionStrategy;
import org.Apache.http.nio.conn.ssl.SSLIOSessionStrategy;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import Java.io.IOException;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;

public class Test
{
    private static final DynamicIntProperty MAX_TOTAL_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty ROUTE_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty CONNECT_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connect.timeout", 60000);
    private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.socket.timeout", -1);
    private static final DynamicIntProperty CONNECTION_REQUEST_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connectionrequest.timeout", 60000);
    private static final DynamicBooleanProperty STALE_CONNECTION_CHECK = DynamicPropertyFactory.getInstance().getBooleanProperty("X.checkconnection", true);

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

        SSLContext sslcontext = SSLContexts.custom()
                .useTLS()
                .loadTrustMaterial(null, new TrustStrategy()
                {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
                    {
                        return true;
                    }
                })
                .build();
        SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(sslcontext, new AllowAll());

        Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", sslSessionStrategy)
                .build();

        DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.DEFAULT);
        PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager(ioReactor, sessionStrategyRegistry);
        connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS.get());
        connectionManager.setDefaultMaxPerRoute(ROUTE_CONNECTIONS.get());

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(SOCKET_TIMEOUT.get())
                .setConnectTimeout(CONNECT_TIMEOUT.get())
                .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT.get())
                .setStaleConnectionCheckEnabled(STALE_CONNECTION_CHECK.get())
                .build();

        CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                .setSSLStrategy(sslSessionStrategy)
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .build();

        httpClient.start();

        // use httpClient...
    }

    private static class AllowAll implements X509HostnameVerifier
    {
        @Override
        public void verify(String s, SSLSocket sslSocket) throws IOException
        {}

        @Override
        public void verify(String s, X509Certificate x509Certificate) throws SSLException {}

        @Override
        public void verify(String s, String[] strings, String[] strings2) throws SSLException
        {}

        @Override
        public boolean verify(String s, SSLSession sslSession)
        {
            return true;
        }
    }
}
5

Debianが好きで、パッケージ化されたJavaが好きな人のために:

Sudo mkdir /usr/share/ca-certificates/test/  # don't mess with other certs
Sudo cp ~/tmp/test.loc.crt /usr/share/ca-certificates/test/
Sudo dpkg-reconfigure --force ca-certificates  # check your cert in curses GUI!
Sudo update-ca-certificates --fresh --verbose

/etc/default/cacertsをチェックすることを忘れないでください:

# enable/disable updates of the keystore /etc/ssl/certs/Java/cacerts
cacerts_updates=yes

Certを削除するには

Sudo rm /usr/share/ca-certificates/test/test.loc.crt
Sudo rm /etc/ssl/certs/Java/cacerts
Sudo update-ca-certificates --fresh --verbose
4
gavenkoa

Windowsの場合のみ、次の手順に従います。

  1. Chromeで設定に行きます。
  2. [設定]で、[詳細設定を表示]をクリックします。
  3. HTTPS/SSLの下でManage Certificatesをクリックします。
  4. 証明書をエクスポートします。
  5. Windows検索(キーボードのWindowsキーを押す)で、Javaと入力します。
  6. Javaコントロールパネルを開く(Configure Java)オプションを選択します。
  7. Javaコントロールパネルの[セキュリティ]タブを選択します。
  8. 証明書の管理を選択します
  9. インポートをクリック
  10. (ユーザー)タブで、証明書の種類を(信頼できる証明書)として選択します。
  11. インポートボタンをクリックし、ダウンロードした証明書を参照してインポートします。
4
Praveen

私のApache 2.4インスタンス(Comodoワイルドカード証明書を使用)でのこのエラーの原因は、SHA-1署名付きルート証明書への不完全なパスでした。発行された証明書に複数のチェーンがあり、SHA-1ルート証明書につながるチェーンに 中間証明書 がありませんでした。最近のブラウザはこれを処理する方法を知っていますが、Java 7はデフォルトでそれを処理しません(コードでこれを達成するためのいくつかの複雑な方法があります)。その結果、自己署名証明書の場合と同じエラーメッセージが表示されます。

Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:196)
    at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:268)
    at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:380)
    ... 22 more

この場合、中間証明書が欠落しているため、「要求されたターゲットへの有効な証明書パスを見つけることができません」というメッセージが生成されています。サーバーに対して SSL Labs testを使用して、どの証明書が欠落しているかを確認できます。適切な証明書を見つけたら、それをダウンロードし、(サーバーが管理下にある場合は)それを証明書バンドルに追加します。あるいは、見つからない証明書をローカルにインポートすることもできます。サーバー上でこの問題に対処することは、問題に対するより一般的な解決策です。

4
vallismortis

これは、SHA2を使用して署名されたJava 7でGoDaddy証明書を使用することによっても発生する可能性があります。

Chromeと他のすべてのブラウザは、SHA1を使用して署名されたSSL証明書を非推奨にし始めています。

あなたが今必要としているならば、あなたのサーバーでそれをどう解決するかと同様に、問題に関するより多くの情報 はここで見つけることができます

2
Brad Parks

AVGバージョン18.1.3044(Windows 10)が私のローカルSpringアプリケーションに干渉します。

解決策: [Webと電子メール]というAVGセクションに入力して、[電子メール保護]を無効にします。サイトが安全でない場合、AVGは証明書をブロックします。

2
Insoft

更新: 再起動の助けになったことは偶然の一致でした(私はそう望んでいました、万歳!)問題の本当の原因はこれでした:Gradleが特定のキーストアを使うように指示されているとき、そのキーストアはまたすべての公式のルート証明書を含まなければなりません。そうでなければ、通常のリポジトリからライブラリにアクセスできません。私がしなければならなかったのはこれでした:

自己署名証明書をインポートします。

keytool -import -trustcacerts -alias myselfsignedcert -file /Users/me/Desktop/selfsignedcert.crt -keystore ./privateKeystore.jks

公式のルート証明書を追加します。

keytool -importkeystore -srckeystore <Java-home>/lib/security/cacerts -destkeystore ./privateKeystore.jks

Gradleデーモンも邪魔をしているかもしれません。状況が悪くなり始めたら、./gradlew --statusで見つかった実行中のすべてのデーモンを殺す価値があるかもしれません。

オリジナルの投稿:

誰もこれを信じないでしょう、私は知っています。それでも、他の方法がすべて失敗する場合は、試してみてください。私のMacの 再起動 /の後に、問題は解決しました。 Grrr。

背景:./gradlew jarファイルが、「要求されたターゲットへの有効な認証パスを見つけることができません」と表示し続けました。

私はprivateKeystore.jksにインポートされたブラウザから保存された自己署名証明書で立ち往生しています。それからGradleにprivateKeystore.jksを使うように指示しました。

org.gradle.jvmargs=-Djavax.net.debug=SSL -Djavax.net.ssl.trustStore="/Users/me/IntelliJ/myproject/privateKeystore.jks"  -Djavax.net.ssl.trustStorePassword=changeit

前述のように、これは再起動後にのみ機能しました。

2
StaticNoiseLog

証明書エラーについても同じ問題があり、SNIが原因でした。使用したhttpクライアントにSNIが実装されていませんでした。そのため、バージョンアップデートで仕事ができました

   <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>
1
Radu Toader

2つの選択肢があります。1つのソフトウェアが動作するjvmごとに自己署名証明書をJavaのキーストアにインポートするか、または検証されていないsslファクトリを試すという方法です。

jdbc:postgresql://myserver.com:5432/mydatabasename?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
1
Pradip Das

私の場合、私はキーストアとトラストストアの両方が同じ証明書を持っていたので、トラストストアを削除するのが助けになりました。証明書のコピーが複数ある場合は、証明書の連鎖が問題になることがあります。

0
Smart Coder

https://176.66.3.69:6443/ に有効な証明書があることを確認してください。あなたは最初にブラウザを介してそれを確認することができます https not secure ブラウザで動作すればJavaでも動作します。

それは私のために働いています

0
Amr Ibrahim

これで私の問題は解決しました、

証明書をローカルのJavaにインポートする必要があります。そうでなければ、以下の例外が発生します。

 javax.net.ssl.SSLHandshakeException:Sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:Sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません
 Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
 Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1949)
 Sun.security.ssl .Handshaker.fatalSE(Handshaker.Java:302)

_ sslpoke _ は、ローカルマシンからhttps接続をテストできるツールです。

接続性をテストするためのコマンド:

"%Java_HOME%/bin/Java" SSLPoke <hostname> 443
 Sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:
 Sun.security.provider.certpath.SunCertPathBuilderException:Sunで要求されたターゲット
への有効な証明書パスが見つかりません。 security.validator.PKIXValidator.doBuild(PKIXValidator.Java:387)
 Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:292)
 Sun.security.validator.Validator Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:324)でvalidate(Validator.Java:260)
 
 229)
 at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:124)
 Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1496)
 ] Sun.securityでの[Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:216)
での]。 Sun.security.ssl.SSLSocketImpl.readRecordのssl.Handshaker.processLoop(Handshaker.Java:1026)
(Handshaker.Java:961)
 SSLSocketImpl.Java:1062) 
 Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1375)
 Sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.Java:747) 
 at Sun.security.ssl.AppOutputStream.write(AppOutputStream.Java:123)
 Sun.security.ssl.AppOutputStream.write(AppOutputStream.Java:138)
 SSLPoke.main(SSLPoke.Java:31)
原因:Sun.security.provider.certpath.SunCertPathBuilderException:要求された
への有効な証明書パスがSunで見つかりません。 security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.Java:141)
 at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:126)
 Javでa.security.cert.CertPathBuilder.build(CertPathBuilder.Java:280)
 at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:382)
 ... 15その他
 ____。]
keytool -import -alias brinternal -keystore "%Java_HOME%/jre/lib/security/cacerts" -file <cert path>

これにより、最初に「Enter keystore password:」というプロンプトが表示されます。changeitがデフォルトのパスワードです。最後に「この証明書を信頼しますか?[no]:」というプロンプトが表示され、証明書をキーストアに追加するには「yes」を入力します。

検証:

C:\tools>"%Java_HOME%/bin/Java" SSLPoke <hostname> 443
Successfully connected    
0
Naveen

最初にssl証明書をダウンロードしてから、Java binパスに移動して、コンソールで以下のコマンドを実行します。

C:\Java\JDK1.8.0_66-X64\bin>keytool -printcert -file C:\Users\lova\openapi.cer -keystore openapistore
0
Lova Chittumuri

これは私が問題を解決することができた方法です: http://code.naishe.in/2011/07/looks-like-article-no-more-unable-to.html

0
Bogdan Ustyak

私の場合は、Mac 1.6 High SierraをJava 1.6で実行しています。 cacertファイルは、上記のGabe Martin-Dempesyの回答とは異なる場所にあります。 cacertファイルもすでに別の場所(/ライブラリ/ Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts)にリンクされていました。

FireFoxを使用して、問題のWebサイトから「exportCertFile.crt」というローカルファイルに証明書をエクスポートしました。そこから、keytoolを使って証明書をcacertファイルに移動しました。これで問題は解決しました。

bash-3.2# cd /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/
bash-3.2# keytool -importcert -file ~/exportedCertFile.crt -alias example -keystore cacerts -storepass changeit
0
Alan Curtis