التعامل مع غير صالحة شهادة الأمان باستخدام MATLAB هو urlread الأمر

StackOverflow https://stackoverflow.com/questions/1638275

سؤال

أنا الوصول إلى قاعدة بيانات داخلية باستخدام MATLAB هو urlread الأمر كان كل شيء على ما يرام حتى خدمة نقل إلى خادم آمن (أيمع HTTPS العنوان بدلا من عنوان HTTP).الآن urlread لم يعد بنجاح باسترداد النتائج.فإنه يعطي خطأ:

خطأ في تحميل URL.اتصال الشبكة الخاص بك قد يكون أسفل أو إعدادات الوكيل تكوينه بشكل غير صحيح.

أعتقد أن المشكلة هي أن الخدمة باستخدام رقمي الشهادة بما إذا حاولت الوصول إلى الموارد مباشرة في مستعرض ويب أحصل على "اتصال غير موثوق بها" التحذير مما أنا قادرة على تمرير من خلال بإضافة الموقع إلى قائمة الاستثناءات. urlread لم يكن لديك طريقة واضحة للتعامل مع هذه المشكلة.

تحت غطاء محرك السيارة urlread يتم استخدام جافا للوصول إلى موارد الشبكة ، يتم طرح الخطأ في هذا السطر:

inputStream = urlConnection.getInputStream;

حيث urlConnection هو كائن جافا: sun.net.www.protocol.https.HttpsURLConnectionImpl.

لأي شخص أن يقترح حلا لهذه المشكلة ؟

هل كانت مفيدة؟

المحلول

النظر في المسائل التالية الطبقة جافا.أنا استخدم هذه الصفحة كمرجع:

تعطيل التحقق من صحة الشهادة في اتصال HTTPS

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 (يجب علينا أن نستخدم نسخة JDK متوافق مع MATLAB):

>> 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')

وإليك بعض عناوين url مع سوء SSL شهادات الاختبار:

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.

نصائح أخرى

وشكرا على الحل. عملت، ولكن، في بعض الأحيان، كنت قد حصلت على استثناء التالي "java.io.IOException: لا يمكن العثور على المصدر في القائمة CA موثوق به." وأنا لم أكن قادرا على التخلص من هذا الخطأ.

لذلك، حاولت حل بديل يعمل بشكل جيد. يمكنك استخدام كود جافا التالية في وظيفة ماتلاب:

 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

وأفضل، يناير

ملحوظة أيضا أن الطريقة "الكنسي" لحل هذه المسألة هي لاستيراد الشهادة إلى تخزين المفاتيح MATLAB ل(أي، <م> لا بك تخزين المفاتيح JVM ل).

وهذا هو موثق هنا: ماثووركس على استخدام شهادات SSL غير موثوق بها

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top