java.security.spec.InvalidKeySpecException DerInputStream.getLength(): lengthTag

941 阅读1分钟
开发接入某某银行支付平台须要用到xml数字签名公钥和私钥,密钥文件统一放到项目下面本地能够可是测试环境找不到路径,而后放入src/main/resources的某个目录下,而后打包部署到测试环境的jboss,测试支付环节加载签名,失败了异常以下。

报错:DerInputStream.getLength(): lengthTag=111, too big.java

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.\
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)\
at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)\
at com.msok.signatured.crypto.KryptoUtil.getStoredPrivateKey(KryptoUtil.java:136)\
at com.msok.signatured.xml.digsig.XmlDigitalSignatureGenerator.generateXMLDigitalSignatureXML(XmlDigitalSignatureGenerator.java:254)\
at com.msok.signatured.xml.digsig.GetXmlDigtalSign.DigtalSignProcess(GetXmlDigtalSign.java:32)\
at com.msok.insure.service.impl.PayJLYHServiceImpl.checkFour(PayJLYHServiceImpl.java:104)\
at com.msok.insure.service.dubbo.PayPlatformFacadeImpl.payPlatForm(PayPlatformFacadeImpl.java:117)\
at com.alibaba.dubbo.common.bytecode.Wrapper27.invokeMethod(Wrapper27.java)\
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)\
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)\
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)\
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)\
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)

查找缘由

若是把证书单独放到某个文件目录下再本地是木有问题的,根据他的源码看到的异常是apache

344_8a2_298.png

本地测试排除了这个可能性,那么私钥传入的时候被修改了,首先要明确的是PKCS12对应使用*.pfx文件。app

为了证明这种状况,我把maven打好的war中的证书文件替换掉,果真是这个缘由。那证书为何会被修改呢,原来就是maven-resources-plugin做怪

345_397_67b-1.jpg

421_f74_ab6.jpg

那么发现问题了如何解决

<plugin>能够试试以下

<groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><encoding>UTF-8</encoding><!-- 过滤后缀为pem、pfx的证书文件 --><nonFilteredFileExtensions><nonFilteredFileExtension>pem</nonFilteredFileExtension><nonFilteredFileExtension>pfx</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin>


或者直接在上图3直接添加默认的,再也不同步maven,更新到本地用成本地jar包。

我的呢推荐加入配置文件


<plugins>
    <!-- resources资源插件 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <encoding>UTF-8</encoding>
            <!-- 后缀为pem、pfx的证书文件 -->
            <nonFilteredFileExtensions>
                <nonFilteredFileExtension>pem</nonFilteredFileExtension>
                <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
                <nonFilteredFileExtension>p12</nonFilteredFileExtension>
                <nonFilteredFileExtension>key</nonFilteredFileExtension>
            </nonFilteredFileExtensions>
        </configuration>
    </plugin>
    <!-- java文档插件 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.0</version>
    </plugin>
</plugins>