代码之家  ›  专栏  ›  技术社区  ›  Ian Hopkinson

使用matlab的urlread命令处理无效的安全证书

  •  7
  • Ian Hopkinson  · 技术社区  · 15 年前

    我正在使用matlab访问内部数据库 urlread 命令,在将服务移动到安全服务器(即使用HTTPS地址而不是HTTP地址)之前,一切都正常工作。现在 URLRADE 不再成功检索结果。它给出一个错误:

    下载URL时出错。您的网络连接可能已断开或代理设置配置不正确。

    我认为问题在于服务使用了无效的数字证书,因为如果我试图直接在Web浏览器中访问资源,我会收到“不可信连接”警告,我可以通过将网站添加到例外列表来传递该警告。 URLRADE 没有明显的方法来处理这个问题。

    罩下 URLRADE 使用Java访问Web资源,并在此行中引发错误:

    inputStream = urlConnection.getInputStream;
    

    哪里 urlConnection 是Java对象: sun.net.www.protocol.https.HttpsURLConnectionImpl .

    有人建议解决这个问题吗?

    3 回复  |  直到 9 年前
        1
  •  6
  •   Amro    9 年前

    考虑下面的Java类。我用这一页作为参考:

    Disabling Certificate Validation in an HTTPS Connection

    C:\matlab\myjavaclasses\com\stackoverflow\downloader.java

    package com.stackoverflow;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import javax.net.ssl.HostnameVerifier;
    
    public class Downloader {
        public static String getData(String address) throws Exception {
            // Create a trust manager that does not validate certificate chains
            TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
                    }
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
                    }
                }
            };
    
            // Create a host name verifier that always passes
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
    
            // Install the all-trusting trust manager
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    
            // Install the all-trusting host verifier
            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    
            // open connection
            URL page = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) page.openConnection();
            BufferedReader buff = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
            // read text
            String line;
            StringBuffer text = new StringBuffer();
            while ( (line = buff.readLine()) != null ) {
                //System.out.println(line);
                text.append(line + "\n");
            }
            buff.close();
    
            return text.toString();
        }
    
        public static void main(String[] argv) throws Exception {
            String str = getData("https://expired.badssl.com/");
            System.out.println(str);
        }
    }
    

    MATLAB

    首先,我们编译Java类(我们必须使用与Matlab兼容的JDK版本):

    >> version -java
    >> system('javac C:\MATLAB\MyJavaClasses\com\stackoverflow\Downloader.java');
    

    接下来我们将其实例化并使用matlab作为:

    javaaddpath('C:\MATLAB\MyJavaClasses')
    dl = com.stackoverflow.Downloader;
    str = char(dl.getData('https://expired.badssl.com/'));
    web(['text://' str], '-new')
    

    以下是一些带有要测试的错误SSL证书的URL:

    urls = {
        'https://expired.badssl.com/'       % expired
        'https://wrong.host.badssl.com/'    % wrong host
        'https://self-signed.badssl.com/'   % self-signed
        'https://revoked.grc.com/'          % revoked
    };
    

    更新: 我应该提到,从R2014B开始,matlab有一个新的函数 webread 那个替代物 urlread .

        2
  •  0
  •   Jan    12 年前

    谢谢你的解决方案。但是,有时我收到了以下异常:“java.io.io exception:在可信CA列表中找不到颁发者。”我无法消除此错误。

    因此,我尝试了另一种行之有效的解决方案。你可以在MATLAB函数中使用下面的Java代码:

     function str = ReadUrl(url)
         is = java.net.URL([], url, sun.net.www.protocol.https.Handler).openConnection().getInputStream(); 
         br = java.io.BufferedReader(java.io.InputStreamReader(is));
         str = char(br.readLine());
     end
    

    最好的, 简

        3
  •  0
  •   lindelof    11 年前

    还要注意,解决这个问题的“规范”方法是将证书导入Matlab的密钥库(即, 您的JVM的密钥库)。

    记录如下: Mathworks on using untrusted SSL certificates .

    推荐文章