saber para generar firmar firma crear como codigo certificado java ssl certificate code-signing

para - ¿Los certificados de firma de código Java son los mismos que los certificados SSL?



generar certificado jks (4)

Cuando importo un nuevo certificado de CA en Firefox (etc.) tengo la opción de elegir en qué certificado confío:

  • Firmar servidores
  • Código de firma (como su applet)
  • Firmar certificados de correo electrónico

Entonces, para mí, la respuesta es: Sí, son lo mismo. Además, ¿por qué no generar el suyo con OpenSSL (man openssl, man x509, man req, etc. en Unix)? ¿Quieres silenciar las advertencias o quieres que otras personas a las que nunca has conocido confíen en tu código? Si no necesita que otros usuarios encadenen la confianza a la CA ancla incluida con su navegador, sistema operativo, etc., entonces utilice OpenSSL para generar la suya propia.

Y pregunte "¿Cómo uso OpenSSL para generar mis propios certificados?" si el último es tu elección.

Estoy buscando un certificado de firma de código Java para que mis applets de Java no arrojen esas advertencias de seguridad aterradoras. Sin embargo, todos los lugares que he encontrado ofreciéndoles cobran (en mi opinión) demasiado, como más de USD200 por año. Mientras se investiga, un certificado de firma de código parece casi exactamente lo mismo que un certificado SSL .

La principal pregunta que tengo: ¿es posible comprar un certificado SSL, pero usarlo para firmar los applets de Java?


Los certificados X.509 pueden incluir campos de uso de clave (KU) y campos de uso de clave extendida (EKU). La nota técnica de Oracle que describe cómo crear un cartel de su RIA crea un certificado sin ningún indicador de uso de clave, que funciona bien (si puede obtener una CA confiable para que lo firme)

Pero cada vez más, los certificados de emisión de CA con estos campos clave de uso. Cuando están presentes, estos campos restringen el uso del certificado. El complemento java comprueba la presencia de estos campos en EndEntityChecker :

/** * Check whether this certificate can be used for code signing. * @throws CertificateException if not. */ private void checkCodeSigning(X509Certificate cert) throws CertificateException { Set<String> exts = getCriticalExtensions(cert); if (checkKeyUsage(cert, KU_SIGNATURE) == false) { throw new ValidatorException ("KeyUsage does not allow digital signatures", ValidatorException.T_EE_EXTENSIONS, cert); } if (checkEKU(cert, exts, OID_EKU_CODE_SIGNING) == false) { throw new ValidatorException ("Extended key usage does not permit use for code signing", ValidatorException.T_EE_EXTENSIONS, cert); } if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_SSL_CLIENT)) { throw new ValidatorException ("Netscape cert type does not permit use for SSL client", ValidatorException.T_EE_EXTENSIONS, cert); } // do not check Netscape cert type for JCE code signing checks // (some certs were issued with incorrect extensions) if (variant.equals(Validator.VAR_JCE_SIGNING) == false) { if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_CODE_SIGNING)) { throw new ValidatorException ("Netscape cert type does not permit use for code signing", ValidatorException.T_EE_EXTENSIONS, cert); } exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE); } // remove extensions we checked exts.remove(SimpleValidator.OID_KEY_USAGE); exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE); checkRemainingExtensions(exts); }

Los métodos de verificación se ven de la siguiente manera:

/** * Utility method checking if the extended key usage extension in * certificate cert allows use for expectedEKU. */ private boolean checkEKU(X509Certificate cert, Set<String> exts, String expectedEKU) throws CertificateException { List<String> eku = cert.getExtendedKeyUsage(); if (eku == null) { return true; } return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE); }

Entonces, si no se especifica KU o EKU, el verificador de KU o EKU felizmente devuelve verdadero.

Pero

  • si se especifican las KU, la firma digital KU debe ser una de ellas.
  • si se especifica alguna EKU, se debe especificar también la firma del código EKU (identificado por el oid 1.3.6.1.5.5.7.3.3) o el uso de EKU (identificado por el oid 2.5.29.37.0).

Finalmente, el método checkRemainingExtensions comprueba las EKU críticas restantes. Las únicas otras EKU críticas permitidas de estar presentes son

  • restricciones básicas (oid "2.5.29.19") y
  • nombre alt del sujeto (oid 2.5.29.17)

Si encuentra cualquier otra EKU crítica, devuelve falso.


Respuesta corta: No, son diferentes.

Respuesta larga: Es el mismo tipo de certificado y utiliza el mismo software criptográfico, pero el certificado tiene indicadores que indican para qué se permite su uso. La firma de código y el servidor web son diferentes usos.


Thawte ofrece certificados de firma de código here . Me imagino que otras Autoridades de Certificación también ofrecen este servicio. También puede crear certificados autofirmados, con keytool de Java .