التعامل مع غير صالحة شهادة الأمان باستخدام MATLAB هو urlread الأمر
-
08-07-2019 - |
سؤال
أنا الوصول إلى قاعدة بيانات داخلية باستخدام MATLAB هو urlread
الأمر كان كل شيء على ما يرام حتى خدمة نقل إلى خادم آمن (أيمع HTTPS العنوان بدلا من عنوان HTTP).الآن urlread
لم يعد بنجاح باسترداد النتائج.فإنه يعطي خطأ:
خطأ في تحميل URL.اتصال الشبكة الخاص بك قد يكون أسفل أو إعدادات الوكيل تكوينه بشكل غير صحيح.
أعتقد أن المشكلة هي أن الخدمة باستخدام رقمي الشهادة بما إذا حاولت الوصول إلى الموارد مباشرة في مستعرض ويب أحصل على "اتصال غير موثوق بها" التحذير مما أنا قادرة على تمرير من خلال بإضافة الموقع إلى قائمة الاستثناءات. urlread
لم يكن لديك طريقة واضحة للتعامل مع هذه المشكلة.
تحت غطاء محرك السيارة urlread
يتم استخدام جافا للوصول إلى موارد الشبكة ، يتم طرح الخطأ في هذا السطر:
inputStream = urlConnection.getInputStream;
حيث urlConnection
هو كائن جافا: sun.net.www.protocol.https.HttpsURLConnectionImpl
.
لأي شخص أن يقترح حلا لهذه المشكلة ؟
المحلول
النظر في المسائل التالية الطبقة جافا.أنا استخدم هذه الصفحة كمرجع:
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 غير موثوق بها
.