web-dev-qa-db-ja.com

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

Java Webサービスクライアントの開発中に、私は問題に遭遇しました。 Webサービスの認証は、クライアント証明書、ユーザー名、およびパスワードを使用しています。 Webサービスの背後にある会社から受け取ったクライアント証明書は.cer形式です。テキストエディタを使用してファイルを調べると、次のような内容になっています。

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

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

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

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

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

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

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

.cercacerts keystoreへのブラウザからダウンロードされたJava_home\jre\lib\security証明書ファイルのインポート(詳細はurlとDigを開く)は、私にとってはうまくいきました。

  1. あなたのJava_home\jre\lib\securityに行きます
  2. Windows)そこでadminコマンドラインを開き、cmdと 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によって認識されるはずです。

65
jediz

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

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);
}
46
Patrick M

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

以下は私のために働きます:

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-----
16
dogbane

オープンソースのGUIツールは keystore-Explorer.org にあります。

キーストアエクスプローラ

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

以下のスクリーンが役立ちます(それらは公式サイトからのものです)

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

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

enter image description here

そしてExamineExamine a URLオプションに行き、インポートしたいWeb URLを入力してください。

Googleサイトのリンクをクリックすると、結果ウィンドウは次のようになります。 enter image description here

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

7
Shantha Kumara

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

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

証明書要求を生成するには、 "keytool -certreq -alias -file -keypass -keystore"を使用してください。作成したファイルを署名しようとしている会社に送信します。

証明書を取り戻したら、 "keytool -importcert -alias -keypass -keystore"を実行します。

キーストアが保護されている場合は、どちらの場合も-storepassを使用する必要があります(これは良い考えです)。

6
Chochos

これは、現在のディレクトリにある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
4
Brad Parks

これは私のためにこれがどのように働いたかです:

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

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

  2. Chromeブラウザを開きます(この手順は他のブラウザでも機能する可能性があります)
  3. その証明書を選択し、Base 64エンコード形式でエクスポートします。 .cerとして保存してください
  4. これでkeytoolまたはPortecleを使用してそれをJavaキーストアにインポートできます。
1
code4kix