我想创建推送通知服务器,在服务器中安装 SSL 证书和 .p12 文件时,我们遇到以下错误:我想知道 SSL 证书出了什么问题,因为我收到了 certificate_unknown 错误。
main, RECV TLSv1 ALERT: fatal, certificate_unknown
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
Error pushing notification(s):
Invalid certificate chain (Received fatal alert: certificate_unknown)! Verify that the keystore you provided was produced according to specs...
at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:359)
at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:301)
at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:258)
at javapns.Push.payload(Push.java:122)
at javapns.Push.alert(Push.java:36)
at com.applicationname.pns.PushNotification.main(PushNotification.java:31)
//源代码
/**
*
*/
package com.applicationname.pns;
import org.json.JSONException;
import javapns.Push;
import javapns.devices.Device;
import javapns.notification.Payload;
import javapns.notification.PushNotificationManager;
import javapns.notification.PushNotificationPayload;
public class PushNotification
{
private static final String HOST = "gateway.sandbox.push.apple.com";
private static final int PORT = 2195;
private static final int BADGE = 66;
private static String iPhoneId = "5696ee2fa44c61fd21a7987d2b1bcf57faa1603e63cb57ff204b158fb90d28a3";
private static String certificate = "D:/./trunk/Development/JavaPNS/src/com/applicationname/pns/privateKey.p12";
private static String passwd = "password@1234";
/**
* @param args
*/
public static void main(String[] args)
{
Push.alert("Hello World!", certificate, passwd, false,iPhoneId);
PushNotificationPayload payLoad = new PushNotificationPayload();
try
{
payLoad.addAlert("Hello World!");
payLoad.addBadge(10);
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案1
将私钥作为客户端请求加载到 SSL 套接字的情况并不常见。我个人认为您应该加载公钥。私钥由服务器端的 SSL 套接字加载。您需要私钥的唯一原因是充当服务器并接受来自另一端的连接,但您似乎没有这样做。
这也许可以解释“证书格式错误”的消息。
在参照:
private static String certificate = "D:/./trunk/Development/JavaPNS/src/com/applicationname/pns/privateKey.p12"
答案2
我认为这个错误是不言而喻的,您的证书链实际上没有正确验证您的证书。也许您缺少验证最终证书所需的一个或多个链证书?
无论它是什么,错误都会给你非常明确的指令“验证你提供的密钥库是否按照规格生成...”。
除了阅读您的错误信息并执行相应操作之外,此网站上的任何人都无法提供任何帮助 - 我们都没有水晶球,也无法神奇地解决您的问题。
我认为发布问题没有任何意义,因为您除了非常清晰的错误消息(告诉您具体该怎么做)之外没有提供更多信息。我们只能说“按照错误消息的指示去做!”
答案3
我遇到过这个问题几次,但是最近一次我发现我的 x509 扩展并不完整。
我有一台需要保护的服务器,但有时它还需要充当其他服务器的客户端。我最终将问题归结为X509v3 扩展密钥用法缺少TLS Web 客户端身份验证当我的服务器充当客户端时,我可以使用扩展。我不确定这是否是坏习惯,但碰巧的是,受保护的服务器之间共享了一些信息。
请务必检查您的证书扩展以验证其是否具有预期的内容。
openssl x509 -in cert.pem -noout -text | less
如果您认为您也遇到了我的问题,则必须重新发出缺少扩展名的新证书。
如果您是自己的 CA,只需将以下内容添加到您的签名操作(或您的 CSR,如果启用了复制)下的您选择的扩展节下(我的是req_both
(这是我的 cnf 文件的一部分):
[req_both]
... other extensions
extendedKeyUsage = clientAuth, serverAuth
... more extensions
如果您不是 CA,那么您必须向您的证书提供商发起新的证书签名请求 (CSR),并让他们复制您的扩展或让他们知道您需要的所有扩展。