0

尝试通过 C2DM 服务器发送推送通知时,我收到以下 SSLHandshakeException。

javax.net.ssl.SSLHandshakeException: Could not verify SSL certificate for: https://android.apis.google.com/c2dm/send

发送消息的代码如下,并且在 App Engine 上运行。当我使用 cURL 时一切正常,所以我知道服务器验证码和设备注册 ID 是正确的。

public static void sendHttpPostToC2dmService(String msg, PrintWriter out) {

    String authCode = "XXXX";
    String regID = "YYYY";

    try {
        URL url = new URL("https://android.apis.google.com/c2dm/send");

        String data = URLEncoder.encode("registration_id", "UTF-8") + "="
                + URLEncoder.encode(regID, "UTF-8");
        data += "&"
                + URLEncoder.encode("Authorization: GoogleLogin auth",
                        "UTF-8") + "="
                + URLEncoder.encode(authCode, "UTF-8");
        data += "&" + URLEncoder.encode("collapse_key", "UTF-8") + "="
                + URLEncoder.encode("something", "UTF-8");
        data += "&" + URLEncoder.encode("data.message", "UTF-8") + "="
                + URLEncoder.encode(msg, "UTF-8");

        out.println("data=" + data);

        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");

        OutputStreamWriter writer = new OutputStreamWriter(
                connection.getOutputStream());
        writer.write(data);
        writer.close();

        out.println("responseCode=" + connection.getResponseCode());

        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            String responseLine = new BufferedReader(new InputStreamReader(
                    connection.getInputStream())).readLine();
            out.println("responseLine=" + responseLine);

        } else {
            // Server returned HTTP error code.
        }
    } catch (MalformedURLException e) {
        out.println("MalformedURL");
        out.println(e.getMessage());
    } catch (IOException e) {
        out.println("IOException");
        out.println(e.getMessage());
        e.printStackTrace(out);
    }

}

似乎其他人也有这个问题,但我一直无法找到一个明确的解决方案(至少不是我能够理解的)。感谢任何帮助。

4

2 回答 2

0

您需要使用HttpsURLConnection而不是HttpURLConnection.

AFAIK,HttpURLConnection不验证主机名。

于 2011-05-05T08:44:05.600 回答
0

如果您处于测试阶段,您可以使用非安全 url 来推送通知。

http://android.apis.google.com/c2dm/send

我还通过添加证书验证回调来接受任何证书来解决这个问题,但这是在 C# 服务器上。我确信有一个 Java 等价物。

在生产代码中,您可能想要验证正确的证书,或者只是加密您发送的数据。

于 2011-07-30T05:31:14.047 回答