使用 HTTPS 执行 MATLAB 函数
通过 HTTPS 连接到 MATLAB® Production Server™ 实例为执行 MATLAB 函数提供了安全通道。要与 MATLAB Production Server 实例建立 HTTPS 连接:
为 SSL 配置客户端环境
在您的客户端应用程序可以向服务器实例发送 HTTPS 请求之前,服务器的根 SSL 证书必须存在于客户端计算机上的 Windows® 受信任的根证书颁发机构证书存储中。如果服务器使用自签名 SSL 证书,或者由证书颁发机构 (CA) 签名的服务器根证书不在 Windows 证书存储区中,请从 MATLAB Production Server 管理员处获取服务器证书或使用浏览器导出证书,然后将其添加到 Windows 证书存储区。
导出并保存 SSL 证书
您可以使用任何浏览器在客户端计算机上保存服务器证书。使用 Google Chrome® 保存证书的过程如下。
使用 Google Chrome 导航到服务器实例 URL
https://。server FQDN:port/api/health在 Google Chrome 地址栏中,点击挂锁图标或警告图标,具体取决于服务器实例是使用 CA 签名的 SSL 证书还是自签名 SSL 证书。
点击 Certificate > Details > Copy to File。这样将打开一个向导,让您导出 SSL 证书。点击下一步。
选择导出证书的格式,然后点击 Next。
指定导出证书的位置和文件名,然后点击 Next。
点击 Finish 完成证书导出。
将证书添加到 Windows 证书存储区
您可以使用证书管理工具或 Microsoft® 管理控制台 (MMC) 将服务器证书添加到 Windows 证书存储。使用 MMC 添加证书的过程如下。
从您的 Windows 计算机打开 MMC。
点击 File > Add/Remove Snap-in。这会打开 Add or Remove Snap-ins 窗口。
在 Add or Remove Snap-ins 窗口中:
点击左侧窗格中的 Certificates,然后点击 Add。
选择 Computer account,然后点击 Finish。这样做会将 Certificates(Local Computer) 添加到右侧窗格。
点击确定。这样您就可以进入主窗口。
在主窗口左侧窗格中,在 Console Root 下,点击 Certificates(Local Computer)。这样做将打开位于本地计算机的所有证书文件夹。
选择 Trusted Root Certification Authorities > More Actions > All Tasks > Import。这样做会打开证书导入向导。
点击 Next,然后选择服务器证书的位置。
点击 Next 以导入受信任的根证书颁发机构证书存储中的证书。
无需客户端身份验证即可建立安全代理连接
将客户端计算机配置为使用服务器证书后,您可以编写客户端程序以使用以下代码与服务器创建安全代理连接:
MWClient client = new MWHttpClient();
Uri secureUri = new Uri("https://server FQDN:port/myApplication")
MyProxy sslProxy = client.createProxy<MyProxy>(secureUri);这样做会与在 https:// 运行的服务器实例创建一个安全代理连接,以便与已部署的应用程序 server FQDN:portmyApplication 进行通信。该连接使用 MWHttpClient 构造函数和代理对象引用 sslProxy。
sslProxy 检查客户端计算机的证书存储以执行 HTTPS 服务器身份验证。如果服务器请求客户端身份验证,则 HTTPS 握手会失败,因为客户端没有证书。
使用客户端身份验证建立安全代理连接
在 .NET 客户端可以与需要客户端身份验证的服务器实例通信之前,您必须在客户端计算机上创建客户端证书捆绑包,并将客户端证书保存在服务器实例上。
创建并合并客户端证书
在客户端计算机上,生成自签名 SSL 证书和私钥,或者获取 CA 签名的 SSL 证书和私钥。
要生成自签名 SSL 证书,您可以使用
openssl命令,如下所示:该命令生成一个自签名证书openssl req -x509 -nodes -newkey rsa:4096 -keyout client_key.pem -out client_cert.pem -days 365
client_cert.pem和一个私钥client_key.pem。该证书有效期为 365 天。有关更多信息,请参阅 OpenSSL。MATLAB Production Server 管理员必须在服务器实例上保存客户端证书
client_cert.pem,并在服务器配置文件main_config中设置 x509-ca-file-store。有关配置服务器进行客户端身份验证的信息,请参阅 配置客户端身份验证。在客户端计算机上,使用以下命令将客户端证书和私钥合并到 PKCS#12 (PFX) 文件中:
openssl pkcs12 -export -in client_cert.pem -inkey client_key.pem -out client_certificate.pfx
编写.NET 客户端程序
实现
MWSSLConfig接口。MWSSLConfig接口具有一个类型为ClientCertificates的属性X509CertificateCollection。提供返回客户端证书的实现。public class ClientSSLConfig : MWSSLConfig { public X509CertificateCollection ClientCertificates { get { X509Certificate2 clientCert = new X509Certificate2("C:\\temp\\client_certificate.pfx"); return new X509Certificate2Collection(clientCert); } } }创建与服务器的安全代理连接。
使用
MWHttpClient构造函数与服务器实例创建安全代理连接。MWHttpClient构造函数将MWSSLConfig实现的实例作为参量。使用createProxy方法为所需应用程序创建具有 HTTPS URL 的基于接口的代理对象引用。MWClient client = new MWHttpClient(new ClientSSLConfig()); Uri secureUri = new Uri("https://<server FQDN>:9920/myApplication") MyProxy sslProxy = client.createProxy<MyProxy>(secureUri);sslProxy使用本地用户信任存储来执行 HTTPS 服务器身份验证。如果服务器请求客户端身份验证,客户端将传递由MWSSLConfig接口实现返回的集合中的证书。
处理异常
覆盖证书检查
如果客户端计算机上的 Windows 受信任的根证书颁发机构证书存储中不存在服务器的自签名证书或根 CA 证书,并且 MATLAB 函数执行的 HTTPS URL 的主机名与服务器的 SSL 证书的通用名称 (CN) 之间没有不匹配,则运行客户端程序会导致以下异常:
No response received in WebException with status : TrustFailure
使用下列选项之一来处理此异常:
将服务器的 SSL 证书添加到客户端计算机上的 Windows 受信任的根证书颁发机构证书存储中。有关详细信息,请参阅为 SSL 配置客户端环境。
使用以下代码覆盖证书检查并接受不受信任的证书:
不建议在生产环境中使用此选项,因为它会覆盖所有证书检查。ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
ServerCertificateValidationCallback属性是在 SSL 握手期间处理证书的委托。默认情况下,没有实现委托,因此不执行自定义处理。您可以提供一个实现来执行所需的任何自定义授权。
禁用主机名验证
如果 MATLAB 函数执行的 HTTPS URL 的主机名与服务器上的 SSL 证书的 CN 不匹配,您可以在客户端程序中使用以下代码覆盖证书检查以禁用主机名验证:
ServicePointManager.ServerCertificateValidationCallback = delegate (
Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors.ToString().Equals("RemoteCertificateNameMismatch"))
{
return (true);
}
return (false);
};Azure® 上的 MATLAB Production Server 部署默认使用自签名 SSL 证书。建议用 CA 签名的证书替换自签名证书。但如果要使用自签名证书向服务器发送 HTTPS 请求,客户端程序必须禁用主机名验证,以避免遇到因主机名验证失败导致的异常。由于 MATLAB 函数执行的 HTTPS URL 中的主机名与自签名证书的通用名称 (CN) 不匹配,导致验证失败。MATLAB 执行端点的主机名的值为 <,但 CN 的值为 uniqueID>.<location>.cloudapp.azure.comazure.com。
实现高级身份验证功能
.NET ServicePointManager.ServerCertificateValidationCallback 属性允许您添加额外的安全层以实现以下目标:
禁用 SSL 协议以防止 POODLE 漏洞攻击。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
当服务器 URL 中的主机名与 SSL 证书中的主机名不匹配时,执行备用主机名验证来验证服务器。
确保客户端只与特定服务器共享数据。
示例代码
以下是使用 HTTPS 与服务器通信的示例客户端程序。
