java - Proveedor de JCE a medida en IBM AIX
cryptography (1)
Estoy escribiendo un nuevo proveedor de JCE para un cliente, porque necesito exponer algunos Cipher personalizados. Después de extender CipherSpi
y ProviderSpi
, estoy listo para construir. Entonces le pregunté al cliente a qué versión de Java estaban apuntando. Ellos respondieron con:
# java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap3260sr9fp2-20110627_03(SR9 FP2)) IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260sr9-20110624_85526 (JIT enabled, AOT enabled) J9VM - 20110624_085526 JIT - r9_20101028_17488ifx17
GC - 20101027_AA)
JCL - 20110530_01
#
Maldita sea. Entonces están usando IBM Java 1.6.0 en una máquina AIX.
He escrito la mayor parte del Proveedor de JCE a medida para respaldar la funcionalidad requerida (utilizando la guía Cómo implementar una guía de proveedores ), extendiendo las clases abstractas ProviderSpi
y CipherSpi
desde los paquetes com.sun.*
. ¿Debo obtener IBM Java JDK y extender las clases abstractas desde com.ibm.*
? ¿O puedo simplemente firmar mi JCE proveedor JAR utilizando mi certificado de firma de código Java con raíz de Sun y ponerlo directamente en el lugar correcto en el sistema AIX? (Uno de estos es tonto, pero no sé cuál).
Simplemente no sé lo suficiente sobre los sabores de JCE / JVM para saber si ahora necesito un certificado de firma de código Java con raíz de IBM (si existe uno), o si la firma enraizada en Sun es suficiente.
Tanto Oracle (Sun) como IBM JRE se usan entre sí certificados para verificar la firma del proveedor. Entonces, si tiene un proveedor firmado usando un certificado de Sun , funcionará en IBM JRE . Entonces, sí, existe un certificado de firma de código Java con raíz de IBM (la CA existe, es casi imposible obtener el certificado incluso si se encuentra dentro de IBM), pero la firma con raíz de Sun es suficiente . Su proveedor de cifrado funcionará en IBM JRE. No necesita usar ningún paquete com.ibm
. Además, es posible eludir el requisito de firma del proveedor: problema de verificación de la firma del proveedor criptográfico de Java HotSpot
Explicación detallada
1. Certificados
La verificación del certificado del proveedor se realiza mediante clases Java JCE internas 1.6.
- en Oracle
javax.crypto.SunJCE_b#a(X509Certificate c)
- en IBM
javax.crypto.b#a(X509Certificate c)
Los certificados de CA utilizados para verificar las firmas se almacenan en archivos de clase. En Oracle JVM como cadenas simples. IBM está haciendo esto de manera más inteligente: las cadenas de certificados están oscurecidas. Para no verlos, debe usar este fragmento de código:
final char[] key = {0x5f, 38, 3, 111, 110};
char[] decode(final char[] input) {
final char[] output = new char[input.length];
for (int i = 0; i < output.length; i++) {
output[i] = (char)(input[i] ^ key[i % 5]);
}
return output;
}
Entonces, en IBM Java 1.6 puede encontrar certificados de firma de código de CA:
-
CN = JCE Code Signing CA, OU = Java Software Code Signing, O = Sun Microsystems Inc, L = Palo Alto, S = CA, C = US
-
CN = JCE Code Signing CA, OU = IBM Code Signing, O = IBM Corporation, C = US
-
CN = JCE Code Signing - Framework, OU = IBM Code Signing, O = IBM Corporation, C = US
2. Clases de proveedores base
Debería extender la clase java.security.Provider
. Por ejemplo, com.ibm.crypto.provider.IBMJCE
incluido con IBM JRE lo hace. (AFAIK no hay clase ProviderSpi
.) También debe usar la clase javax.crypto.CipherSpi
. Por ejemplo, lo hace com.ibm.crypto.provider.DESCipher
del proveedor de IBM.