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

テスト段階の場合は、安全でない URL を使用して通知をプッシュできます。

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

また、任意の証明書を受け入れる証明書検証コールバックを追加することで、この問題を回避しましたが、これは C# サーバー上にありました。これに相当するJavaがあると確信しています。

本番コードでは、正しい証明書を検証するか、送信するデータを暗号化するだけで済みます。

于 2011-07-30T05:31:14.047 に答える
0

HttpsURLConnectionの代わりに使用する必要がありますHttpURLConnection

私の知る限り、HttpURLConnectionホスト名は検証されません。

于 2011-05-05T08:44:05.600 に答える