声明:本文为作者原创,请勿随意转载,制造网络垃圾
客户使用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系统中ibm的jdk对算法只定义了文件中的几种,其他的应该是全部不支持的。
分享到:
相关推荐
本文将深入探讨如何使用BouncyCastle库在Java中创建PKCS12格式的数字签名证书。 首先,理解BouncyCastle库。BouncyCastle是一个开放源代码的Java密码学API,提供了大量的加密算法、协议和实用工具类。对于处理PKCS#...
越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。
本文件包括了demo和安装对应的环境、安装教程、简单易懂,正常php的rsa签名是使用openssl_sign,但是对应java中CFCASignature.signature的签名的签名时候对不上,要使用扩展php_com_dotnet并且对应安装签名的环境 ...
2. 私钥和证书管理:PKCS #12 支持私钥和证书的管理,包括私钥的生成、存储和传递,以及证书的签发和验证。 3. 秘密值管理:PKCS #12 定义了一种秘密值的管理机制,包括秘密值的生成、存储和传递。 4. 扩展机制:...
为了解决这个问题,社区开发了`requests_pkcs12`这个扩展库,它为`requests`添加了对PKCS#12(Personal Information Exchange Syntax Standard)格式的证书的支持。 PKCS#12是一种标准格式,用于存储用户的私钥和...
PKCS标准规范了个人身份信息便携格式; 他用于将证书信息、私钥信息、和证书CA链等打包成一个安全的便于...PKCS格式的文件使用文本方式是无法直接查看的。 我们经常说的PFX格式的证书其实就是PKCS标准的身份信息文件
带有私钥的证书,由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以.pfx作为证书文件后缀名。 只有pfx格式的数字证书是包含有私钥的
pkcs证书生成, rsa, rsa2, MD5签名, 加密, aes加密等 pkcs证书生成, rsa, rsa2, MD5签名, 加密, aes加密等
在C#中,我们可以利用System.Security.Cryptography命名空间下的类来实现PKCS #7签名和验签功能。 1. **理解PKCS #7签名** PKCS #7签名主要用于确保数据的完整性和来源的真实性。它通过哈希算法对原始数据进行处理...
这个示例代码提供了在OpenSSL和C++环境下使用PKCS11接口的方法。OpenSSL是一个强大的安全套接层(SSL)密码库,包含各种主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供丰富的应用程序供测试或其他...
在C#编程环境中,虽然.NET框架提供了内置的安全类如RSACryptoServiceProvider,但在某些场景下,如与Java平台交互或者需要更灵活的加密库时,可能会选择第三方库,例如BouncyCastle。BouncyCastle是一个强大的开源...
OpenSSL 生成 CA 证书 PKCS#12 PEM 格式转换 OpenSSL 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持 SSL/TLS 协议的实现。 OpenSSL 工具箱中包含了大量实用的命令和选项,...
例如,如果你有一个基于Java的应用程序,而你的证书是以PKCS12格式提供的,那么你需要将其转换为JKS才能在应用中使用。同样,如果你有JKS格式的密钥库,但需要在非Java环境中使用,可能需要转换为PKCS12。 转换过程...
在C#环境下,我们可以利用`System.Security`命名空间中的类来实现PKCS#7签名和验证。首先,我们需要一个私钥来创建签名,这可以通过`RSACryptoServiceProvider`类实现。然后,我们使用SHA1算法对数据进行哈希,这个...
2. "bcmail-jdk15-146.jar":这个库专注于邮件安全,提供了与S/MIME(Secure/Multipurpose Internet Mail Extensions)相关的功能,S/MIME是一种基于PKCS#7标准的电子邮件安全协议,它使用数字签名和加密来保护邮件...
反之,如果你收到一个PKCS#8格式的证书,但你的工具或环境只支持PKCS#1,那么你也需要进行转换。 转换过程通常涉及到以下步骤: 1. **从PKCS#1到PKCS#8**:首先,你需要提取PKCS#1格式的RSA私钥,然后将其封装到一...
本文将详细讲解如何使用C#语言和BouncyCastle库来实现带原文数据的PKCS#7签名。 PKCS#7(Public-Key Cryptography Standards #7)是由RSA Security提出的一种标准,它定义了证书、证书撤销列表(CRL)的格式以及...
越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。
可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...
PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter ...