web-dev-qa-db-ja.com

デフォルトですべてのJavaアプリケーションで使用可能な自己署名証明書をJavaキーストアに正しくインポートする方法

自己署名証明書をJavaにインポートしたいので、SSL接続を確立しようとするすべての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:要求されたターゲットへの有効な証明書パスが見つかりません
124
sorin

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サーバーからダウンロードできます。

$ 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

編集する

ssls.com から年間5ドルの証明書を取得できるため、最近ではキーストアに証明書を追加する必要はあまりありません。念のためにそれはあなたのためのオプションです。

206
Sarel Botha

私は証明書をキーストアに追加する小さなスクリプトを書くことになったので、使うのはずっと簡単です。

最新版は https://github.com/ssbarnea/keytool-trust から入手できます。

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="Sudo keytool"

# /etc/Java-6-Sun/security/cacerts

for CACERTS in  /usr/lib/jvm/Java-8-Oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/Java-7-Oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/Java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` `

32
sorin
    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"
31
Vikky

これは私のために働きました。 :)

 Sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ Java_HOME/jre/lib/security/cacerts -storepass changeit 
13
Walk

デフォルトでJava cacertsファイルに含まれていない認証局によって署名された証明書を使用している場合は、HTTPS接続用に次の設定を完了する必要があります。証明書をcacertsにインポートするには

  1. Windowsエクスプローラを開き、AX Core Clientがインストールされているjre\lib\securityサブフォルダにあるcacertsファイルに移動します。デフォルトの場所はC:¥Program Files¥ACL Software¥AX Core Client¥jre¥lib¥securityです。
  2. 変更を加える前に、ファイルのバックアップコピーを作成してください。
  3. 使用している認証局から受け取った証明書によっては、中間証明書やルート証明書をcacertsファイルにインポートする必要があるかもしれません。証明書をインポートするには、次の構文を使用します。keytool -import -alias -keystore -trustcacerts -file
  4. 両方の証明書をインポートしている場合は、各証明書に指定されている別名は一意である必要があります。
  5. 「パスワード」プロンプトにキーストアのパスワードを入力して、Enterキーを押します。 cacertsファイルのデフォルトのJavaパスワードは「changeit」です。 [この証明書を信頼しますか?]プロンプトで「y」と入力し、Enterキーを押します。
4
Bharat Darakh

単純なコマンド 'keytool'はWindowsやCygwinでも動作します。

もしあなたがCygwinを使っているならこれは私が "S.Botha's"の答えの下から使った修正されたコマンドです:

  1. 使用するJDK内のJREを必ず確認してください。
  2. AdminとしてあなたのPrompt/cygwinを起動します。
  3. そのJDKのbinディレクトリの中に入ります。 cd/cygdrive/c /プログラム\ファイル/ Java/jdk1.8.0_121/jre/bin
  4. その中からkeytoolコマンドを実行します。ここで、最後に新しいCertへのパスを指定します。

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"
    

これがCygwinの下にある場合は、Cygwin以外のプログラムへのパスを指定しているので、そのパスはDOS風で引用符で囲まれています。

1
Jordan Gee

試してみたいかもしれません

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

cacertsと書くだけでは、証明書がどこに置かれるのか正直にわかりません。

0
Gradient

Java Linuxに証明書をインストールする

/ opt/jdk(バージョン)/ bin/keytool -import -aliasエイリアス名-file certificate.cer -keystore cacerts -storepass password

0
Apuri Srikanth