Frage

ich Zugriff auf eine interne Datenbank mit MATLAB urlread Befehl , funktioniert alles gut, bis der Dienst an einen sicheren Server (dh mit einer HTTPS-Adresse statt einer HTTP-Adresse) verschoben wurde. Jetzt urlread nicht mehr erfolgreich Ergebnisse abruft. Es gibt einen Fehler:

  

Fehler beim Herunterladen der URL. Ihre Netzwerkverbindung kann oder Ihre Proxy-Einstellungen nicht richtig konfiguriert.

Ich glaube, das Problem ist, dass der Dienst ein ungültiges digitales Zertifikat verwendet, da, wenn ich versuche, in einem Web-Browser auf die Ressource direkt für den Zugriff auf I „nicht vertrauenswürdige Verbindung“ Warnung erhalten, die ich in der Lage bin, indem Sie die Website ein, um durch Ausnahmeliste. urlread hat keine offensichtliche Möglichkeit, dieses Problem umzugehen.

Unter der Haube urlread wird mit Hilfe von Java Web-Ressourcen zugreifen zu können, und der Fehler wird an dieser Linie geworfen:

inputStream = urlConnection.getInputStream;

wo urlConnection ist ein Java-Objekt:. sun.net.www.protocol.https.HttpsURLConnectionImpl

Wer eine Abhilfe für dieses Problem vorschlagen?

War es hilfreich?

Lösung

Betrachten Sie die folgende Java-Klasse. Ich habe diese Seite als Referenz:

  

Deaktivieren Zertifikatsüberprüfung in einer HTTPS-Verbindung

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

Zuerst erstellen wir die Java-Klasse (müssen wir eine JDK-Version kompatibel mit MATLAB verwenden):

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

Als nächstes werden wir instanziiert und es verwenden, MATLAB als:

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

Hier sind ein paar URLs mit schlechten SSL-Zertifikate Test:

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
};

UPDATE: Ich sollte erwähnen, dass mit R2014b starten, MATLAB eine neue Funktion webread die urlread .

Andere Tipps

Dank für die Lösung. Es funktionierte, aber manchmal habe ich die folgende Ausnahme erhalten hatte „java.io.IOException. Der Emittent kann nicht in der vertrauenswürdigen CA-Liste zu finden“ und ich war nicht in der Lage dieses Fehlers zu befreien.

Deshalb habe ich versucht, eine alternative Lösung, die gut funktioniert. Sie können den folgenden Java-Code in Matlab-Funktion:

 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

Best, Jan

Beachten Sie auch, dass der „kanonische“ Weg, um dieses Problem zu lösen, ist das Zertifikat in MATLAB Schlüsselspeicher (das heißt, nicht Ihre JVM Schlüsselspeicher) zu importieren.

Dies ist hier dokumentiert: Mathworks zur Verwendung von nicht vertrauenswürdigen SSL-Zertifikaten

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top