169

SSL 接続を確立しようとする Java アプリケーションがこの証明書を信頼するように、自己署名証明書を Java にインポートしたいと考えています。

これまでのところ、なんとかインポートできました

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

それでも、実行しようとすると、次のようHTTPSClient.classになります。

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

11 に答える 11

261

Windows では、プログラムportecleを使用するのが最も簡単な方法です。

  1. portecle をダウンロードしてインストールします。
  2. まず、プログラムの実行に使用されている JRE または JDK を 100% 確認してください。64 ビットの Windows 7 では、かなりの数の JRE が存在する可能性があります。Process Explorer はこれを支援するか、以下を使用できます。System.out.println(System.getProperty("java.home"));
  3. ファイル JAVA_HOME\lib\security\cacerts を別のフォルダーにコピーします。
  4. Portecle で、[ファイル] > [キーストア ファイルを開く] をクリックします。
  5. cacerts ファイルを選択します
  6. このパスワードを入力してください: changeit
  7. [ツール] > [信頼できる証明書のインポート] をクリックします。
  8. ファイル mycertificate.pem を参照します
  9. [インポート] をクリックします
  10. 信頼パスに関する警告に対して [OK] をクリックします。
  11. 証明書に関する詳細が表示されたら、[OK] をクリックします。
  12. [はい] をクリックして、証明書を信頼できるものとして受け入れます。
  13. エイリアスの入力を求められたら [OK] をクリックし、証明書をインポートしたと表示されたらもう一度 [OK] をクリックします。
  14. [保存] をクリックします。これを忘れないでください。そうしないと、変更が破棄されます。
  15. ファイル cacerts を見つけた場所にコピーします。

Linux の場合:

次のように、すでに SSL 証明書を使用している Web サーバーから SSL 証明書をダウンロードできます。

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

オプションで、証明書情報を確認します。

$ openssl x509 -in /tmp/examplecert.crt -text

証明書を Java cacerts キーストアにインポートします。

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
于 2012-07-23T17:43:09.460 に答える
54
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"
于 2015-03-19T01:04:46.390 に答える
5

keytoolにあるはずのJavaインストールで使用できます$JAVA_HOME/bin。Java キーストアは、$JAVA_HOME/lib/security/cacertsまたは$JAVA_HOME/jre/lib/security/cacertsJDK または JRE がインストールされているかどうかによって異なります。

Java 9 以降を使用している場合、正確な場所を知る必要はありません。-cacertsオプションをショートカットとして使用できます。

Java 9+

したがって、Java 9 (別名 Java 1.9) 以降では、単に使用します

keytool -importcert -trustcacerts -cacerts -file myCert.pem -alias myCert

以前の Java バージョン

Java 8 (別名 1.8) 以前では、次のようにキーストアの場所を指定する必要があります

keytool -importcert -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -file myCert.pem -alias myCert

Java 5 (別名 1.5) 以前では、この-importcertオプションは存在しませんでした。と呼ばれていまし-importたが、それ以外は同じです。だから使う

keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -file myCert.pem -alias myCert

追加オプション

  • トラストストアのパスワードを求められます。デフォルトのパスワードはchangeitです。
  • インポートを無人で実行する必要がある場合は、追加できます-storepass changeit -noprompt

フォーマット

keytoolX.509 v1、v2、および v3 証明書、およびそのタイプの証明書 (P7B) で構成される PKCS#7 形式の証明書チェーンをインポートできます。インポートするデータを提供する必要があります

  • バイナリ エンコーディング形式 (DER) のいずれか
  • または印刷可能なエンコーディング形式 (別名 base64 エンコード) で、-----BEGIN-----END行で囲まれています (PEM)

注: PEM 形式の証明書チェーンが実際に機能するかどうかはわかりません。

ボーナススクリプト

残念ながら、これは bash であるため、Windows ユーザー向けのソリューションはありません。

この単純なスクリプトは、stackoverflow に関するいくつかの有用な質問とスマートな回答のおかげで作成され、Java のバージョンをチェックし、必要に応じて正しいキーストアの場所を特定し、1 つのコマンドで複数の証明書をインポートできます。ファイル パターン引数を単一引用符で囲む必要があることに注意してください (使用法を参照)。

addcerts.sh

#!/bin/bash

# Add custom root certificates to Java trust store

if [ "$#" -ne 1 ]; then
    SCRIPT=`basename "$0"`
    echo "Usage: $SCRIPT 'path/to/certs/*'"
    exit 1
fi

CERTFILES=$1    

JAVA_VERSION=`java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1`

if (( $JAVA_VERSION >= 9 )); then
    CACERTS="-cacerts"
else    
    # Check where cacerts are located
    # differs depending or jdk or jre installed
    if [ -d "$JAVA_HOME/jre" ]; then
        CACERTS="$JAVA_HOME/jre"
    else
        CACERTS="$JAVA_HOME"
    fi
    CACERTS="-keystore $CACERTS/lib/security/cacerts"   
fi      

# Now add certificates 
for CERTFILE in $CERTFILES; do
    # Remove path, then suffix to derive alias from filename
    ALIAS=${CERTFILE##*/}  
    ALIAS=${ALIAS%.*}
    $JAVA_HOME/bin/keytool -importcert -file "$CERTFILE" -alias "$ALIAS" $CACERTS -trustcacerts -storepass changeit -noprompt
    if [ $? -ne 0 ]; then
        echo "Failed to add $CERTFILE as $ALIAS to $CACERTS"
        exit 1
    fi  
done
于 2021-07-01T16:53:11.793 に答える