java - Firma de un archivo jar con certificado de confianza para la implementación de JWS
certificate java-web-start (6)
Estoy esperando los comentarios de otros usuarios para estar seguro de que también funciona para ellos.
Basado en JaNeLA para el archivo - JNLP válido. WikiCleanerTest más importante conocido para WikiCleanerTest ..
Así que hay un resultado de ''parece funcionar aquí para identificar al editor''. Gran trabajo y gracias por la descripción del proceso.
Funciona mucho mejor que el que vi antes. :PAG
Jarsigner -verificar
s 292828 Sun Oct 20 17:57:58 EST 2013 META-INF/MANIFEST.MF
292645 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.SF
2017 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.RSA
0 Sun Oct 20 17:57:52 EST 2013 META-INF/
0 Wed Feb 11 15:04:50 EST 2009 META-INF/maven/
..
0 Sun Oct 20 17:57:32 EST 2013 org/xnap/commons/i18n/
sm 2837 Thu Sep 09 16:00:54 EST 2004 META-INF/info.xml
..
sm 214 Wed Feb 11 00:57:02 EST 2009 org/xnap/commons/i18n/LocaleChangeListener.class
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.
Re-run with the -verbose and -certs options for more details.
Entiendo la advertencia:
Este contenedor contiene entradas cuya cadena de certificados no está validada.
..puede ser ignorado.
Informe JaNeLA
JaNeLA muestra un error.
JaNeLA Report - version 11.05.17
Report for http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp
cvc-complex-type.2.4.a: Invalid content was found starting with element ''homepage''. One of ''{description, icon, offline-allowed, shortcut, association, related-content}'' is expected.
cvc-complex-type.2.4.a: Invalid content was found starting with element ''homepage''. One of ''{description, icon, offline-allowed, shortcut, association, related-content}'' is expected.
XML encoding not known, but declared as utf-8
Codebase + href ''http://site4145.mutu.sivit.org/WikiCleaner.jnlp'' is not equal to actual location of ''http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp''.
Desktop icons were subject to bug nnnn in earlier J2SE versions
Optimize this application for off-line use by adding the <offline-allowed /> flag.
''short'' description is longer than ''default'' description.
Downloads can be optimized by specifying a resource size for ''WikipediaCleaner.jar''.
The resource download at WikipediaCleaner.jar can be optimized by removing the (default) value of download=''eager''.
Lazy downloads might not work as expected for WikipediaCleaner.jar unless the download ''part'' is specified.
Resource type png of resource commons-nuvola-web-broom.png is not one of the allowable types of gif, jpg, jpeg.
Downloads can be optimized by specifying a resource size for ''commons-nuvola-web-broom.png''.
Icon loading & use can be optimized by specifying the width and height for commons-nuvola-web-broom.png
Ver el JNLP validado, y una versión corregida con tweak, a continuación.
Lanzamiento
Pero aquí está la verdadera mala noticia:
Aquí hay algunos detalles del certificado:
Nicolas Vervelle (Nicolas Vervelle)
- Asunto: CN = Nicolas Vervelle, OU = WikipediaCleaner, O = WikipediaCleaner, L = París, ST = Francia, C = FR
Desactualizado Java
Aquí hay una extraña advertencia que no entiendo ..
La aplicación. está solicitando 1.5.0+ por lo que cualquier versión 1.7+ debe ser aceptada sin duda.
Afirma estar solicitando 1.6 (probablemente porque no tengo 1.5 en tiempo de ejecución instalado). Lo único que puedo pensar es que está activando la advertencia es la inclusión de una micro versión, que no es necesaria.
JNLP
Aquí está el JNLP validado anteriormente:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
<information>
<title>WPCleaner</title>
<vendor>User:NicoV</vendor>
<description>WPCleaner</description>
<description kind="short">A tool for Wikipedia maintenance</description>
<homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
<icon href="commons-nuvola-web-broom.png"/>
<shortcut>
<desktop/>
</shortcut>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5.0+" java-vm-args="-Xmx512M"/>
<jar href="WikipediaCleaner.jar" download="eager" main="true"/>
</resources>
<application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>
Aquí hay un reemplazo sugerido. Es válido de acuerdo con JaNeLA (advertencias de barra que podemos ignorar). También incluye otro ajuste al atributo de versión mínima.
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
<information>
<title>WPCleaner</title>
<vendor>User:NicoV</vendor>
<!-- Should be here.. -->
<homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
<description>WPCleaner</description>
<description kind="short">A tool for Wikipedia maintenance</description>
<icon href="commons-nuvola-web-broom.png"/>
<shortcut>
<desktop/>
</shortcut>
</information>
<security>
<all-permissions/>
</security>
<resources>
<!-- the micro-version request might be triggering the
Out-Of-Date Java version warning -->
<j2se version="1.5+" java-vm-args="-Xmx512M"/>
<jar href="WikipediaCleaner.jar" download="eager" main="true"/>
</resources>
<application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>
He desarrollado un programa de código abierto, WPCleaner, que se distribuye a través de Java Web Start. La versión actual está disponible en http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp
Con las actualizaciones recientes en Java, cada vez es más difícil implementar aplicaciones Java a través de Java Web Start cuando necesita que la aplicación tenga algunos permisos (escribir en las preferencias, acceder a otros sitios web, ...)
Mi aplicación fue autofirmada, lo cual estaba bien antes, pero las nuevas actualizaciones requieren que los usuarios la acepten cada vez que la ejecuten, no solo de una vez por todas, si así lo desean. Entonces, decidí usar un certificado de confianza para firmar mi solicitud.
Obtuve uno de Certum (aparentemente, son gratuitos para desarrolladores de código abierto), luego de esta discusión: ¿ Certificado de firma de código para proyectos de código abierto?
He generado un nuevo archivo jar, firmado con este certificado (archivo jar disponible en http://site4145.mutu.sivit.org/WikiCleaner/WikipediaCleanerTest.jar ), pero todavía tengo problemas: cuando inicio la aplicación a través de JWS Java todavía muestra una ventana de advertencia que no me permite confiar en la aplicación de una vez por todas. El editor aún se muestra como DESCONOCIDO, pero cuando veo los detalles del mensaje, se está utilizando mi nuevo certificado de Centrum.
¿Alguien tiene una idea de lo que estoy haciendo mal? Pensé que tener un certificado de una CA de confianza (Centrum parece estar en cacerts de Java) permitiría a los usuarios aceptar el certificado de una vez por todas.
Gracias
PD: Cuando ejecuto jarsigner -verify
, jarsigner -verify
la siguiente advertencia: "Este contenedor contiene entradas cuya cadena de certificados no está validada".
Como se mencionó here , para eliminar la advertencia de DESCUBRIMIENTO DESCONOCIDO, puede agregar el certificado que usó para firmar el tarro en el Frasco del firmante del Panel de control de Java: Configurar Java -> Seguridad -> Administrar certificados -> Opción de frasco del firmante -> Importar.
Creo que finalmente logré hacerlo siguiendo este procedimiento:
- Instaló el certificado proporcionado por Certum en Chrome a través de la interfaz de su sitio web.
- Exportó la clave privada como .pfx desde Chrome (Configuraciones, Administrar certificados, Exportar, Exportar la clave privada, PKCS # 12, ...)
- Usé la interfaz gráfica de usuario de KeyTool (interfaz de usuario con interfaz de Java para las herramientas clave) para crear un p12 completo: certificado de raíz Certum importado como certificado de confianza, certificados intermedios importados como certificados de confianza, importé mi .pfx como un par de claves
- Firmó el frasco con esta p12.
Parece que funciona para mí, estoy esperando los comentarios de otros usuarios para estar seguros de que también funciona para ellos.
Edición: Intenté nuevamente exportar el certificado de Chrome y vi que hay una opción para incluir la cadena de certificados en la exportación. Al hacer esto, ni siquiera necesito usar la GUI de KeyTool después. He vuelto a desplegar la versión de prueba firmada con esta nueva p12:
- Instaló el certificado proporcionado por Certum en Chrome a través de la interfaz de su sitio web.
- Exportó la clave privada como .pfx desde Chrome (Configuraciones, Administrar certificados, Exportar, Exportar la clave privada, PKCS # 12 + incluir cadena de certificados, ...)
- Firmó el frasco con esta p12.
En Linux, el siguiente procedimiento funcionó para mí. Se basa en la respuesta de Eric David.
Consigue tu certificado
Vaya al sitio web de "Certum Certification" en la sección "Firma de código OpenSource". Compra un certificado y sigue el procedimiento de creación.
Obtenga la clave pública para la firma de código
Obtenga la clave pública de firma de código de Certum CA , probablemente la clave CA SHA2 cscasha2.cer .
Convertir el certificado al formato pkcs12
- Importe su propio certificado (el que recibió de Certum) en Firefox:
Configuraciones de elementos de menú - avanzado - certificados - mostrar certificados. - Importe la clave puplic de CA SHA2 (utilizada por Certum para firmar su certificado):
ficha cert. autoridades - importacion - Verificar. Debe decirse que ha sido verificado:
pestaña de certificados propios - mostrar. - Exportar el certificado:
pestaña de certificados propios - guardar - como pkcs12 (por ejemplo, a mycert.p12)
Convertir de formato pkcs12 a formato jks
Encuentra el alias usado en tu archivo pkcs12. Será similar a " unizeto technologies sa id von open source developer, YOUR NAME ".
keytool -list -v -storetype pkcs12 -keystore mycert.p12 > out.txt
grep Aliasname out.txt
Luego convierta el archivo pkcs12 al formato jks de java. Este paso podría omitirse, pero una vez hecho es conveniente.
keytool -importkeystore -srckeystore mycert.p12 -srcstoretype pkcs12 -srcalias "ALIASNAME" -destkeystore mycert.jks -deststoretype jks -deststorepass PASSWORD -destalias SHORTALIAS
Firma tu archivo jar
Para evitar advertencias al usuario de inicio web, el archivo de manifiesto jar debe contener los siguientes atributos:
- Nombre de la aplicación: APPNAME
- Permisos: todos los permisos
- Codebase: URL
- Código de base de la biblioteca de aplicaciones permitida: URL
Firme su archivo jar usando el siguiente comando:
jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS
Resolví el mismo problema que el mío hoy con esto:
Manifest-Version: 1.0
Trusted-Library: true
Application-Library-Allowable-Codebase: *
Trusted-Only: false
Application-Name: My app
Permissions: all-permissions
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Caller-Allowable-Codebase: *
Codebase: *
[Actualización 2017] La firma de código de fuente abierta de Certum ahora usa una tarjeta flash criptográfica como clave privada y debe estar conectada para la activación e instalación de certificados, así como para la firma del código. La clave cuesta 125 $ (+ tarifa de envío) y el certificado de 1 año solo cuesta 40 $. Puede solicitar un descuento.
Aquí están los siguientes pasos para firmar su archivo jar desde cero.
Instrucciones
Las instrucciones en inglés son difíciles de encontrar y no están actualizadas. El siguiente procedimiento se basa en estos 2 documentos:
- Instrucciones parciales de instalación y activación (en inglés) : falta la parte del archivo "bundle.pem".
- Instrucciones completas de instalación y activación (polaco)
Crea, activa e instala tu certificado:
- Vaya al sitio web de "Certum Certification" en la sección "Firma de código de OpenSource" y solicite su certificado.
- Una vez que reciba la tarjeta flash criptográfica (me tomó 15 días), conéctela, instale el controlador y el software ProCertum CardManager desde la tarjeta.
- Vaya a su cuenta de Certum y siga el proceso de activación de su certificado recién pedido.
Consejo: La aplicación CryptoAgent Java Web Start solo se ejecuta con un JDK (no JRE) <9 (por lo tanto, JDK 7 u 8).
- Recibirá un correo solicitando algunos documentos oficiales (tarjeta de identificación, factura de alquiler, etc.) y un procedimiento de verificación por correo electrónico.
- Envíe la activación necesaria de documentos e información. Recibirá otro correo solicitando la instalación del certificado (la verificación se realizó dentro de 1 hora).
- Instale el certificado en la tarjeta criptográfica siguiendo el procedimiento Almacenamiento del certificado en la tarjeta (consulte las instrucciones en inglés, parte 4)
Obtener el archivo "bundle.pem"
Este archivo es obligatorio para obtener una cadena de certificado válida al firmar su solicitud (consulte la parte 7.1.2 en las instrucciones en polaco).
Básicamente, consiste en concatenar en un archivo de formato de texto plano 1) su certificado y 2) la clave pública Certum Code Signing CA SHA2 .
- Abra proCertum CardManager >> pestaña Leer >> pestaña Común >> Seleccione su certificado y haga clic en "Mostrar detalles"
- Exporte su certificado: x509 - base-64
- Descargue el Código de firma de Certum CA SHA2 en formato PEM (de la lista de certificados raíz de Certum).
- Cree el archivo de texto "bundle.pem" mediante la concatenación de estos 2 certificados (primero su certificado y luego el certificado Certum).
Firma tu archivo jar con Jarsigner
- Cree el archivo "provider.cfg" como se explica en el punto 7.2 de las instrucciones en inglés.
- Necesita el alias de su certificado (y no el nombre del propietario ) para firmar su tarro. Para obtenerlo ejecute el siguiente comando:
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
- Una vez que haya preparado el alias , los archivos provider.cfg y bundle.pem , simplemente firme su archivo jar con el siguiente comando:
jarsigner -keystore NONE -certchain "bundle.pem" -tsa "http://time.certum.pl" -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]" "[your_code].jar" "[your_alias]"
Personalmente, uso un script Ant para firmar los archivos jar de mi aplicación. Ver la tarea signjar del proyecto ANT.