java - 通过执行 HttpsURLConnection.setDefaultSSLSocketFactory 拒绝访问 setFactory

标签 java ssl permissions

我的范围是发送一个 https 消息,信任来自嵌入式 Linux 模块上的 Java 应用程序的所有证书,上面有 JVM(IcedTea6 1.11,Java 版本 1.6.0_24)(因为信息我无权访问此嵌入式 Linux 或到 JVM 进行任何更改,我只能将已编译的 java 应用程序放在上面)。

我只有基本的 Java 知识,但我根据在网上找到的一些示例编写了一个信任所有证书的应用程序。 一开始我在网上报错

SSLContext sc = SSLContext.getInstance("SSL");

我发现问题是 SunJSSE Provider 没有在 JVM 中实现。 我的第一步是添加 SunJSSE Provider

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

在此之后,如果我读出提供程序,我可以看到添加成功,现在我找到了提供程序“SunJSSE version 1.6”。 Trust all Certificate Class 如下:

public final class TrustAllCertificates implements X509TrustManager, HostnameVerifier
{
     public X509Certificate[] getAcceptedIssuers() {return null;}
     public void checkClientTrusted(X509Certificate[] certs, String authType) {}
     public void checkServerTrusted(X509Certificate[] certs, String authType) {}
     public boolean verify(String hostname, SSLSession session) {return true;}
     public static void install()
     {
         try
         {
            TrustAllCertificates trustAll = new TrustAllCertificates();
            final SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, new TrustManager[]{trustAll}, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(trustAll);
         }
         catch (Exeption e)
         {
            JatLog.writeTempLog("Error: " + e.getMessage());
         }
     }
}

现在我总是收到错误

access denied (java.lang.RuntimePermission setFactory)

关于执行行

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

有人知道如何解决这个问题吗?

最佳答案

看起来 SecurityManager 阻止了它。尝试单个连接的设置:

    SSLContext sc = SSLContext.getInstance("SSL");
    TrustAllCertificates trustAll = new TrustAllCertificates();
    sc.init(null, new TrustManager[] { trustAll }, new java.security.SecureRandom());

    URL url = new URL("https://www.google.com/");
    URLConnection urlConnection = url.openConnection();
    if (urlConnection instanceof HttpsURLConnection) {
        HttpsURLConnection uc = (HttpsURLConnection) urlConnection;

        uc.setSSLSocketFactory(sc.getSocketFactory());
        uc.setHostnameVerifier(trustAll);

        uc.connect();
        JatLog.writeTempLog("headers: "+uc.getHeaderFields());
        uc.disconnect();
    }

如果这没有帮助请瑞典人更新安全管理器设置;)

第一个

关于java - 通过执行 HttpsURLConnection.setDefaultSSLSocketFactory 拒绝访问 setFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20050742/

相关文章:

c# - "Authentication failed because the remote party has closed the transport stream"普通用户

android - 以编程方式向应用程序 list 添加权限

java - 矩形着色逻辑

java - 为什么 switch 或 if else 语句不被认为是多态的?

java - `ConcurrentHashMap`迭代器的多线程使用

java - DSSException : Revocation data is missing

java - 在java中使用TCP在Android手机和PC之间进行通信

ssl - 如何将 frisby.js 与 SSL 客户端证书一起使用?

android - Launcher没有启动Intent的权限

ios - requestRecordPermission 什么都不做