2016-03-30 14 views
0

「証明書を見つけることができません。WsImportはインポートされた証明書を見つけることができません

私はWindows 7マシンで開発中です。私は複数のJavaバージョンを使用しているので、使用されているJavaバージョン(ここではJava6)へのパスについては明示的です。私は、次の2行でこれを実現:

set path=c:\Program Files\Java\jdk1.6.0_45\bin;%path% 
set java_home=c:\Program Files\Java\jdk1.6.0_45 

私はcertificate.PFX証明書(URIと証明書ファイルは、サードパーティのを保護する方法として、名前が変更され、両方のサービスを提供し、サードパーティのWebサービスhttps://service.gov/Service.svc?wsdlを使用する必要があります利益)。 Windowsで証明書ファイルをインポートした後、ブラウザでWSDLファイルを開くことができるようにしました。

私が最初に(システムフォルダに書き込むためのアクセス権を取得するためにプロンプ​​トAdministratorコマンドを使用して)私のキーストアに証明書をインポートします。

keytool -importkeystore -srckeystore certificate.pfx -srcstoretype pkcs12 -keystore "c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" 

私は成功通知を取得します。それから私は、srcとクラスと呼ばれる空白のサブフォルダを含む新しいフォルダを作成

keytool -list -keystore "c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" 

:それでも、私は、新しい証明書が出力に存在することを確認してください。これが完了すると、私は(私が使用しているトラストストアについて明示していますことを確認する代わりに、バイナリのJavaクラスを使用して)その新しいフォルダからwsimportのを実行します。

java -classpath "c:\Program Files\Java\jdk1.6.0_45\lib\tools.jar" -Djavax.net.ssl.trustStore="c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" -Djavax.net.ssl.trustStorePassword=changeit com.sun.tools.internal.ws.WsImport https://service.gov/Service.svc?wsdl -s src -d classes 

出力は以下の通りです:

parsing WSDL... 

[ERROR] sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Failed to read the WSDL document: https://service.gov/Service.svc?wsdl, because 1) could not find the document; /2) the document could not be read; 3) the root element of the document is not <wsdl:definitions>. 

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

At least one WSDL with at least one service definition needs to be provided. 

Failed to parse the WSDL. 

WSDLファイルには他の組織が含まれており、他の組織でも使用されているため、問題は第三者の側では間違いありません。

何か不足していますか?私にとっては、これまでのところすべてが明らかですが、それでも動作しません。私もJava8でこれを試しましたが、結果はほぼ同じです。唯一の違いは、Java 8ではWsImportクラスが存在しないため、wsimport.exeバイナリを使用していることです。

ありがとうございました。

答えて

1

pfxファイル(証明書と秘密鍵も含まれます)はクライアント認証用ですが、トラストストアはサーバー証明書の検証用です。 キーストアtruststoreの違いを理解することが重要です。

クライアント証明書(およびキー)をデフォルトのトラストストア(cacerts)にインポートしました。代わりに行う必要があるのは次のとおりです。

  1. サーバーのSSL証明書の発行者(CA)をcacertsにインポートします。 CA証明書がすでにcacertsに入っている場合は、この手順をスキップできます。
  2. クライアント認証のキーストアとしてpfxファイルを使用します。最も簡単な方法は、それをjksに変換することです:https://stackoverflow.com/a/3054034/2672392 wsimportに渡すプロパティは "javax.net.ssl.keyStore"と "javax.net.ssl.keyStorePassword"です。

重要なSSLのプロパティのリストについては、この回答を参照してください:https://stackoverflow.com/a/5871352/2672392

+0

私は唯一のクライアント証明書を提供してきました。サーバー証明書を取得するにはどうすればよいですか?私はWSDLを開いたときにブラウザから取得しようとしましたが、クライアント証明書とよく似ていて、同じではないことを確認できません。私は現在、自分のテスト環境で作業しているので、証明書が自己発行されている可能性が非常に高いです(したがって、「要求されたターゲットへの有効な証明パスを見つけることができませんでした」)。 – mapto

+1

@maptoはい、ブラウザからサーバー証明書を取得するだけです。自己署名されているかどうかは関係ありません。どちらの場合も、発行者をトラストストアに追加する必要があります。自己署名されている場合、発行者は証明書自体です。 – Omikron

+0

これをデバッグしている間、このリンク(https://gist.github.com/michalbcz/4170520)で提供されているスタブTrustManagerも非常に便利でした。それでも、運用環境で使用するのはセキュリティ上の脆弱性です。 – mapto

関連する問題