Java APNS证书的正确格式是什么?

4

我正在使用Java APNS(com.notnoop.apns,v0.2.3)向我的iOS应用程序发送推送通知。我使用以下代码创建APNS服务:

private ApnsService createApnsService() throws IOException {
        ApnsServiceBuilder serviceBuilder = APNS.newService().withCert(certResource.getInputStream(), certPassword);
        serviceBuilder.withSandboxDestination();
        return serviceBuilder.build();
}

然后会收到以下异常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.notnoop.exceptions.NetworkIOException: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:647)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:728)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)...    <<...the stacktrace is much longer, but I've cut it of here, since nobody would read it anyway...>>

我猜测我的P12证书是不正确的。(我已经尝试过PEM证书了。)目前,我是通过以下方式创建了P12证书,然后应用了密码:

Keychain.app 屏幕截图


应该如何创建与Java APNS兼容的证书?


1
我是按照今年早些时候的这个教程创建的,它完美地运转了。http://www.raywenderlich.com/32960 - Woodstock
使用Java APNS还是教程中提到的PHP APNS呢?由于教程中使用PEM证书,根据Java APNS的文档,您应该使用P12证书。 - miho
1
根据此处的说明http://code.google.com/p/apns-sharp/wiki/HowToCreatePKCS12Certificate,创建了一个pem文件并进行了转换。 - Woodstock
我使用过Java APNS和基于PHP的解决方案。 - Woodstock
2
@JohnWoods 謝謝您提供的鏈接。您使用 PKCS12 證書的解決方案有效。如果您將其作為答案發布,我會標記它為正確答案。 - miho
非常感谢你,Miho。我已经创建了一个答案,非常感激。 - Woodstock
2个回答

17

我使用PKCS#12(.p12文件)。创建它的步骤如下:

  1. 从钥匙串中导出私有密钥并将其命名为aps_private-key.p12

  2. 使用以下命令转换密钥:openssl pkcs12 -nocerts -out aps_private-key.pem -in aps_private-key.p12,确保输入至少4个字符的PEM密码短语。

  3. https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action下载应用程序的证书。下载的文件应该被称为aps_development.cer之类的名称。

  4. 使用以下命令将证书转换:openssl x509 -in aps_development.cer -inform der -out aps_development.pem

  5. 使用openssl pkcs12 -export -in aps_development.pem -out aps_dev_credentials.p12 -inkey aps_private-key.pem生成凭据。

  6. 现在可以使用第5步生成的凭据(aps_dev_credentials.p12)了。

final InputStream certificate = Thread.currentThread().getContextClassLoader()
        .getResourceAsStream("aps_dev_credentials.p12");
final char[] passwd = {'1','2','3','4'};
final ApnsService apnsService = com.notnoop.apns.APNS.newService()
        .withCert(certificate, new String(passwd))
        .withSandboxDestination().build();
apnsService.testConnection();

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接