デフォルトですべてのJavaアプリケーションが使用できるJavaキーストアに自己署名証明書を適切にインポートする方法は?


144

自己署名証明書を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:要求されたターゲットへの有効な証明書パスが見つかりません

私は必ずしもそのコードに依存するとは限りません。のようなものSecurity.addProvider(new com.sun.net.ssl.internal.ssl.Provider())は最初の部分では完全に不要です。2番目は証明書の検証を行いません。URLConnectionまずはプレーンで試してください。あなたは、あなたが変更した確信しているcacerts中でlib/security、あなたのJREをインストールしましたか?trustmanagerデバッグオプションを試しましたか?
ブルーノ

回答:


225

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

1
これからの主なアイデアは、portecleではなく、適切なキーストアに証明書をインポートすることです。
アルファブラボ

これは機能しましたが、私のJavaは別の場所にありました。私のキーストアは/ usr / lib / jvm / java-openjdk / jre / lib / security / cacertsにありました。これを実行ps -ef | grep javaすると、Javaが/ usr / lib / jvm / java-openjdk /にあるopenjdkから実行されていることがわかりましたbin / java。また、これがWebアプリケーションの場合、再起動を忘れないでください。助けてくれてありがとう!!
Codezilla

7
私はportecleを使用していないが、私はそれを見つけストアエクスプローラでは、Windows、Linux、のためにかなりうまく機能(およびそれは同様OSX上で動作するはずです)
Xantix

確かに非常に役立ちます。ここで強調されている2つの非常に重要な事項。1つは、適切なキーストアにインポートすることです。もう1つは、Webサーバーの場合に必ず再起動することです。
sdm

6
2019年には、Lets暗号化などのサービスを使用してSSL証明書を無料で取得することもできます
Ferrybig

41
    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"

12
デフォルトは「changeitと」で、キーストアのパスワードの入力が求められます
ギルバートアリーナスダガー

34

証明書をキーストアに追加する小さなスクリプトを作成したので、はるかに使いやすくなりました。

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

「」


18

これでうまくいきました。:)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 

4

デフォルトで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キーを押します。

このコマンドを使用します。 - > keytoolの-import -alias <別名> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
バーラトDarakh

1

単純なコマンド「keytool」は、WindowsやCygwinでも機能します。

ここでCygwinを使用している場合、「S.Botha's」の回答の最後から使用した変更されたコマンドは次のとおりです。

  1. 使用するJDK内のJREを必ず確認してください
  2. 管理者としてプロンプト/ cygwinを起動します
  3. そのJDKのbinディレクトリ内に移動します。例:cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. その内部からkeytoolコマンドを実行します。ここで、最後に新しい証明書へのパスを指定します。

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

これがCygwinの下にある場合は、Cygwin以外のプログラムへのパスを指定しているため、パスはDOSのようで引用符で囲まれていることに注意してください。


0

試したいかもしれません

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

正直言ってcacerts、完全なパスを入力するだけで証明書をどこに置くかわかりません


0

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

/ opt / jdk(version)/ bin / keytool -import -alias aliasname -file certificate.cer -keystore cacerts -storepass password


0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.