在IBM AIX上定制JCE提供程序

bel*_*ial 5 java aix cryptography jce

我正在为客户端编写一个新的JCE Provider,因为我需要公开一些自定义Cipher.延长后CipherSpiProviderSpi,我准备再建.所以我问客户端他们定位的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
#
Run Code Online (Sandbox Code Playgroud)

该死的.所以他们在AIX机器上使用IBM Java 1.6.0.

我编写了大部分定制的JCE提供程序来支持所需的功能(使用如何实现提供程序指南),从包中扩展ProviderSpiCipherSpi抽象类com.sun.*.我是否需要获取IBM Java JDK并从中扩展抽象类com.ibm.*?或者我可以使用我的Sun-rooted Java代码签名证书来签署我的JCE提供程序JAR,并将其直接放到AIX系统上的正确位置?(其中一个是愚蠢的,但我不知道哪个).

我对JCE/JVM风格知之甚少,不知道我现在是否需要一个基于IBM的Java代码签名证书(如果有的话),或者Sun-rooted签名是否足够?

zac*_*usz 4

Oracle (Sun) 和 IBM JRE 都使用彼此的证书来验证提供者签名。因此,如果您有使用 Sun 证书签名的提供商,它将在 IBM JRE 上运行。所以是的 - IBM 根的 Java 代码签名证书存在(CA 存在,即使您在 IBM 内部也几乎不可能获得该证书),但Sun 根的签名就足够了。您的加密提供程序将在 IBM JRE 上运行。您不需要使用任何com.ibm包。此外,可以绕过提供者签名要求:Java HotSpot Cryptographic Provider Signature Verification issues

详细解释

1. 证书

提供者证书验证由内部 Java 1.6 JCE 类完成。

  • 在甲骨文中javax.crypto.SunJCE_b#a(X509Certificate c)
  • 在IBMjavax.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;
}
Run Code Online (Sandbox Code Playgroud)

所以在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

2. 基础提供者类

你应该延长java.security.Provider上课时间。例如,com.ibm.crypto.provider.IBMJCE与 IBM JRE 捆绑在一起就可以做到这一点。(据我所知,没有ProviderSpi类。)您也应该使用javax.crypto.CipherSpi类。例如com.ibm.crypto.provider.DESCipher,IBM 提供商就是这么做的。