.cer証明書をJavaキーストアにインポートする方法は?


226

Java Webサービスクライアントの開発中に問題が発生しました。Webサービスの認証は、クライアント証明書、ユーザー名、およびパスワードを使用しています。Webサービスの背後にある会社から受け取ったクライアント証明書は.cerフォーマットされています。テキストエディターを使用してファイルを検査すると、次の内容が含まれています。

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

このファイルを証明書としてInternet Explorerにインポートし(パスワードを入力する必要はありません!)、それを使用してWebサービスで認証できます。

最初に最初と最後の行を削除し、UNIXの改行に変換して、base64-decodeを実行することで、この証明書をキーストアにインポートすることができました。結果のファイルは、(keytoolコマンドを使用して)キーストアにインポートできます。キーストアのエントリを一覧表示すると、このエントリのタイプはtrustedCertEntryです。このエントリタイプ(?)のため、この証明書を使用してWebサービスで認証することはできません。提供された証明書は、認証に使用されている公開証明書であると思い始めています...

私が見つけた回避策は、証明書をIEにインポートし、.pfxファイルとしてエクスポートすることです。このファイルはキーストアとしてロードでき、Webサービスでの認証に使用できます。ただし、クライアントが新しい証明書を受け取るたびにこれらの手順を実行することは期待できません。そのため、.cerファイルを直接Java にロードしたいと思います。何かご意見は?

追加情報:Webサービスの背後にある会社から、後で証明書をインポートするPCとユーザーから(IEとWebサイトを使用して)証明書を要求する必要があると言われました。

回答:


317
  • 認証したい場合は秘密鍵が必要です-他に選択肢はありません。
  • 証明書は、追加のプロパティ(会社名、国など)を持つ公開鍵であり、添付されたプロパティが真であることを保証する認証局によって署名されています。
  • .CERファイルは証明書であり、秘密鍵はありません。秘密鍵は.PFX keystore通常ファイルで提供されます。本当に認証するのは、すでに秘密鍵をインポートしているためです。
  • 通常.CER、問題なく証明書をインポートできます。

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
秘密鍵がIEのプラグインによって生成されていることがわかります。現時点での唯一の解決策は、IEに証明書をインポートし、.pfxファイルをエクスポートすることです。
Jan-Pieter

5
.CERファイルには公開鍵があります。彼らは秘密鍵を持っていません。編集の
提案

6
ここで-aliasは何をしますか?
ホップ

5
:(-> keytoolエラー:java.lang.Exception:入力がX.509証明書ではありません
ネクロマンサー

1
@hop Javaキーストアは、それぞれを識別するために異なるエイリアスを持つ複数の証明書を持つことができます。これを参照として使用して、それを識別したり、エイリアス名でプログラム的に取得したりできます。
lujop 2015

85

インポート.cerにブラウザからダウンロードした証明書ファイルを(詳細はURLとDIGを開く)のcacertsは、キーストアjava_home\jre\lib\securityを生成し、私自身のキーストアを使用しようとしますとは反対に、私のために働きました。

  1. に行く java_home\jre\lib\security
  2. WindowscmdおよびCTRL+ SHIFT+ を使用して管理コマンドラインをそこに開きますENTER
  3. keytoolを実行して証明書をインポートします。
    • (交換yourAliasNamepath\to\certificate.cerそれぞれ)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

この方法では、追加のJVMオプションを指定する必要はなく、証明書はJREによって認識されます。


path \ to \ cert。ファイルがデスクトップにある場合、どのようにパスすればよいですか?C:/ user / desktop /または../../../../desktop/filename
Jesse

MacOS / Linuxでは、このコマンドはsudoで機能します。ありがとう。しかしnoprompt paramとは何ですか?私はそれを使用しませんでしたが、それでも成功しました。
Evgeniy Mishustin 2017年

開発にJDKを使用する場合、正しいパスは次のとおりです。java_home\jdk_x.xx\jre\lib\security 絶対パスの場合はバックスラッシュを使用します。たとえば"C:\myCert.crt"、パスに空白が含まれていない場合、引用符はオプションです。
jp-jee 2017

百万回ありがとう。
vikingsteve 2018年

質問:秘密鍵はどうですか?議論はクライアント証明書についてです。私の理解では、秘密鍵を使用してCSRを作成し、リモートWebサイトの会社からクライアント証明書を受け取って、クライアント証明書を秘密鍵と照合する必要があります。あなたの答えは秘密鍵について何も言及していないようです。ただ尋ねる。
user2367418

51

これが、プログラムで.cerファイルを新しいKeyStoreにインポートするために使用しているコードです。

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

証明書を変更する必要はありません。正しいインポートコマンドを実行していますか?

次は私のために働きます:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

mycert.cerには以下が含まれます。

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
変更されていない証明書をキーストアにインポートしようとすると、「keytool error:java.lang.Exception:Input not a X.509 certificate」というエラーが表示されます。私の投稿で説明した方法で証明書を変更した後、あなたと同様のコマンドを使用して、エラーなしで証明書をインポートできます。ただし、trustedCertEntryとしてインポートされ、Webサービスへのアクセス時には使用されません。
Jan-Pieter

質問に例外のコマンドを追加できますか?インポートコマンドでエイリアスを指定してもよろしいですか?
dogbane

Windowsを使用している場合は、cmdを管理者として実行することを忘れないでください
SilentBob470

9

オープンソースのGUIツールはkeystore-explorer.orgで入手できます。

KeyStore Explorer

KeyStore Explorerは、Javaコマンドラインユーティリティのkeytoolおよびjarsignerに代わるオープンソースGUIです。KeyStore Explorerは、直感的なグラフィカルユーザーインターフェイスを介して、それらの機能などを提供します。

以下の画面が役立ちます(これらは公式サイトからのものです)

次のコマンドを実行すると表示されるデフォルトの画面:

shantha@shantha:~$./Downloads/kse-521/kse.sh

ここに画像の説明を入力してください

オプションに移動してExamineExamine a URLインポートするWeb URLを指定します。

グーグルサイトにリンクを張ると結果ウィンドウは以下のようになります。 ここに画像の説明を入力してください

これはユースケースの1つであり、残りはユーザー次第です(すべてのクレジットはkeystore-explorer.orgに送られます


7

すでに持っている証明書は、おそらくサーバーの証明書か、サーバーの証明書への署名に使用された証明書です。これは、Webサービスクライアントがサーバーを認証できるようにするために必要です。

しかし、SSLを使用してクライアント認証を実行する必要がある場合は、Webサービスクライアントを認証するために、独自の証明書を取得する必要があります。このためには、証明書要求を作成する必要があります。このプロセスでは、独自の秘密鍵と対応する公開鍵を作成し、その公開鍵を情報(電子メール、名前、ドメイン名など)とともに証明書要求と呼ばれるファイルに添付します。次に、すでに要求されている会社にその証明書要求を送信します。彼らは、秘密鍵を使用して公開鍵に署名することにより証明書を作成し、証明書を含むX509ファイルを送り返します。これでキーストアに追加すると、クライアント認証を必要とするSSLを使用してWebサービスに接続できるようになります。

証明書リクエストを生成するには、「keytool -certreq -alias -file -keypass -keystore」を使用します。結果のファイルを、署名する会社に送信します。

証明書を取得したら、「keytool -importcert -alias -keypass -keystore」を実行します。

キーストアが保護されている場合は、両方のケースで-storepassを使用する必要があります(これは良いアイデアです)。


5

現在のディレクトリにある一連のcrtファイルをJavaキーストアにバッチインポートするために使用したスクリプトを次に示します。これを証明書と同じフォルダーに保存し、次のように実行します。

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

これが私にとってどのように機能したかです:

  1. 証明書データをテキストエディタで次の形式で.txtとして保存します

    ----- BEGIN CERTIFICATE ----- [Microsoftによってシリアル化されたデータ] ----- END CERTIFICATE -----

  2. Chromeブラウザを開きます(この手順は他のブラウザでも機能する可能性があります)設定>詳細設定を表示> HTTPS / SSL>証明書を管理手順1で.txtをインポートします
  3. その証明書を選択し、Base-64エンコード形式でエクスポートします。.cerとして保存
  4. これで、keytoolまたはPortecleを使用して、Javaキーストアにインポートできます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.