代码之家  ›  专栏  ›  技术社区  ›  Georgi

Google GCM无法为Java SSL服务器进行SSL握手

  •  1
  • Georgi  · 技术社区  · 13 年前

    我最近发现了谷歌的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证书添加到信任库或其他什么吗?

    非常感谢,如有任何帮助,不胜感激:)

    附言:我试着给客户发个信息 之前 我在服务器中加载了信任库,应用程序成功收到了它。

    4 回复  |  直到 13 年前
        1
  •  2
  •   kroot    13 年前

    使用谷歌云消息,服务器不会直接与客户端对话。它首先介绍“云”部分。因此,将客户端证书放入服务器的信任管理器中是不起作用的。

    相反,您的服务器必须验证谷歌云消息服务器的SSL证书。这些由操作系统的默认CA列表中已经存在的证书颁发机构支持,因此在添加信任存储之前向客户端发送消息会很好。

        2
  •  1
  •   ЯegDwight kri    13 年前

    想明白了。正如kroot所建议的,问题是服务器无法对GCM服务器进行身份验证,因为它们的证书不在其信任库中(我使用的是我自己的信任库,而不是系统的信任库)。因此,我只需从Java安全文件夹中复制cacerts文件,在其中添加Android应用程序的自定义客户端证书,并将该文件用作我的信任存储,因为它已经拥有系统的默认信任证书。很简单,但我花了半天的时间才弄明白。

        3
  •  0
  •   user207421    13 年前

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

        4
  •  0
  •   venu88    10 年前

    我创建了一个独立的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>