Java APNS证书错误“DerInputStream.getLength():lengthTag = 109,太大了。”

时间:2014-04-17 06:42:34

标签: java ios javapns

当我尝试使用java APNS将推送通知发送到iOS时,我收到此错误消息:

com.notnoop.exceptions.InvalidSSLConfig:java.io.IOException:DerInputStream.getLength():lengthTag = 109,太大了。

我已经尝试将证书转换为个人信息交换(.p12)也会出现同样的错误。任何人都知道问题以及如何解决它?

以下是我的java代码:

ApnsService service =
    APNS.newService()
   .withCert("src/net/notification/ck.jks", "******")
   .withSandboxDestination()
   .build();

String payload = APNS.newPayload().alertBody(record.getSendMsg()).build();
String token = record.getToken();
service.push(token, payload);

感谢。

6 个答案:

答案 0 :(得分:22)

这是因为系统认为您正在尝试读取不同类型的密钥库而不是JKS。您需要指定该文件是JKS或将其转换为其他格式。

我看到你已经尝试过转换为.p12。如果您正确执行此操作,可能还有其他一些默认格式。我建议找出如何指定JKS。

答案 1 :(得分:10)

我遇到了同样的问题,但只有在使用 maven 时,我的解决方案才能为您提供帮助。

Maven资源过滤(让你在资源文件中包含变量)可能会弄乱你的二进制文件 - 证书对修改特别敏感。

通常,不应过滤二进制内容。但我不能简单地禁用资源过滤,因为我有一些包含变量的.properties文件。因此解决方案是从过滤中排除.p12文件

<build>
    [...]
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/*.p12</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <includes>
                <include>**/*.p12</include>
            </includes>
        </resource>
    </resources>
    [...]
</build>

有关maven资源过滤的更多信息: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

答案 2 :(得分:3)

如果您使用maven,可能是因为整个资源文件夹中的Maven过滤。我已经尝试过上面的Zsolt Safrany解决方案并且无法正常工作。但是,阅读他分享的文档后,我发现了这一点:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.0.1</version>
  <configuration>
    <nonFilteredFileExtensions>
      <nonFilteredFileExtension>p12</nonFilteredFileExtension>
    </nonFilteredFileExtensions>
  </configuration>
</plugin>

其中不包括二进制扩展(或任何您想要的扩展)被过滤。

答案 3 :(得分:1)

删除keystoreType行

我不知道为什么会这样。但是如果我有这个payload server.xml` ..

line in my

...然后,Tomcat将无法启动,并给我一个keystoreType="PKCS12" 错误。

但是,如果我删除该行,那么Tomcat将很好地启动。不知道为什么这样。感觉很脏。

答案 4 :(得分:0)

就我而言,我发现意外更改了javax.net.ssl.trustStore系统属性。 SSL调试属性-Djavax.net.debug=ssl:trustmanager对调查的帮助很大。

答案 5 :(得分:0)

我遇到了这个问题,发现问题是truststore.p12实际上在JKS中或已损坏。

用于测试信任库是否符合PKCS12的keytool命令是:

keytool.exe -keystore truststore.p12 -storepass passwordText -list -storetype pkcs12
keytool error: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.

我能够通过强制将JKS转换为PKCS12来纠正这一问题。

使用以下说明:

 keytool.exe -importkeystore -srckeystore truststore.jks  -destkeystore truststore1.p12 -srcstoretype JKS -deststoretype PKCS12

比成功的测试要提供类似以下内容:

keytool.exe -keystore truststore.p12 -storepass passwordText -list -storetype pkcs12


Keystore type: PKCS12
Keystore provider: SunJSSE

Your keystore contains 3 entries

certificates-4, 9 Jul, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): CF:E3:01:1F:A3:30:C5:B1:B9:2B:C5:28:1B:8C:66:71:EA:B8:67:0D
certificates-3, 9 Jul, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18
certificates-2, 9 Jul, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): FA:5F:98:E8:02:2E:81:05:DB:DF:24:48:65:6A:E5:76:C1:31:CB:28