当前位置: 首页 > 知识库问答 >
问题:

javax . net . SSL . SSL handshakeexception:收到致命警报:APN中的handshake_failure错误

武骁
2023-03-14

我试图使用Java-pns向iPhone发送消息推送,但我收到以下错误...

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

这是我的密码。。。

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 .... ");

对于<代码>通知测试。verifyKeystore我得到的是有效的is文件Keystore

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

这是我的错误日志。。。

** 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

我不明白为什么证书颁发机构是空的?

共有3个答案

江华容
2023-03-14

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

它非常易于使用,它对我有用。

我们可以简单地按照这个来使用它。

公羊浩阔
2023-03-14

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

廖夜洛
2023-03-14

我建议您使用 keytool -list 将客户机上的密钥库与服务器已知的密钥库进行比较。您收到的握手错误是因为服务器已完成问候操作,并期望客户端证书进行回复。您没有发送一个。要解决此问题,应将 PKCS12 证书转换为 PEM 格式(使用 openssl 是一种方法),然后使用 keytool 导入到密钥库中。

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

 类似资料:
  • 问题内容: 我从两天后尝试了许多选项后发布了这个问题。以下是我尝试的选项。 禁用SSL证书验证 通过从浏览器下载crt并转换为.jks并导入密钥库。 我仍然遇到这个问题,非常感谢您的任何帮助。 问题答案: 问题解决了。!!!以下是解决方案。 对于Java 6:将下面的jar添加到{JAVA_HOME} / jre / lib / ext中。1. bcprov-ext- jdk15on-154.ja

  • 我在使用Java 1.7.0_67的linux服务器上使用Tomcat 7.065和APR 1.1.33。 多年来,我的应用程序一直通过SSL愉快地连接到第三方站点。第三方颁发了一个新证书。第三部分站点是:https://its.changehealthcare.com/ 我下载了。cer文件并导入了一个keytool: 当我做一个keytools列表时,我得到: 但是我继续得到一个ssl握手错误

  • 我在Java 8上运行以下代码, 获得例外, ioException 在发送 http 请求时发生:javax.net.ssl.SSLHandshake异常:收到致命警报:handshake_failure。 我能够通过卷曲连接到, 有人能告诉我我的java代码有什么问题吗? 依赖关系如下,

  • 我试图使用Java-pns向iPhone发送推送通知,但我得到以下错误-javax.net.ssl.sslhandShakeException:Received Fatalic Alert:handshake_failure 我的密码是- 对于NotificationTest.VerifyKeystore,我得到的有效信息是文件和密钥库。 拜托,有人能帮我吗? 提前谢谢... 在我的日志里我看到了

  • 问题内容: 我正在尝试使用Java-pns将推送通知发送到iPhone,但出现以下错误-javax.net.ssl.SSLHandshakeException :收到致命警报:handshake_failure 我的代码是- 对于 NotificationTest.verifyKeystore, 我得到的是这个有效的是File and Keystore。 我不明白为什么会收到此错误。 请有人可以帮

  • 问题内容: 我正在尝试使用 liferay中的* javapns 库将推送通知发送到我的设备。这是代码: * 调用pushNotification时出现此错误: 我已经用谷歌搜索了,但是找不到任何解决方案。 有谁知道如何解决这个问题? 问题答案: 当您要连接的服务器没有来自授权CA的有效证书时,通常会引发该异常。 简而言之,您尝试连接的服务器很可能使用自签名证书,因此您必须在Java代码中容纳该证