276

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 サイトを使用して) 証明書を要求する必要があると私に言いました。

4

9 に答える 9

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

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
    
于 2010-12-01T16:10:19.637 に答える
124

独自のキーストアを生成して使用しようとするのではなく、ブラウザーからダウンロードした証明書ファイルをcacertsキーストアにインポート.cerする (URL を開いて詳細を調べる)ことはうまくいきました。java_home\jre\lib\security

  1. あなたのjava_home\jre\lib\security
  2. ( Windowscmd )およびCTRL+ SHIFT+を使用して管理コマンドラインを開きますENTER
  3. keytool を実行して証明書をインポートします。
    • yourAliasName(それぞれと を置き換えpath\to\certificate.cerます)

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

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

于 2015-01-13T17:43:02.670 に答える
61

これは、.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);
}
于 2012-09-17T05:49:15.277 に答える
24

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

以下は私にとってはうまくいきます:

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-----
于 2010-12-01T14:53:51.430 に答える
8

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

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

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

証明書が戻ってきたら、「keytool -importcert -alias -keypass -keystore」を実行します。

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

于 2010-12-01T16:21:40.457 に答える
6

現在のディレクトリにある一連の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
于 2017-03-02T18:47:46.607 に答える