Estoy buscando un Java firma de código certificado, así que mis Java applets) no arrojan advertencias de seguridad tan aterradoras. Sin embargo, todos los lugares que he encontrado ofreciéndoles cobran demasiado (en mi opinión) demasiado, como más de USD200 por año. Al hacer una investigación, un certificado de firma de código parece casi exactamente lo mismo que un SSL certificado.
La pregunta principal que tengo es: ¿es posible comprar un certificado SSL, pero usarlo para firmar Java applets?
Respuesta corta: No, son diferentes.
Respuesta larga: es el mismo tipo de certificado y utiliza el mismo software criptográfico, pero el certificado tiene banderas que indican para qué se permite su uso. La firma de código y el servidor web son usos diferentes.
Cuando importo un nuevo certificado de CA en Firefox (etc.) tengo la opción de elegir en qué certificado utilizo:
Entonces para mí la respuesta es: Sí, son lo mismo. Además, ¿por qué no generar el suyo propio con OpenSSL (man openssl, man x509, man req, etc. en Unix)? ¿Desea simplemente silenciar las advertencias o desea otro personas a las que nunca conociste para confiar en tu código? Si no necesita que otros usuarios confíen en cadena a las CA de anclaje incluidas con su navegador, sistema operativo, etc., use OpenSSL para generar el suyo propio.
Y pregunte "¿Cómo uso OpenSSL para generar mis propios certificados?" si este último es tu elección.
Los certificados X.509 pueden incluir campos de uso de clave (KU) y campos de uso de clave extendida (EKU). El nota técnica de Oracle que describe cómo crear el signo de su RIA crea un certificado sin ningún indicador de uso de clave, que funciona bien (si puede obtener una CA de confianza para firmarlo)
Pero cada vez más, CA emite certificados con estos campos de uso clave. 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 son los siguientes:
/**
* 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 corrector KU o EKU felizmente devuelve verdadero.
Pero
Finalmente, el método checkRemainingExtensions
verifica los EKU críticos restantes. Los únicos otros EKU críticos que pueden estar presentes son
Si encuentra algún otro EKU crítico, devuelve falso.
Thawte ofrece certificados de firma de código aquí . Me imagino que otras Autoridades de Certificación también ofrecen este servicio. También puede crear certificados autofirmados, con Java keytool .