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サイトを使用)。
.CER
ファイルは証明書であり、秘密鍵を持っていません。秘密鍵は通常.PFX keystore
ファイルと共に提供されます。あなたが本当に認証するのはあなたが既に秘密鍵をインポートしているからです。通常、.CER
証明書は問題なくインポートできます。
keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias"
.cer
のcacerts keystoreへのブラウザからダウンロードされたJava_home\jre\lib\security
証明書ファイルのインポート(詳細はurlとDigを開く)は、私にとってはうまくいきました。
Java_home\jre\lib\security
に行きますcmd
と CTRL+SHIFT+ENTERyourAliasName
とpath\to\certificate.cer
をそれぞれ置き換えます) ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer
これにより、追加のJVMオプションを指定する必要がなくなり、証明書がJREによって認識されるはずです。
プログラム的に新しい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);
}
証明書を変更する必要はありません。正しいインポートコマンドを実行してよろしいですか?
以下は私のために働きます:
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コマンドラインユーティリティのkeytoolとjarsignerに代わるオープンソースのGUIです。 KeyStore Explorerは直感的なグラフィカルユーザーインターフェースを介してそれらの機能などを提供します。
以下のスクリーンが役立ちます(それらは公式サイトからのものです)
次のコマンドを実行して表示されるデフォルトの画面
shantha@shantha:~$./Downloads/kse-521/kse.sh
そしてExamine
とExamine a URL
オプションに行き、インポートしたいWeb URLを入力してください。
Googleサイトのリンクをクリックすると、結果ウィンドウは次のようになります。
これはユースケースの1つであり、残りはユーザ次第です(すべてのクレジットは 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
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
これは私のためにこれがどのように働いたかです:
----- BEGIN CERTIFICATE ----- [Microsoftによってシリアル化されたデータ] ----- END CERTIFICATE -----