7

Javaでのキーストアの設定などについてあまり知識がないという事実から始めます

SOAP Web サービスを呼び出そうとしています。wsdl を取得し、コードを生成しました。デプロイして WS 呼び出しをトリガーしようとするまでは、すべて問題ないようです。

これが私のセットアップです:

  • トムキャット 7.0.35
  • Java、JDK 1.6.0_39
  • pfx ファイルとパスワード
  • tomcat に標準 Web アプリ (war) としてデプロイされたプロジェクト

コードを実行すると、次の例外が発生しました。

Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://tallyservices-qa.olson.com/tallyDemo2WebServices/tallyDemo2/sms: Received fatal alert: certificate_unknown
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1336)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1320)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    ... 27 more
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1837)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1019)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:170)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1280)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1231)
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:183)
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1293)
    ... 30 more

ここでの提案に従いました: How to convert .pfx file to keystore with private key? 証明書をキーストアにインストールするには:

keytool -importkeystore -srckeystore C:\somefolder\mypfxfile.pxf -srcstoretype pkcs12 
-destkeystore C:\somefolder\clientcert.jks -deststoretype JKS

そして私は得ました:

Enter destination keystore password: <mypassword>
Re-enter new password: <mypassword>
Enter source keystore password: <pxf_password>
Entry for alias 67eb31f6 successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or
cancelled

これまでのところすべて問題ないように見えますが、Tomcat をバウンスしてサーブレットを再度ヒットしても、同じエラーが発生します。

ここで他に何が欠けていますか?証明書などについてTomcatに伝える必要がありますか?

キーストアと証明書領域での私の初心者に対する助けと謝罪を前もって感謝します。

編集: ですから、私はTomcatにキーストアを追加する必要があることをカルロ・ペレグリーニの助けから考えました:それで、私のTomcatは追加のJAVA_OPTSパラメータで開始されます:

"-Djavax.net.ssl.trustStore=C:\somefolder\clientcert.jks -Djavax.net.ssl.trustStorePassword=somepassword"

そして今、私は得ました:

Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

ここから:エラー - trustAnchors パラメータは空でない必要があり、java.security.InvalidAlgorithmParameterExceptionを取得しました: cas を使用する場合、trustAnchors パラメータは空でない必要があります- 私のトラストストアが見つからないようです?

以前のコマンドを考え出しました:

keytool -importkeystore -srckeystore C:\somefolder\mypfxfile.pxf -srcstoretype pkcs12 -destkeystore C:\somefolder\clientcert.jks -deststoretype JKS

実際に pxf をトラストストアではなくキーストアに入れますか?

キーストアリストを確認すると:

C:\somefolder>keytool -list -keystore "C:\somefolder\clientcert.jks"
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

67eb31f6, 13-Feb-2013, PrivateKeyEntry,
Certificate fingerprint (MD5): ... some fingerprint ...

だから私はここで何が欠けているのか分かりません

4

2 に答える 2

5

サーバー証明書を信頼する必要があります。方法は次のとおりです。

Chrome の使用 (他のブラウザの手順は異なる場合があります):

  • サービス サイトに移動します。(例です。https://localhost/myService
  • ブラウザがそれを信頼しない場合は、Proceed anywayをクリックし、アドレスバーの南京錠アイコンをクリックし、ポップアップ ウィンドウを閉じて、ConnectionタブとCertificate Information リンクを選択します。
  • これにより、証明書ビューアー ウィンドウが開きます。ここで、 を選択するDetailsと、Export ...ボタンが表示されます。Base 64 でエンコードされた単一の証明書を選択し、mysite.cerファイルとして保存します。

これで証明書が取得され、トラストストアにインポートする必要があります。

証明書をキーストアにインポートします。

keytool -import -file mysite.cer -keystore mykeystore

mykeystoreこれにより、現在のディレクトリに新しいファイル キーストア ファイルが作成されます。

最後に、次のように JVM パラメータを使用して Web サービス クライアント アプリケーションを起動しますjavax.net.ssl.trustStore

java -Djavax.net.ssl.trustStore=mykeystore ... MyClientClass

または、Windows で Tomcat を使用している場合:

set JAVA_OPTS=-Djavax.net.ssl.trustStore=mykeystore
startup.bat

または、Unix で Tomcat を使用している場合:

export JAVA_OPTS="-Djavax.net.ssl.trustStore=mykeystore"
startup.sh
于 2013-02-13T18:15:00.913 に答える
3

I found solution, I should be using keyStore rather than trustStore, but more importantly, there seem to be problem with the library I am using (cxf 2.7.1) that I have to set up the SSL property directly in the code:

// BEGIN FIX to avoid certificate error, need to set this up in the code for cxf
String storePath = System.getProperty("javax.net.ssl.keyStore");
String storePassword = System.getProperty("javax.net.ssl.keyStorePassword");
String storeType = System.getProperty("javax.net.ssl.keyStoreType");
KeyStore keyStore = KeyStore.getInstance(storeType);
keyStore.load(new FileInputStream(storePath), storePassword.toCharArray());
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
factory.init(keyStore, storePassword.toCharArray());
KeyManager[] keyManagers = factory.getKeyManagers();
Client client = ClientProxy.getClient(port);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
conduit.setTlsClientParameters(new TLSClientParameters());
conduit.getTlsClientParameters().setKeyManagers(keyManagers);
于 2013-03-02T14:42:39.807 に答える