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

连接到APN时出现SSLHandshake异常

洪雅健
2023-03-14

我编写了一个示例Java客户端代码来连接到APNs服务器向我的设备发送推送通知。它在与APNs服务器的安全连接中失败了。有人能帮帮我吗?代码如下:

public class APNSDriver {
    public static void main(String[] args) {
        APNSDriver.sendSamplePushNotification();
    }

    static SSLSocketFactory getSSLSocketFactory() {
        try {
            String keystoreFilename = "D:\\Oracle\\IDCS\\MFA\\APNS\\OMA_prereqs_backup\\iOS_prod.p12";
            char[] storepass = "welcome1".toCharArray();
            FileInputStream fis = new FileInputStream(
                    new File(keystoreFilename));

            final KeyStore ks = KeyStore.getInstance("PKCS12");
            ks.load(fis, storepass);

            KeyManagerFactory keyManagerFactory = KeyManagerFactory
                    .getInstance("SunX509");
            keyManagerFactory.init(ks, storepass);

            TrustManagerFactory trustManagerFactory = TrustManagerFactory
                    .getInstance("SunX509");
            trustManagerFactory.init((KeyStore) null);

            // create ssl context
            SSLContext sslContext = SSLContext.getInstance("TLS");

            // setup the HTTPS context and parameters
            sslContext.init(keyManagerFactory.getKeyManagers(),
                    trustManagerFactory.getTrustManagers(), null);

            if (keyManagerFactory != null || trustManagerFactory != null) {
                return sslContext.getSocketFactory();
            }
        } catch (Exception e) {
            System.out.println("Unable to create ssl socket factory");
            e.printStackTrace();
        }
        return HttpsURLConnection.getDefaultSSLSocketFactory();
    }

    private static void sendSamplePushNotification() {
        URL url = null;
        try {
            HostnameVerifier hv = new HostnameVerifier() {
                public boolean verify(String urlHostName, SSLSession session) {
                    return true;
                }
            };

            url = new URL("https://api.development.push.appl.com:443");
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
                    "www-proxy.us.oracle.com", 80));
            HttpsURLConnection conn = (HttpsURLConnection) url
                    .openConnection(proxy);
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setHostnameVerifier(hv);
            conn.setSSLSocketFactory(getSSLSocketFactory());
            OutputStream os = conn.getOutputStream();
            ..........
    }
}

它在conn.getoutputstream()行处失败,出现以下错误:javax.net.ssl.sslhandShakeException:sun.security.validator.validatoreXception:在sun.security.ssl.alerts.getsslException(alerts.java.sslsocketimpl.fatal(sslsocketimpl.java:192),在sun.security.ssl.slsocketimpl.fatalse(handshaker.java:302),在sun.net.www.protocol.https.abstractDelegateHttpSurlConnection.connect(AbstractDelegateHttpSurlConnection.java:185)在sun.net.www.protocol.http.http.http.httpurlConnection.getoutputStream0(httpurlConnection.java:1282)在sun.net.www.protocol.https.httpsurlConnection.getoutputStream(httpurlConnection.java:1257)在mfa.apnsdriver.apnsdriver.main(apnsdriver.java:28)原因:sun.security.validator.validatoreXception:找不到受信任的证书................

共有1个答案

赵飞雨
2023-03-14

您需要有效的证书才能连接到该URL。您可以尝试使用InstallCert.java应用程序(可以从github(https://github.com/escline/installCert)下载)从服务器获取证书,并将其添加到信任存储中。

  1. 下载该类
  2. 设置运行配置,添加为程序参数->https://api.development.push.appl.com:443 changeit(Change it是truststore默认的传递)
  3. 应用程序创建truststore的副本,并将来自服务器的证书添加到该副本中。
  4. 获取生成的名为“jssecacerts”的文件,将其重命名为“cacerts”,并替换Java>JRE>Security>lib文件夹中存在的cacerts文件。

如果您已经有了一个有效的证书,并且不需要从服务器获取它,只需使用KeyStoreExplorer工具,打开Java>JRE>Security>Lib cacerts文件,并添加您的证书。然后重新启动LocalServer。请确保进行此更改的java文件夹是本地服务器正在使用的JVM。

 类似资料:
  • 原因:组件组织。neo4j。内核impl。交易XaDataSourceManager@2a792260'已成功初始化,但无法启动。请参阅随附的原因例外。 CausedBy:组件org.neo4j.kernel.impl.nioneo.xa.NeoStoreXaDataSource@23d7c3d2已成功初始化,但无法启动。请参阅附件中的原因异常。 原因:没有架构索引提供程序组织。neo4j。内核应

  • 我正在使用SunPKCS11连接到HSM设备。我有一些运行完美的单元测试(实际上他们会进行一些签名和验证),但是,当我将应用程序部署到tomcat或jetty时,我会得到这个异常(这个异常是在jetty中部署期间引发的,tomcat的异常是相似的): 下面是我如何实例化SunPKCS11的: 只是为了添加一些细节,我在windows server 2012上使用了64位java8。 更新1:我刚刚

  • 我的代码如下。 异常发生在下面给出的第二行。 异常是什么意思?我的代码有什么问题? 由Girish编辑 listener.ora文件: tnsnames.ora 文件: 在上面的示例中,给出了tnsnames.ora和listener.ora文件的内容。

  • 我正在尝试使用hazelcast v3。2.4(服务器和客户端上的版本相同)。服务器(我可以安装的简单实现)正在服务器上运行。客户端尝试连接到远程服务器-服务器打印身份验证请求,但我收到以下日志输出(包括异常)-关于我可以做什么不同的想法(复制日志输出和配置文件)。我正在尝试通过TCP/IP进行连接,我检查了网络连接——我没有看到任何东西阻止连接。 堆栈中提到的代码行: 配置 日志输出 服务器输出

  • 我正在使用asmack-android-16为我的聊天应用程序。有时,在创建连接,我得到SSL异常,然后我无法登录服务器。我的服务器正在对连接使用SSL身份验证。有人能帮帮我吗?我已经挣扎了好几周了 以下是我的连接配置: XMPPConnection连接=new XMPPConnection(连接配置);connection.connect (); // 调用此行会给我异常,尽管已创建连接。 以下

  • 并在握手失败结束时找到“无效”记录器: 从记录器来看,我认为使用的SSL协议版本是TLS1.2,看起来不错。它看起来像密码不匹配-但不确定我是否忽略了什么,以及如何补救这一点。 在进一步检查日志时,发现以下一个错误: