19

当我尝试使用 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);

谢谢。

4

6 回答 6

29

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

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

于 2014-05-14T19:31:10.987 回答
14

我遇到了同样的问题,但我的解决方案只有在您使用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

于 2014-07-28T12:07:20.647 回答
4

如果您使用 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>

其中排除了二进制扩展名(或您想要的任何扩展名)被过滤。

于 2016-06-30T21:34:26.483 回答
4

删除“keystoreType”行

我不知道为什么会这样。但是如果我的server.xml..中有这条线

keystoreType="PKCS12"

...然后Tomcat将不会启动并给我DerInputStream.getLength(): lengthTag=109, too big错误。

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

于 2019-09-25T09:38:31.910 回答
3

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

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

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
于 2019-07-10T08:19:09.683 回答
1

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

于 2019-04-29T12:26:24.543 回答