質問

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

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

このファイルは、Internet Explorerの証明書として(パスワードを入力することなく!)にインポートし、Webサービスで認証するために使用できます。

最初と最後のラインを最初に剥ぎ取り、Unix Newlinesに変換してBase64-Decodeを実行することで、この証明書をキーストアにインポートすることができました。結果のファイルはキーストアにインポートできます( keytool 指図)。キーストアにエントリをリストするとき、このエントリはタイプです trustedCertEntry. 。このエントリタイプ(?)のため、この証明書を使用してWebサービスで認証することはできません。提供された証明書は、認証に使用されている公開証明書であると考え始めています...

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

追加情報:WebServiceの背後にある会社は、後で証明書をインポートするPCおよびユーザーから証明書を要求する必要があることを教えてくれました。

役に立ちましたか?

解決

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

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

他のヒント

インポート .cer ブラウザからダウンロードされた証明書ファイル(URLを開き、詳細を掘ります) cacerts キーストア java_home\jre\lib\security 自分のキーストアを生成して使用するのとは対照的に、私のために働きました。

  1. あなたに行きます java_home\jre\lib\security
  2. (ウィンドウズ)そこを使用して管理者コマンドラインを開きます cmdCtrl+シフト+入力
  3. keytoolを実行して証明書をインポートします。
    • (交換 yourAliasNamepath\to\certificate.cer それぞれ)

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

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

以下は、.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);
}

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

私のための次の作品:

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

オープンソースGUIツールはで利用できます keystore-explorer.org

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

Keystore Explorerは、Javaコマンドラインユーティリティキートールと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つであり、RESTはユーザー最新のものです(すべてのクレジットは keystore-explorer.org)

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

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

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

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

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

これは、現在のディレクトリ内の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. テキストエディターで次の形式で証明書データを.txtとして保存します

    ----- BEGIN証明書----- [Microsoftによってシリアル化されたデータ] -----終了証明書-----

  2. Chromeブラウザを開く(このステップは他のブラウザでも動作する場合もあります)> [高度な設定を表示]> [HTTPS/SSL]> [証明書の管理]ステップ1で.txtをインポートします
  3. ベース64エンコード形式でその証明書を選択してエクスポートします。 .cerとして保存します
  4. これで、KeyToolまたはPorteCleを使用してJavaキーストアにインポートできます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top