【问题标题】:SSLHandshake exception while connecting to APNs连接到 APN 时出现 SSLHandshake 异常
【发布时间】:2016-02-05 02:06:09
【问题描述】:

我编写了一个示例 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:192) 在 sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) ............................. sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection。连接(AbstractDelegateHttpsURLConnection.java:185) 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1282) 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1257) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) 在 com.coding.mfa.apnsdriver.APNSDriver.sendSamplePushNotification(APNSDriver.java:91) 在 com.coding.mfa.apnsdriver.APNSDriver.main(APNSDriver.java:28) 原因:sun.security.validator.ValidatorException:未找到受信任的证书 ....................

【问题讨论】:

    标签: java https apple-push-notifications


    【解决方案1】:

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

    1. 下载课程
    2. 设置运行配置添加为程序参数->https://api.development.push.appl.com:443changeit(改为信任库默认通行证)
    3. 该应用会创建您的信任库的副本,并将来自服务器的证书添加到其中。
    4. 获取生成的名为“jssecacerts”的文件,将其重命名为“cacerts”并替换您的 java>jre>security>lib 文件夹中存在的 cacerts 文件。

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

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 2015-04-18
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多