我正在为客户端编写一个新的JCE Provider,因为我需要公开一些自定义Cipher。在扩展CipherSpi
和ProviderSpi
后,我已准备好构建。所以我问客户端他们定位的Java版本。他们回答说:
# 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
#
该死。所以他们在AIX机器上使用IBM Java 1.6.0。
我编写了大部分定制的JCE提供程序来支持所需的功能(使用How to Implement a Provider指南),从ProviderSpi
包中扩展CipherSpi
和com.sun.*
个抽象类。我是否需要获取IBM Java JDK并从com.ibm.*
扩展抽象类?或者我可以使用我的Sun-rooted Java代码签名证书来签署我的JCE提供程序JAR,并将其直接放到AIX系统上的正确位置? (其中一个是愚蠢的,但我不知道哪个)。
我对JCE / JVM风格知之甚少,不知道我现在是否需要基于IBM的Java代码签名证书(如果存在),或者Sun根签名是否足够?
答案 0 :(得分:4)
Oracle(Sun)和IBM JRE都使用彼此的证书来验证提供程序签名。因此,如果您使用Sun 的证书签署了提供程序,那么它将适用于IBM JRE 。所以是 - 存在IBM根源的Java代码签名证书(CA存在,即使您在IBM内部也几乎不可能获得证书),但 Sun-rooted签名就足够了。您的加密提供程序将在IBM JRE上运行。您不需要使用任何com.ibm
包。此外,可以绕过提供商签名要求:Java HotSpot Cryptographic Provider signature verification issue
提供者证书验证由内部Java 1.6 JCE类完成。
javax.crypto.SunJCE_b#a(X509Certificate c)
javax.crypto.b#a(X509Certificate c)
用于验证签名的CA证书存储在类文件中。在Oracle JVM中作为普通字符串。 IBM正在做得更聪明 - 证书字符串被遮盖了。为了让他们看不清楚,你应该使用这段代码:
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;
}
因此,在IBM Java 1.6中,您可以找到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
你应该扩展java.security.Provider
课程。例如,与IBM JRE捆绑在一起的com.ibm.crypto.provider.IBMJCE
就是这样做的。 (AFAIK没有ProviderSpi
类。)您也应该使用javax.crypto.CipherSpi
类。例如,来自IBM提供商的com.ibm.crypto.provider.DESCipher
就可以了。