2

我在iOS上有一個Worklight 6.1應用程序,其中包含推送通知。它工作正常,直到Worklight服務器出現問題。之後的所有推送通知都會失敗,直到服務器重新啓動。工作燈推送通知(APNS)因javax.net.ssl.SSLHandshakeException而失敗

工作燈服務器是自由8.5.5.0在Linux x86_64的 使用JDK:Java的1.7.0-IBM-1.7.0.5.0.x86_64 工作燈數據庫是德比(這是一個測試服務器)

當我啓動服務器時,一切正常。在服務器啓動

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

+0

確定。我以爲我有這個順序,但進一步測試我真正可以說的是,有時候通過APNS的推動起作用,有時它會因上述錯誤而失敗。 –

+0

notnoop與JRE 7 AFAIK不兼容。使用6並觀察是否有任何變化。 –

+0

切換到java-x86_64-60(1.6.0)。現在,APNS在服務器啓動時工作,但稍後停止工作,Worklight服務器日誌中沒有任何錯誤。通知只是永遠不會到達設備上。 GCM一直沒有問題。 –

回答

1

再一次......這花了足夠長的時間來弄清楚。

潛在的問題是,工作燈服務器託管於SoftLayer的,顯然通過默認監視器套接字連接的SoftLayer防火牆,並且如果連接空閒〜10分鐘後,丟棄。

因此,連接到APN和推動工作燈服務器的工作。然後過了10分鐘,沒有任何推送通知,防火牆丟棄了Worklight服務器和APNS服務器之間的套接字。所有後續的推送請求都失敗了,因爲Worklight對於APNS服務有一個死鎖套接字。

我們重新配置防火牆以允許APNS連接到閒置無限期和問題得到解決。

4

升級到Worklight 6.0.0.2修訂包後,我們在運行JDK 7的Websphere上看到了同樣的問題。經過一番研究後,我發現IBM JDK 7報告了這個問題。JDK中包含的Entrust證書存在問題。我嘗試了從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會話,一個委託安全CA根證書必須安裝在提供商的服務器上。如果服務器運行OS X,則此根證書已存在於鑰匙串中。在其他系統上,證書可能不可用。您可以從Entrust SSL證書網站下載此證書。

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

+0

這將關閉錯誤消息。現在,啓動服務器後APNS推送工作一段時間,然後停止工作......在某個時刻...在工作燈日誌中沒有任何錯誤或消息。讓它重新開始的唯一方法是重新啓動Worklight服務器。因此,相同的行爲,只是少了一點信息:-( –

+0

Hmmmm。由於javax.net.ssl.SSLHandshakeException,我們根本無法發送任何APNS,解決方法解決了這個問題。聽起來像這是另一個單獨的問題。沒有任何異常被拋出? –

+0

不,行爲根本沒有改變。從一開始,我就能夠在Worklight服務器啓動後立即發送APNS消息(不要問我它是如何工作的,我期望SSL問題也是一個完整的攔截器,但它正在工作)然後一段時間後,APNS開始工作了,唯一的區別是在JDK修復之前,我在日誌中看到錯誤,現在什麼也沒有。 –