2012-02-23 11 views
2

こんにちは、Javaを使用してデバイスにプッシュメッセージを送信しようとしています。しかし、私はすでにssl接続を確立するときに問題が発生しています。JavaによるApple Push Notification ServerとのSSLハンドシェイク

 KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

     InputStream key = getClass().getResourceAsStream("apns-dev-key.p12"); 
     char[] c = key.toString().toCharArray(); 

     keyStore.load(getClass().getResourceAsStream("apns-dev-cert.p12"), c); 
     KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509"); 
     keyMgrFactory.init(keyStore, c); 

     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(keyMgrFactory.getKeyManagers(), null, null); 
     SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 

     SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(host, port); 
     String[] cipherSuites = sslSocket.getSupportedCipherSuites(); 
     sslSocket.setEnabledCipherSuites(cipherSuites); 
     sslSocket.startHandshake(); 

私は取得していますエラーは次のとおりです: はここで、これまでのコードである

java.io.IOException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded 

私はAPNを-DEV-するkey.p12ファイルに問題があると思います。何かヒント?ここでhttp://undermypalapa.wordpress.com/2009/08/23/apple-push-notification-service-java/

+1

私はそれを今働いています。問題は私がapns-dev-key.p12で作業しようとしたことでした。しかし、私がする必要があるのは、プッシュ証明書(証明書と鍵を含むp12ファイル)を使用し、証明書をエクスポートするときに作成したパスワードを使用することだけです。 – Pathos

答えて

3

私の作業例:

上記のコードは以下から取得され、私はまだ好奇心だ何

private String token = "<token>"; 
private String host = "gateway.sandbox.push.apple.com"; 
private int port = 2195; 

private String payload = "{\"aps\":{\"alert\":\"Message from Java o_O\"}}"; 

public APNSender() { 
    try { 
     KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

     keyStore.load(getClass().getResourceAsStream("cert.p12"), "<password>".toCharArray()); 
     KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509"); 
     keyMgrFactory.init(keyStore, "<password>".toCharArray()); 

     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(keyMgrFactory.getKeyManagers(), null, null); 
     SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 

     SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(host, port); 
     String[] cipherSuites = sslSocket.getSupportedCipherSuites(); 
     sslSocket.setEnabledCipherSuites(cipherSuites); 
     sslSocket.startHandshake(); 

     char[] t = token.toCharArray(); 
     byte[] b = Hex.decodeHex(t); 

     OutputStream outputstream = sslSocket.getOutputStream(); 

     outputstream.write(0); 
     outputstream.write(0); 
     outputstream.write(32); 
     outputstream.write(b); 
     outputstream.write(0); 
     outputstream.write(payload.length()); 
     outputstream.write(payload.getBytes()); 

     outputstream.flush(); 
     outputstream.close(); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 
} 

をエラーコードを受信する方法です。私はそれを試しました

InputStream in = sslSocket.getInputStream(); 
[...] 

しかし成功しませんでした。

Apple docsには、エラーが発生していない場合は応答が送信されませんが、「エラーが発生していません」というステータスコードが表示されているとします。

+0

サポートされているすべての暗号スイートを有効にしないでください。正当な理由でデフォルトで無効になっているものがあります。 – Bruno

+0

これはぺームでも実行できますか? –

0

http://code.google.com/p/javapns/をご覧ください。あなたが実際に車輪を作り直す必要があり、独自のコードを書くのではなくJavaPNSを直接使用しない場合は、少なくともJavaPNSのドキュメンテーションが、あなたが知る必要がある重要な原則を理解するのに役立ちます。

関連する問題