Como posso forçar jarsigner a assinar arquivos JAR?
Pergunta
Nosso produto é interrompida em Java versão 1.5.0_13 e gostaríamos de atualizar. Nosso software implementa um grande número de frascos via Java Web Start; todos esses frascos deve ser assinado. No entanto, um par dos frascos não contêm arquivos de classe, e começando com Java versão 1.5.0_14, parece que os escolhe utilidade jarsign não assinar qualquer frasco que não contém arquivos de classe.
O que posso fazer para forçar jarsign a assinar esses frascos? Ou o que posso fazer para distribuir esses frascos através de Java Web Start sem assiná-los? E existe em qualquer lugar onde esta alteração jarsign com versões 1.5.0_14 e acima está documentado? Eu não posso encontrá-lo no notas de lançamento .
Solução
Eu não sou capaz de verificar que não há qualquer problema. você pode olhar através de e ver o que pode ser diferente em seu ambiente? Estou rodando no Windows 7 RC.
Vamos verificar a versão:
C:\temp>java -version java version "1.5.0_14" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03) Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode, sharing)
Vamos ver o que vai ser no nosso jar:
C:\temp>dir /s /b com C:\temp\com\rdc C:\temp\com\rdc\test C:\temp\com\rdc\test\logging.properties
Vamos fazer o jar:
C:\temp>jar -cfv test-source.jar com/* added manifest adding: com/rdc/(in = 0) (out= 0)(stored 0%) adding: com/rdc/test/(in = 0) (out= 0)(stored 0%) adding: com/rdc/test/logging.properties(in = 13) (out= 15)(deflated -15%)
Vamos sinal do frasco:. Eu estou usando um certificado auto-assinado
C:\temp>jarsigner -signedjar test-dest.jar test-source.jar vinay Enter Passphrase for keystore: Warning: The signer certificate will expire within six months.
Vamos ver o que está no nosso jar assinado:
C:\temp>jar tvf test-dest.jar 155 Wed Jul 15 23:39:12 BST 2009 META-INF/MANIFEST.MF 276 Wed Jul 15 23:39:12 BST 2009 META-INF/VINAY.SF 1130 Wed Jul 15 23:39:12 BST 2009 META-INF/VINAY.DSA 0 Wed Jul 15 23:37:18 BST 2009 META-INF/ 0 Wed Jul 15 19:44:44 BST 2009 com/rdc/ 0 Wed Jul 15 19:44:58 BST 2009 com/rdc/test/ 13 Wed Jul 15 23:37:10 BST 2009 com/rdc/test/logging.properties
OK, ele certamente parece ter sido assinado, e não tem classes. Vamos olhar o conteúdo de MANIFEST.MF
:
Manifest-Version: 1.0 Created-By: 1.5.0_14 (Sun Microsystems Inc.) Name: com/rdc/test/logging.properties SHA1-Digest: Ob/S+a7TLh+akYGEFIDugM12S88=
E o conteúdo de VINAY.SF
:
Signature-Version: 1.0 Created-By: 1.5.0_14 (Sun Microsystems Inc.) SHA1-Digest-Manifest-Main-Attributes: 4bEkze9MHmgfBoY+fnoS1V9bRPs= SHA1-Digest-Manifest: YB8QKIAQPjEYh8PkuGA5G8pW3tw= Name: com/rdc/test/logging.properties SHA1-Digest: qXCyrUvUALII7SBNEq4R7G8lVQQ=
Agora, vamos verificar o jar:
C:\temp>jarsigner -verify -verbose test-dest.jar 155 Wed Jul 15 23:51:34 BST 2009 META-INF/MANIFEST.MF 276 Wed Jul 15 23:51:34 BST 2009 META-INF/VINAY.SF 1131 Wed Jul 15 23:51:34 BST 2009 META-INF/VINAY.DSA 0 Wed Jul 15 23:37:18 BST 2009 META-INF/ 0 Wed Jul 15 19:44:44 BST 2009 com/rdc/ 0 Wed Jul 15 19:44:58 BST 2009 com/rdc/test/ smk 13 Wed Jul 15 23:37:10 BST 2009 com/rdc/test/logging.properties 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 signer certificate will expire within six months. Re-run with the -verbose and -certs options for more details.
Em face disso, tudo parece estar em ordem. você pode verificar se seus certificados expiraram ou foram revogados? Você está usando certificados auto-assinados ou certificados reais? Ou ter eu não entendi qual é seu problema?
Outras dicas
Para qualquer pesquisa sobre este assunto, determinou-se que só afeta certas versões posteriores do Java 1.5, os de 1.5.0_14 em diante, eu acredito. Parece ser fixado nas últimas versões do 1.5, e é definitivamente fixada em 1,6.
Você pode colocar arquivos de classe fictícios em se você precisa. Provavelmente de mau gosto, mas talvez necessário.
BTW, eu tentei a mesma coisa que Vinay, mas com o JDK 1.5.0_17 jarsigner, e um certificado Verisign adequada, e obteve os mesmos resultados. Jarsigner trabalhou, eo frasco verificada usando jarsigner -verify.
Adicionando sobre isso: eu estou usando o Java Web Start, e eu tenho um frasco que contém apenas imagens. Com um JDK 1.6_05 (07, 10, também), e uma geração Formiga, que é assinado sem um problema (com uma cert auto-assinado). Assim, como os outros descrita, não parece estar ligada ao frasco contendo arquivos .class ou não.
É um tiro longo, mas o Ant SignJar tarefa pode ser capaz para convencer jarsign para fazer a coisa certa. Há um monte de opções lá que pode fazer pender a balança.