推送通知 – 导致:java.io.IOException:toDerInputStream拒绝标签types45

当我的服务器尝试将通知推送到基于设备令牌和ck.pem(.pem文件,证书和密钥之间的组合)的特定设备时,出现此错误。

Caused by: java.io.IOException: toDerInputStream rejects tag type 45 

这是完整的错误消息出现在我的eclipse控制台。

 initial starting push notification sending 2014/03/20 14:28:00:252 INFO net.penril.notification.Initializer: ====Start Push Notification Sending==== SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 2014/03/20 14:28:04:737 INFO net.penril.notification.Initializer: Total of record data(1) SMS OID: 465 IOS test reg id =x769571d187c15cec398c5a02f196249456e8b73f763754fa17060658f87f6f6 com.notnoop.exceptions.InvalidSSLConfig: java.io.IOException: toDerInputStream rejects tag type 45 2014/03/20 14:28:05:374 INFO net.penril.notification.Initializer: Failed send notification to APN 2014/03/20 14:28:05:374 INFO net.penril.notification.Initializer: ====Complete Push Notification Sending==== 2014/03/20 14:28:05:374 INFO net.penril.notification.Initializer: =====End===== starting.. at com.notnoop.apns.internal.Utilities.newSSLContext(Utilities.java:101) at com.notnoop.apns.ApnsServiceBuilder.withCert(ApnsServiceBuilder.java:170) at com.notnoop.apns.ApnsServiceBuilder.withCert(ApnsServiceBuilder.java:133) at net.penril.notification.Initializer.notificationWorker(Initializer.java:156) at net.penril.notification.Initializer.Initial(Initializer.java:46) at net.penril.notification.PushNotificationCron$Job.run(PushNotificationCron.java:12) at EDU.oswego.cs.dl.util.concurrent.ClockDaemon$RunLoop.run(Unknown Source) at java.lang.Thread.run(Thread.java:724) Caused by: java.io.IOException: toDerInputStream rejects tag type 45 at sun.security.util.DerValue.toDerInputStream(DerValue.java:847) at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1221) at java.security.KeyStore.load(KeyStore.java:1214) at com.notnoop.apns.internal.Utilities.newSSLContext(Utilities.java:85) ... 7 more 

我怀疑这个错误是由这段代码造成的

 System.out.println("reg id =" + record.getRegId()); ApnsService service = APNS.newService().withCert("/Applications/MAMP/htdocs/xxxxx-mobile/ck.pem", "xxxxxx").withSandboxDestination().build(); String payload = APNS.newPayload().alertBody("This for testing").build(); String token = record.getRegId(); service.push(token, payload); 

你有什么想法toDerInputStream rejects tag type 45

我已经在这里对这个问题进行了研究:

  1. https://community.oracle.com/thread/1534340?start=0&tstart=0
  2. Java APNS(Apple推送通知服务)错误

为什么?

如上所述, java-apns需要.p12私钥,而不是.pem文件。

有关在Mac上创build.p12文件的说明位于第一个链接中,但如果您在Linux上使用openssl工具,则可以使用以下命令创build它:

 openssl pkcs12 -export -inkey mykey.key -in mykey.pem -out mykey.p12 

我刚刚find答案。 当我尝试生成P12密钥时,我需要同时select钥匙串访问中的私钥和证书。

在这里输入图像说明