簡體   English   中英

Google GCM無法為Java SSL Server執行SSL握手

[英]Google GCM can't do SSL handshake for Java SSL Server

我最近發現了谷歌針對Android的雲消息傳遞,我想整合我的應用程序來使用它。 我讓項目的Android端工作,並且應用程序正在向服務器正確注冊。 問題是我的服務器似乎無法驗證GCM服務器,因此它可以與它們通信。 這就是我的意思:

目前,我的服務器是一個簡單的基於Java的SSL服務器,帶有密鑰庫和信任庫。 信任庫包含客戶端的密鑰(即應用程序的密鑰),反之亦然,客戶端/服務器可以通過SSL相互通信而不會出現任何問題。 我用來向應用程序發送消息的代碼是:

Sender sender = new Sender( "API_KEY" );
Message message = new Message.Builder().addData( "message", description ).build();
Result result = sender.send( message, ID, 1 );

它給出了以下異常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

當我啟動我的服務器時,我傳遞了信任/密鑰庫的名稱及其密碼並加載它們,以便它們可以用來與客戶端通信。 我懷疑問題是當前信任庫只包含客戶端的密鑰,因此服務器只能與客戶端通信而不能與其他人通信。 這是正確的,如果是的話,任何人都有任何想法如何將GCM證書添加到信任庫或其他什么?

非常感謝,非常感謝任何幫助:)

PS我嘗試在服務器中加載信任庫之前向客戶端發送消息,並且應用程序已成功收到它。

使用Google Cloud Messaging,您的服務器不會直接與客戶端通信。 它首先通過“雲”部分。 因此,將客戶端證書放在服務器的信任管理器中是行不通的。

相反,您的服務器必須驗證Google Cloud Messaging服務器的SSL證書。 這些已由操作系統的默認CA列表中的證書頒發機構支持,因此在添加信任存儲之前向客戶端發送消息將正常工作。

弄清楚了。 正如kroot所說,問題是服務器無法驗證GCM服務器,因為它們的證書不在其信任庫中(我使用自己的信任存儲區作為系統的信任存儲區)。 所以我通過簡單地從Java安全文件夾復制cacerts文件,在那里添加Android應用程序的自定義客戶端證書,並使用該文件作為我的信任存儲來改變它,因為它已經擁有系統的默認信任證書。 很簡單,但我花了半天才弄明白。

服務器的trustStore不信任客戶端的證書。 檢查它包含的內容,以及您真正使用的是trustStore。

我創建了一個獨立的java程序,它充當“服務器”,可以將消息推送到GCM服務器,而GCM服務器又可以向我的手機應用程序發送消息。

我不必在我的jre \\ lib \\ security \\ cacerts文件中安裝任何證書,因為隨附的受信任條目足以連接到GCM服務器。

唯一的依賴是以下

    <dependency>
        <groupId>com.google</groupId>
        <artifactId>gcm-server</artifactId>
        <version>1.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
    </dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM