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

Posted 信行合一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DerInputStream.getLength(): lengthTag=111, too big.相关的知识,希望对你有一定的参考价值。

在调用Apns推送接口的时候需要用到公钥和私钥,密钥文件统一放到项目src/main/resources的某个目录下,然后本地启动测试,启动过程中报错:DerInputStream.getLength(): lengthTag=111, too big.

解决过程:
把密钥文件存放到绝对路径下然后去加载结果正常,说明编译过程中密钥文件被修改了,所以解决问题的关键就是不要让maven打包过程中修改这个密钥文件。

解决办法:

1.非springboot项目

<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>
         </nonFilteredFileExtensions>
     </configuration>
</plugin>

2.springboot项目

注意这里的 filtering 意思是对指定目录下的文件进行过滤,这个过滤的意思是把 pom.xml 文件里面的变量在打包的过程中,替换到 application.properties文件里面的占位符里面去。因为我们,这里配置 true是替换占位符的意思,这里需要排除的文件是 以.p12 结尾的文件,而第二个resource节点的意思是不对这些文件进行占位符替换,这些文件包括的是以.p12 结尾的文件。
总体配置的意思就是对不是以 .p12 结尾的资源文件进行占位符替换,而以 .p12结尾的文件不进行占位符替换

 <build>
        <resources>
            <resource>
                <directory>$project.basedir/src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>
                        $project.basedir/src/main/resources/**.p12
                    </exclude>
                </excludes>
            </resource>
            <resource>
                <directory>$project.basedir/src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>
                        $project.basedir/src/main/resources/**.p12
                    </include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration><encoding>UTF-8</encoding>
                    <!-- 过滤后缀为pkcs12、jks的证书文件 -->
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>p12</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>

        </plugins>
    </build>

3.指定绝对目录

这种方式就是在加载文件的时候从指定目录去加载,但是这种方式有一个问题就是我们需要在运行的机器上配置对应的目录并拷贝秘钥文件,这样显然更加麻烦,所以不推荐。

以上是关于DerInputStream.getLength(): lengthTag=111, too big.的主要内容,如果未能解决你的问题,请参考以下文章

支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.

坑爹微信之读取PKCS12流时出现的java.io.IOException: DerInputStream.getLength

Jar包中读取微信支付证书

苹果IOS安卓推送功能开发