Worklight 推送通知 (APNS) 失败并出现 javax.net.ssl.SSLHandshakeException

Posted

技术标签:

【中文标题】Worklight 推送通知 (APNS) 失败并出现 javax.net.ssl.SSLHandshakeException【英文标题】:Worklight Push notification (APNS) fails with javax.net.ssl.SSLHandshakeException 【发布时间】:2014-02-22 02:11:33 【问题描述】:

我在 ios 上有一个带有推送通知的 Worklight 6.1 应用程序。它工作正常,直到 Worklight 服务器出现问题。之后的所有推送通知都会失败,直到服务器重新启动。

Worklight 服务器是 Linux x86_64 上的 Liberty 8.5.5.0 使用 JDK:java-1.7.0-ibm-1.7.0.5.0.x86_64 Worklight 数据库是 Derby(这是一个测试服务器)

当我启动服务器时,一切都很好。

服务器启动10分钟后,我看到:

[2/20/14 19:39:15:319 CST] 0000003e com.notnoop.apns.internal.ApnsFeedbackConnection             W Failed to retreive invalid devices
java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.j: End user tried to act as a CA

但这似乎并没有破坏任何东西。推送通知仍然有效。服务器启动 30 分钟后,我看到:

[2/20/14 19:59:48:657 CST] 00000061 com.ibm.ws.webcontainer.util.ApplicationErrorUtils           E SRVE0777E: Exception thrown by application class 'org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException:365'
org.jboss.resteasy.spi.UnhandledException: org.springframework.dao.InvalidDataAccessApiUsageException: Multiple DISTINCT aggregates are not supported at this time. SELECT COUNT(DISTINCT t0.DEVICE), COUNT(DISTINCT t1.ID) FROM NOTIFICATION_DEVICE t0 INNER JOIN NOTIFICATION_USER t1 ON t0.USERSUBSCRIPTIONID = t1.ID WHERE (t0.APPLICATIONID IN (?) AND t0.PLATFORM = ?) [code=30000, state=42Z02]; nested exception is <openjpa-1.2.2-r422266:898935 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Multiple DISTINCT aggregates are not supported at this time. SELECT COUNT(DISTINCT t0.DEVICE), COUNT(DISTINCT t1.ID) FROM NOTIFICATION_DEVICE t0 INNER JOIN NOTIFICATION_USER t1 ON t0.USERSUBSCRIPTIONID = t1.ID WHERE (t0.APPLICATIONID IN (?) AND t0.PLATFORM = ?) [code=30000, state=42Z02]

之后对推送适配器的任何调用都会导致:

[2/21/14 19:06:44:038 CST] 00000090 com.notnoop.apns.internal.ApnsConnectionImpl                 I Exception while waiting for error code
java.net.SocketException: Socket is closed
    at com.ibm.jsse2.qc.j(qc.java:301)
    at com.ibm.jsse2.e.read(e.java:32)
    at java.io.InputStream.read(InputStream.java:102)
    at com.notnoop.apns.internal.ApnsConnectionImpl$1MonitoringThread.run(ApnsConnectionImpl.java:114)

[2/21/14 19:06:44:650 CST] 00000085 com.notnoop.apns.internal.ApnsConnectionImpl                 I Failed to send message Message(Id=2; Token=499D9813FBC377CCDE787E2749CDA914F826EDF39B0830D4AFEEF7A5D71A1802; Payload="aps":"alert":"body":"You have 4 available messages","action-loc-key":null,"sound":"","badge":4,"payload":"\"alias\":\"myNotificationPush\"")... trying again after delay
javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.j: End user tried to act as a CA

之后的所有重试都会导致同样的失败。

有一些关于“最终用户试图充当 CA”和“APNS”的谷歌点击表明这是一个 JDK 1.5 问题(已在 1.6 中修复),并且可以通过使用 IbmPKIX 信任管理器来修复,但我确定我使用的是 JDK 1.7,并且 java.security 中的信任管理器是 PKIX

【问题讨论】:

好的。我以为我有这个序列,但通过进一步测试,我真正能说的是,有时通过 APNS 的推送有效,有时它会因上述错误而失败。 notnoop 不适用于 JRE 7 AFAIK。使用 6 并观察是否有任何变化。 切换到 java-x86_64-60 (1.6.0)。现在,APNS 在服务器启动时工作,但一段时间后停止工作,Worklight 服务器日志中没有任何错误。通知永远不会到达设备上。 GCM 一直在正常工作。 请联系 JayaKarthik Jayabalan(IBM 同事,Worklight 中的推送通知开发人员)。听起来这需要调查。 @IdanAdar jayaKarthik jayabalan 的 *** id 是什么? 【参考方案1】:

升级到 Worklight 6.0.0.2 修订包后,我们在运行 JDK 7 的 Websphere 上看到了同样的问题。经过一些研究后,我发现 IBM JDK 7 报告了这个问题。Entrust 证书存在问题,即包含在 JDK 中。我尝试了替换 JDK 6 中的 cacerts 文件的解决方法,并且成功了。

 Replace jre\lib\security\cacerts file in JDK 7 with
 jre\lib\security\cacerts file in JDK 6

http://www-01.ibm.com/support/docview.wss?uid=swg1IV43936

注意:要与 APN 建立 TLS 会话,必须在提供商的服务器上安装 Entrust Secure CA 根证书。如果服务器运行的是 OS X,则该根证书已经在钥匙串中。在其他系统上,证书可能不可用。您可以从 Entrust SSL 证书网站下载此证书。

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

【讨论】:

关闭错误消息。现在,APNS 推送在启动服务器后会工作一段时间,然后停止工作……在某个时候……工作灯日志中没有任何错误或消息。让它再次运行的唯一方法是重新启动 Worklight 服务器。所以,同样的行为,只是更少的信息:-( 嗯。使用 javax.net.ssl.SSLHandshakeException 我们根本无法发送任何 APNS,解决方法解决了这个问题。听起来这是另一个单独的问题。根本没有抛出异常? 不,行为根本没有改变。从一开始,我就能够在 Worklight 服务器启动后立即发送 APNS 消息(不要问我它是如何工作的,我希望 SSL 问题也会成为一个完整的障碍。但它工作)然后一段时间后APNS开始工作。唯一的区别是在 JDK 修复之前,我在日志中看到了错误,而现在什么也没有。 @SamNunnally 要使用什么证书? @BalajiG JDK 6 中的 cacerts 文件可用于替换 JDK 7 中的 cacerts 文件。截至目前,我相信这已在 IBM 最新版本的 JDK 7 中得到修复跨度> 【参考方案2】:

再一次……这花了很长时间才弄清楚。

根本问题是 Worklight 服务器托管在 SoftLayer 上,显然 SoftLayer 防火墙默认监控套接字连接,如果连接空闲约 10 分钟,则将其丢弃。

因此,连接到 APN 并推送的工作灯服务器正常工作。然后 10 分钟过去了,没有任何推送通知,防火墙丢弃了 Worklight 服务器和 APNS 服务器之间的套接字。所有后续推送请求都以静默方式失败,因为 Worklight 有一个用于 APNS 服务的死套接字。

我们重新配置了防火墙,以允许与 APNS 的连接无限期闲置,问题已得到解决。

【讨论】:

以上是关于Worklight 推送通知 (APNS) 失败并出现 javax.net.ssl.SSLHandshakeException的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight - 可靠的推送通知

Worklight 的临时推送通知和开发

APNS:无效令牌导致所有后续推送通知失败

IBM Worklight 5.0.6.1 - 通过代理服务器推送通知

Worklight 6.2.0.01 订阅推送通知失败

IBM Worklight 6.1 - 来自推送通知的磁贴徽章从未在 Windows Phone 8 上清除