首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javax.net.ssl.SSLHandshakeException:收到致命警报: APN中出现handshake_failure错误

javax.net.ssl.SSLHandshakeException:收到致命警报: APN中出现handshake_failure错误
EN

Stack Overflow用户
提问于 2012-06-20 13:30:33
回答 3查看 31.1K关注 0票数 4

我正在尝试使用Java-pns向iPhone发送推送通知,但我收到以下错误...

代码语言:javascript
复制
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

这是我的代码。

代码语言:javascript
复制
String token="95076d2846e8979b46efd1884206a590d99d0f3f6139d947635ac4186cdc5942";

String host = "gateway.sandbox.push.apple.com";
int port = 2195;
String payload = "{\"aps\":{\"alert\":\"Message from Java o_O\"}}";

NotificationTest.verifyKeystore("res/myFile.p12", "password", false);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(getClass().getResourceAsStream("res/myFile.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();

System.out.println("Message sent .... ");

对于NotificationTest.verifyKeystore,我得到的有效值是FileKeystore

我不明白为什么我会得到这个错误。

这是我的错误日志...

代码语言:javascript
复制
** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Cert Authorities:
<empty>
[read] MD5 and SHA1 hashes: len = 10
0000: 0D 00 00 06 03 01 02 40 00 00 .......@..
** ServerHelloDone
[read] MD5 and SHA1 hashes: len = 4
0000: 0E 00 00 00 ....
** Certificate chain
**
** ClientKeyExchange, RSA PreMasterSecret, TLSv1
[write] MD5 and SHA1 hashes: len = 269
...
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

我不明白为什么认证机构是空的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-31 13:36:00

为了向iPhone/ iPad发送推送通知,我使用了。

它非常容易使用,对我来说也很有效。

我们可以简单地遵循来使用它。

票数 -4
EN

Stack Overflow用户

发布于 2012-08-08 04:43:07

我建议您使用keytool -list将客户端上的密钥库与服务器已知的密钥库进行比较。您得到的握手错误是因为服务器已经完成了问候,并且正在等待客户端证书的回复。您没有发送邮件。要解决这个问题,应该将PKCS12证书转换为PEM格式(使用openssl是一种方法),然后使用密钥工具将其导入到密钥库中。

我怀疑如果您通过将客户端证书导入keystore来修复此问题,那么您将遇到第二个错误。第二个错误与空CA证书有关-可能是因为您的密钥库中没有服务器已知的CA证书。导入您的CA,然后重试。

票数 5
EN

Stack Overflow用户

发布于 2014-12-11 21:38:14

看起来你需要安装"Java加密扩展(JCE)无限强度权限策略文件“。这为我解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11113338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档