Java 使用MATLAB'处理无效的安全证书;urlread命令

Java 使用MATLAB'处理无效的安全证书;urlread命令,java,matlab,https,ssl-certificate,urlread,Java,Matlab,Https,Ssl Certificate,Urlread,我正在使用MATLAB的命令访问一个内部数据库,在服务被移动到一个安全服务器(即使用HTTPS地址而不是HTTP地址)之前,一切都正常工作。现在,urlread不再成功检索结果。它给出了一个错误: 下载URL时出错。您的网络连接可能已断开,或者代理设置配置不正确 我认为问题在于该服务使用了无效的数字证书,因为如果我试图在web浏览器中直接访问资源,我会收到“不受信任的连接”警告,通过将网站添加到异常列表,我可以通过该警告urlread没有处理此问题的明显方法 在后台,urlread正在使用Jav

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

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

我认为问题在于该服务使用了无效的数字证书,因为如果我试图在web浏览器中直接访问资源,我会收到“不受信任的连接”警告,通过将网站添加到异常列表,我可以通过该警告
urlread
没有处理此问题的明显方法

在后台,
urlread
正在使用Java访问web资源,并在以下行抛出错误:

inputStream = urlConnection.getInputStream;
其中
urlConnection
是一个Java对象:
sun.net.www.protocol.https.HttpsURLConnectionImpl


有人建议解决这个问题吗

考虑以下Java类。我将此页用作参考:

C:\MATLAB\MyJavaClasses\com\stackoverflow\Downloader.java MATLAB 首先,我们编译Java类(我们必须使用与MATLAB兼容的JDK版本):

接下来,我们实例化并将其用作:

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有一个新的函数取代了它。

感谢您的解决方案。但是,有时我会收到以下异常“java.io.IOException:在受信任的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
最好的, Jan

还请注意,解决此问题的“规范”方法是将证书导入MATLAB的密钥库(即,不是JVM的密钥库)


这里记录了这一点:。

您使用的是哪个版本的MATLAB?可能没有解决办法:我在2009年。我已经看到了您链接到的解决方案,我认为这不是问题所在。我认为urlread函数支持https,但不能处理无效的安全证书。感谢Amro,它似乎正在为一个具有无效证书的测试用例工作!我的Java能力有点低,最后我把包语句拿出来让它工作,可能如果我把东西放在正确的目录结构中,我就不需要这样做了。@amadeus:谢谢修复链接。FWIW,这里是由数据库捕获的旧页面,另一种解决方案是将有问题的网站证书作为可信证书导入MATLAB的JRE密钥库。请参阅此处了解说明:如果在OSX上运行R2015a,我将如何实现此代码?这似乎是我遇到的一个确切问题的解决方案,但我几乎没有Java经验,也不知道如何使用这个解决方案。谢谢你的邀请help@dwm8:您需要(必须是1.7.x版)来编译上述Java类
javac Downloader.Java
,将目录如上所述添加到MATLAB Java类路径(注意包布局),并从MATLAB内部将其用于类。假设您有
~/dev/com/stackoverflow/Downloader.java
编译它会生成
~/dev/com/stackoverflow/Downloader.class
。然后在MATLAB中添加
javaaddpath('~/dev')
,并将其用作
d=com.stackoverflow.Downloader()
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
};
 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