1

我最近发现了适用于 Android 的 Google Cloud Messaging,我想集成我的应用程序以使用它。我让项目的 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我尝试在服务器中加载信任库之前向客户端发送一条消息,并且应用程序成功接收到它。

4

4 回答 4

2

使用 Google Cloud Messaging,您的服务器不会直接与客户端对话。它首先经过“云”部分。因此,将客户端证书放在服务器的信任管理器中是行不通的。

相反,您的服务器必须验证 Google 云消息服务器的 SSL 证书。这些由操作系统默认 CA 列表中的证书颁发机构提供支持,因此在添加信任库之前向客户端发送消息就可以了。

于 2012-09-02T05:14:54.367 回答
1

弄清楚了。正如 kroot 所建议的那样,问题在于服务器无法验证 GCM 服务器,因为它们的证书不在其信任库中(我使用自己的信任库,而不是系统的信任库)。因此,我通过简单地从 Java 安全文件夹中复制 cacerts 文件,在其中添加 Android 应用程序的自定义客户端证书,并将该文件用作我的信任库来更改它,因为它已经具有系统的默认信任证书。很简单,但花了我半天时间才弄清楚。

于 2012-09-02T10:28:58.310 回答
0

服务器的 trustStore 不信任客户端的证书。检查它包含的内容,以及您是否确实在使用该 trustStore。

于 2012-09-02T01:41:31.230 回答
0

我创建了一个独立的 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>
于 2015-09-14T15:15:38.990 回答