`
ldbin
  • 浏览: 5796 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

有关aix环境下使用PKCS12服务端证书签名报错问题解决

阅读更多

声明:本文为作者原创,请勿随意转载,制造网络垃圾


客户使用pfx格式CA证书做服务端签名认证,在测试环境下(windows2003 weblogic9)一切正常,可以正常做服务端签名、签名校验操作,但是在正式环境下(aix weblogic9)下做服务端签名时却不能正常,证书加载的时候就报错了,报错信息如下:
Caused by: com.itrus.cryptorole.CryptoException: java.io.IOException: Private key decryption error: (java.security.InvalidKeyException: Illegal key size)
at com.itrus.cryptorole.bc.SenderBcImpl.initCertWithKey(SenderBcImpl.java:173)
at com.xxsoft.security.pki.adapter.ITrusChinaCertSigner.signMsgData(ITrusChinaCertSigner.java:76)
... 84 more
Caused by: java.io.IOException: Private key decryption error: (java.security.InvalidKeyException: Illegal key size)
at com.ibm.crypto.provider.PKCS12KeyStore.engineLoad(Unknown Source)
at java.security.KeyStore.load(KeyStore.java:1173)
at com.itrus.cryptorole.bc.SenderBcImpl.initCertWithKey(SenderBcImpl.java:150)
... 85 more

1、初步怀疑为正式环境下证书弄错,经过多次检查,及将正式环境证书替换到测试环境验证,均一切正常,排除证书问题,也排除了证书路径设置错误问题已经秘密设置错误问题。

2、通过报错中的at com.ibm.crypto.provider.PKCS12KeyStore.engineLoad信息,怀疑为jdk兼容问题,经检查,发现测试环境下使用的为sun jdk1.5,而正式环境由于是ibm的小型机,安装是是ibm的aix系统,使用的是默认安装的ibm jdk1.5 
初步判定为jdk的兼容性问题造成。

 
3、 经过网上搜索资料,发现也有人碰到类似的问题,很多人回答也都是jdk的兼容性问题,但均没能给出具体的解决方案,或者说是使用ibm的下对pkcs12证书的解析方式来弄,但是由于使用的为CA厂商的签名认证CA和他们的API,无法修改他们的API,只能直接咨询CA厂商的相关技术人员。沟通了老半天他们也没能给出一个合理满意的答复,总是纠结在我们是否在aix系统中将路径配置错误的问题上。最后说下周会派相关技术人员现场支持看一下情况……


4、 经咨询公司安全方面同事,建议使用开源安全框架bouncycastle替换原有的默认的安全签名算法实现,并设置java.security中的相关参数来使设置生效。


5、 解决问题首先需要在测试环境下重现问题,Windows环境下问题重现

首先下载一个ibm的官方的jdk1.5,ibm官方jdk下载地址为http://www.ibm.com/developerworks/java/jdk/,经访问发现只提供一个版本的可以安装在windows环境下的jdk,而且要求安装的机器必须为ibm的机器或者联想的机器,本人测试机器虽为联想的,但是依然安装失败,经网上搜索发现,有些人提供一些将该版本的jdk安装版解包变成可以使用的方法,但是操作步骤较为复杂,暂时放弃;再次搜索ibm的官方网站,发现ibm其实是有提供一个eclipse环境中可以使用的jdk的,下载下来配置到eclipse环境中,编写服务端签名测试程序,问题重现。
下载地址:
https://www14.software.ibm.com/webapp/iwm/web/reg/signup.do?source=idpe&S_TACT=105AGX05&S_CMP=JDK&lang=en_US&S_PKG=win300


6、 参照上述4中提供的方法设置对应的JAVA_HOME/jre/lib/security/java.security文件参数为
security.provider.1 =org.bouncycastle.jce.provider.BouncyCastleProvider
默认使用的第一个实现为.BouncyCastleProvider,经测试,依然报错,但报错信息变为:
Caused by: java.lang.SecurityException: Cannot set up certs for trusted CAs
at javax.crypto.b.<clinit>(Unknown Source)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:192)
... 7 more
Caused by: java.security.PrivilegedActionException: java.security.InvalidKeyException: Public key presented not for certificate signature
at java.security.AccessController.doPrivileged(AccessController.java:246)
... 10 more
Caused by: java.security.InvalidKeyException: Public key presented not for certificate signature
at org.bouncycastle.jce.provider.X509CertificateObject.checkSignature(Unknown Source)
at org.bouncycastle.jce.provider.X509CertificateObject.verify(Unknown Source)
at javax.crypto.b.a(Unknown Source)
at javax.crypto.b.access$500(Unknown Source)
at javax.crypto.b$0.run(Unknown Source)
at java.security.AccessController.doPrivileged(AccessController.java:242)
... 10 more


7、 无意中搜索中发现一篇介绍java安全的文档《关于Java加密扩展的出口限制》(文档地址http://www.blogjava.net/security/archive/2006/03/08/34381.html)中介绍到sun的默认jdk对密码算法的长度有个限制,只有另外下载一个无限制的设置文件才能使用更多长度的算法。突然意识到ibm的jdk中是否就是存在这种限制,而测试环境使用的sun jdk反而去掉该限制了呢?
再次搜索,发现确实存在这种情况,而且ibm也提供一个无限制的实现,替换使用之后即可解除该限制,具体可见:http://www-01.ibm.com/support/docview.wss?uid=swg21201170中的介绍。
立即下载并替换掉JAVA_HOME/jre/lib/security/中现有的两个包。再次测试,服务端签名及签名验证均通过,一切正常。

8、 正式aix环境下使用同样的方式替换对应的文件(先备份,再替换),重新启动系统服务,测试正常。


9、 其实打开对应的两个的两个替换的jar可以发现,里面其实有相关的对签名加密算法的定义的,如下:
解除限制的jar中的文件内容:

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission; 
};
aix系统中默认的文件的中的文件内容:
// Some countries have import limits on crypto strength. This policy file is worldwide importable.
grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128, 
                                     "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128, 
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", 2048;
    permission javax.crypto.CryptoPermission *, 128;
};

 

从以上可以很明显的看出,原生态的aix系统中ibmjdk对算法只定义了文件中的几种,其他的应该是全部不支持的。

 

 

0
1
分享到:
评论

相关推荐

    创建pkcs12格式数字签名证书的Java代码

    依托Bouncycastle库创建pkcs12格式数字签名证书的Java代码,具体应用方法可以参考本人翻译的博客《通过Java编程创建X.509格式的数字签名证书》。

    使用数字证书进行PKCS#7数字签名

    越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。

    php 通过CFCA证书实现RSA的PKCS7格式的签名和验签步骤

    本文件包括了demo和安装对应的环境、安装教程、简单易懂,正常php的rsa签名是使用openssl_sign,但是对应java中CFCASignature.signature的签名的签名时候对不上,要使用扩展php_com_dotnet并且对应安装签名的环境 ...

    pkcs12中文版.pdf

    PKCS标准规范了个人身份信息便携格式; 他用于将证书信息、私钥信息、和证书CA链等打包成一个安全的便于...PKCS格式的文件使用文本方式是无法直接查看的。 我们经常说的PFX格式的证书其实就是PKCS标准的身份信息文件

    PFX 证书制作工具(PKCS#12)

    带有私钥的证书,由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以.pfx作为证书文件后缀名。 只有pfx格式的数字证书是包含有私钥的

    pkcs证书生成, 签名, 加密

    pkcs证书生成, rsa, rsa2, MD5签名, 加密, aes加密等 pkcs证书生成, rsa, rsa2, MD5签名, 加密, aes加密等

    C# pkcs # 7 签名 验签

    C# 语言,.net平台下实现pkcs # 7 签名 验签,C# 语言,.net平台下实现pkcs # 7 签名 验签

    PKCS#7 数字签名 软件包

    PKCS#7 数字签名 所用到的 软件包

    PKCS7签名的ASN1格式

    可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...

    pkcs1与pkcs8证书互相转换.rar

    pkcs1与pkcs8证书互相转换

    pkcs7.rar_openssl 签名_openssl pkcs7_openssl数字签名_openssl签名_pkcs7签

    利用OpenSSL PKCS7进行数字签名的示例代码,仅供参考

    使用数字证书(usb key)进行PKCS#7数字签名

    越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。

    C# BouncyCastle实现带原文数据PKCS#7 签名、验签

    借助 BouncyCastle 在C#里 实现Java中的PKCS7 签名和验签 仅做参考,如有问题欢迎指出。

    RSA签名算法,PKCS7格式

    本资源包含:RSA签名算法,格式为PKCS7。RSA签名算法,格式为PKCS7。RSA签名算法,格式为PKCS7。RSA签名算法,格式为PKCS7。 RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977...

    PKCS11导入证书.rar_pkcs11_PKCS11示例_源码

    PKCS11示例的代码 里面有openssl和C++使用方法

    pkcs10:转到要分析的包并创建PKCS#10证书签名请求

    Go 1.3向软件包添加了对PKCS#10证书签名请求的支持。 pkcs10 包pkcs10解析并创建RFC 2986中指定的PKCS#10证书签名请求。 文献资料 执照 请参阅许可。 根据LICENSE-GO的许可,使用了Go官方源crypto/x509程序包中...

    PKCS #12 中文版

    本标准描述了个人身份标识信息传递语法,包括私钥、证书、各种形式的秘密值及其扩展。支持本标准的计算机、应用程序、浏览器、因特网服务等等将允许用户导入、导出并且使用一套统一的个人身份标识信息。

    C# BouncyCastle实现带原文数据PKCS#7 签名

    使用C# 版本 BouncyCastle 包 ,实现带原文数据PKCS#7 签名。 此版本请不要下载,只包含签名部分。

    PKCS7标准签名与验签

    PKCS7标准签名与验签,SHA1算法(项目添加引用System.Security)

    PKCS12与JKS格式转换器

    PKCS12与JKS格式转换器,提供pkcs12文件转换成jks文件,可以选择源文件位置,和转换后文件存储位置。

Global site tag (gtag.js) - Google Analytics