主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 HTTPS 执行 MATLAB 函数

通过 HTTPS 连接到 MATLAB® Production Server™ 实例为执行 MATLAB 函数提供了安全通道。要与 MATLAB Production Server 实例建立 HTTPS 连接:

  1. 确保服务器实例配置为使用 HTTPS。有关详细信息,请参阅启用 HTTPS

  2. 配置客户端环境以使用 SSL。

  3. 使用已部署应用程序的 HTTPS URL 创建程序代理。有关使用代理编写客户端程序的更多信息,请参阅 创建 C# 客户端

为 SSL 配置客户端环境

在您的客户端应用程序可以向服务器实例发送 HTTPS 请求之前,服务器的根 SSL 证书必须存在于客户端计算机上的 Windows® 受信任的根证书颁发机构证书存储中。如果服务器使用自签名 SSL 证书,或者由证书颁发机构 (CA) 签名的服务器根证书不在 Windows 证书存储区中,请从 MATLAB Production Server 管理员处获取服务器证书或使用浏览器导出证书,然后将其添加到 Windows 证书存储区。

导出并保存 SSL 证书

您可以使用任何浏览器在客户端计算机上保存服务器证书。使用 Google Chrome® 保存证书的过程如下。

  1. 使用 Google Chrome 导航到服务器实例 URL https://server FQDN:port/api/health

  2. 在 Google Chrome 地址栏中,点击挂锁图标或警告图标,具体取决于服务器实例是使用 CA 签名的 SSL 证书还是自签名 SSL 证书。

  3. 点击 Certificate > Details > Copy to File。这样将打开一个向导,让您导出 SSL 证书。点击下一步

  4. 选择导出证书的格式,然后点击 Next

  5. 指定导出证书的位置和文件名,然后点击 Next

  6. 点击 Finish 完成证书导出。

将证书添加到 Windows 证书存储区

您可以使用证书管理工具或 Microsoft® 管理控制台 (MMC) 将服务器证书添加到 Windows 证书存储。使用 MMC 添加证书的过程如下。

  1. 从您的 Windows 计算机打开 MMC。

  2. 点击 File > Add/Remove Snap-in。这会打开 Add or Remove Snap-ins 窗口。

  3. Add or Remove Snap-ins 窗口中:

    1. 点击左侧窗格中的 Certificates,然后点击 Add

    2. 选择 Computer account,然后点击 Finish。这样做会将 Certificates(Local Computer) 添加到右侧窗格。

    3. 点击确定。这样您就可以进入主窗口。

  4. 在主窗口左侧窗格中,在 Console Root 下,点击 Certificates(Local Computer)。这样做将打开位于本地计算机的所有证书文件夹。

  5. 选择 Trusted Root Certification Authorities > More Actions > All Tasks > Import。这样做会打开证书导入向导。

  6. 点击 Next,然后选择服务器证书的位置。

  7. 点击 Next 以导入受信任的根证书颁发机构证书存储中的证书。

无需客户端身份验证即可建立安全代理连接

将客户端计算机配置为使用服务器证书后,您可以编写客户端程序以使用以下代码与服务器创建安全代理连接:

MWClient client = new MWHttpClient();
Uri secureUri = new Uri("https://server FQDN:port/myApplication")
MyProxy sslProxy = client.createProxy<MyProxy>(secureUri);

这样做会与在 https://server FQDN:port 运行的服务器实例创建一个安全代理连接,以便与已部署的应用程序 myApplication 进行通信。该连接使用 MWHttpClient 构造函数和代理对象引用 sslProxy

sslProxy 检查客户端计算机的证书存储以执行 HTTPS 服务器身份验证。如果服务器请求客户端身份验证,则 HTTPS 握手会失败,因为客户端没有证书。

使用客户端身份验证建立安全代理连接

在 .NET 客户端可以与需要客户端身份验证的服务器实例通信之前,您必须在客户端计算机上创建客户端证书捆绑包,并将客户端证书保存在服务器实例上。

创建并合并客户端证书

  1. 在客户端计算机上,生成自签名 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。有关配置服务器进行客户端身份验证的信息,请参阅 配置客户端身份验证

  2. 在客户端计算机上,使用以下命令将客户端证书和私钥合并到 PKCS#12 (PFX) 文件中:

    openssl pkcs12 -export -in client_cert.pem -inkey client_key.pem -out client_certificate.pfx

编写.NET 客户端程序

  1. 实现 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);
        }
      }
    }
    

  2. 创建与服务器的安全代理连接。

    使用 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 执行端点的主机名的值为 <uniqueID>.<location>.cloudapp.azure.com,但 CN 的值为 azure.com

实现高级身份验证功能

.NET ServicePointManager.ServerCertificateValidationCallback 属性允许您添加额外的安全层以实现以下目标:

  • 禁用 SSL 协议以防止 POODLE 漏洞攻击。

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
  • 当服务器 URL 中的主机名与 SSL 证书中的主机名不匹配时,执行备用主机名验证来验证服务器。

  • 确保客户端只与特定服务器共享数据。

示例代码

以下是使用 HTTPS 与服务器通信的示例客户端程序。

 MagicProxy.cs

另请参阅

主题

外部网站