通过Java与Apple推送通知服务器进行SSL握手
您好,我正尝试使用Java向我的设备发送推送消息。但是我在建立ssl连接时已经遇到了问题。 这是迄今为止代码:通过Java与Apple推送通知服务器进行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
我想有一些问题与APNS-DEV-key.p12文件。任何提示?
上面的代码摘自:http://undermypalapa.wordpress.com/2009/08/23/apple-push-notification-service-java/
这里我的工作例如:
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表示在没有错误发生时没有应答发送,但是另一方面他们列出了“没有遇到错误”的状态码。
请勿启用所有受支持的密码套件。其中一些由于充分的原因而被默认禁用。 – Bruno 2012-05-02 19:21:26
这可以用pem做吗? – 2015-06-24 14:02:57
你可能想看看http://code.google.com/p/javapns/。如果您真的需要重新发明轮子,而不是直接使用JavaPNS而不是为此编写自己的代码,那么至少JavaPNS的文档应该可以帮助您理解您需要知道的关键原则。
好吧,我现在正在工作。问题是我试图使用apns-dev-key.p12。但我所需要做的就是使用推送证书(包含证书和密钥的p12文件)并使用我在导出证书时创建的密码。 – Pathos 2012-02-23 10:38:02