48

JAR ファイルにコード署名しようとしていて、JDK 1.7u1 を使用しています。GoDaddy コード署名証明書を取得し、次の手順 (アプローチ 1) に従いました: http://help.godaddy.com/article/4780

JAR は正常に署名しますが、コマンドを実行しようとすると、 jarsigner -verifyJDK 1.7u1 を使用して署名済みの JAR で次の出力が得られます。

s        180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
      [CertPath not validated: null]

         342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
        6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
           0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm      2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
      [CertPath not validated: null]


  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

Warning: 
This jar contains entries whose certificate chain is not validated.

jarsigner -verifyまた、JDK 1.6u26 および 1.6u14 で上記と同じ JAR を使用してコマンドを試したところ、問題なく動作しました。(1.6u26 からの以下の出力)。

         180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF
         342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
        6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
           0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm      2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      [KeyUsage extension does not support code signing]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]


  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

JDK 1.7 用に適切に署名された JAR を取得するために必要な追加の手順がありませんか?

4

8 に答える 8

90

私は同じ問題を抱えていましたが、それが他の人に役立つ場合、問題はjarsignerがキーストアを見つける方法にあります。

問題を解決するには、次のようにします。

jarsigner -verify -keystore xxxx.jks mysignedjar.jar
于 2012-05-12T15:36:51.320 に答える
50

あなたは何も見逃していませんし、この問題を抱えているのはあなただけではありません. ほぼ 12 時間の闘争の後、問題の根本は のバイナリJDK 1.7と Java の古いバージョン ( JRE-1.6. より正確には、keytoolが付属していますがJRE、とJDKの両方が付属しています。keytooljarsigner

そのため、問題を解決するためにJDK-1.7、システムから完全にアンインストールしてインストールしJDK-1.6 Update 30ました。さて、私がそうするなら、あなたが期待していると私が信じている警告なしjarsigner -verify -verbose -certs blah.jarに生成されます.jar verified

于 2011-12-16T05:42:57.643 に答える
22

これは、無視できる単なる警告です。

本当に無視したくない場合は、検証時にキーストアの場所を jarsigner に伝えてください。

jarsigner -verbose -verify -keystore ${KEYSTORE_PATH} ${YOUR_JAR_FILE}

これは、JDK 7 の新機能にすぎません。

于 2013-09-12T08:00:31.370 に答える
8

「DigiCert SHA2 Assured ID Code Signing CA」でも同様の問題がありました。すべての Oracle Java バージョンと OpenJDK は同じように動作しました。Digicert のサポートにより、このページにリダイレクトされましたが、ここに記載されている内容は検証プロセスにも役立ちませんでした。

アプレットに署名しようとしているので、ブラウザでも検証できるようにする必要があるため、キーストア パスを jarsigner -verify に提供するトリックは適用されません。

主な問題は、SHA1 証明書に適用される同じ手順のリストが常に機能し、SHA2 では機能しないため、SHA1 の代わりに SHA2 を使用して証明書を操作する場合の keytool のバグのようです。keytool は jks にインポートされた証明書の「連鎖可能性」を検出できないため、jarsigner は適切な証明書チェーンを署名済みの jar に埋め込まず、META-INF/myalias に格納されている最終的な証明書のみが存在するようです。代わりに RSA ファイルを使用します (openssl pkcs7 -in myalias.RSA -print_certs -inform DER -out certs.crt で検証可能)。

Digicert は「...最初はルートが実際に正しくまたは完全にインポートされないという問題が時々見られますが、ルートを指すインポート コマンドを再度実行すると、これを修正できます」と提案しましたが、これでも私の場合は役に立ちませんでした。

どの証明書がチェーンに含まれようとしているのかを keytool に明示的に伝える方法がないため、openssl を使用してチェーンを構築し、次のようにインポートすることにしました。

cat TrustedRoot.pem DigiCertCA2.pem my.crt  >chain
openssl pkcs12 -nodes -export -in my.crt  -inkey my.key -out tmp.p12 -name myalias -certfile chain
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore tmp.p12 -srcstoretype PKCS12

この後、mykeystore.jks には自分の証明書のみが含まれているように見えますが、keytool -list コマンドでリストすると、DigiCertCA2 やルートは含まれていませんが、-v (詳細) を使用すると、チェーンの深さとその証明書が開示されます。

~/$ keytool  --list --keystore mykeystore.jks  -v|grep -e chain -e Certificate\\[
Enter keystore password:  123456
Certificate chain length: 3
Certificate[1]:
Certificate[2]:
Certificate[3]:

そして、これは jarsigned が jar に適切に署名するために必要なものです。つまり、適切な証明書チェーンを埋め込み、最終的なブラウザー ユーザーに対しても jar を検証可能にするためです。

于 2015-03-18T12:51:26.390 に答える
0

証明書が Entrust からのものである場合は、新しいルート証明書を使用していることを確認してください。

http://www.entrust.net/knowledge-base/technote.cfm?tn=7875

問題:

Basic Constraints フィールドがないため、SLL 証明書の検証に失敗したことを示すエラー メッセージが表示されます。

解決:

2009 年、Entrust は 2048 ビットのルート証明書を再リリースして、基本制約フィールド (cn=Entrust.net Certification Authority (2048)、2029 年 7 月 24 日まで有効) を含めました。Entrust は、Windows および Java のルート アップデートを通じて、元の 2048 ビット ルートのプッシュを停止しました (バージョン 1.6 アップデート 22 以降)。基本的な制約を含む更新されたルート証明書は、次の場所にあります。

https://www.entrust.net/downloads/binary/entrust_2048_ca.cer

于 2013-10-17T00:07:54.833 に答える
0

証明書を p12 (jarsigner によって使用される) に作成/エクスポートするときは、以下が選択されていることを確認してください (たとえば、Internet Explorer ウィザードを使用してエクスポートする場合)。エクスポート ウィザードで以下を選択する必要があります。

「秘密キーをエクスポートする」「可能であれば証明書パスにすべての証明書を含める」「すべての拡張プロパティをエクスポートする」をオプション .PFX または PKCS #12 でオンにします。

最初に p12 を適切に作成すれば、jarsign に特別な労力は必要ありません。

于 2014-07-09T00:18:16.327 に答える