主要内容

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

使用 HTTPS 执行 MATLAB 函数

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

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

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

  3. 使用已部署应用程序的 HTTPS URL 创建程序代理。有关使用 MATLAB Production Server Java 客户端库编写客户端程序的更多信息,请参阅 使用 MWHttpClient 类创建 MATLABProduction ServerJava 客户端

MATLAB Production Server Java 客户端 API 提供了以下挂钩:

  • 禁用安全协议以防止 POODLE 漏洞。

  • 提供您自己的 HostnameVerifier 实现。

  • 实现超出 HTTPS 提供的服务器授权。

为 SSL 配置客户端环境

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

导出并保存 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. 您可以使用默认格式选择 DER encoded binary X.509 (.CER)。点击下一步

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

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

将证书添加到 Java 信任存储

默认的 Java 信任库位于 ${JAVA_HOME}\lib\security\cacerts。您可以使用位于 keytool 中的 ${JDK_HOME}\bin 实用工具将服务器的 SSL 证书导入到客户端计算机上的信任存储中。有关详细信息,请参阅 keytool

使用以下命令将服务器证书导入到客户端计算机的 Java 信任库:

C:\tmp>keytool -importcert -file PATH_TO_SERVER_CERTIFICATE\server_cert.cer -keystore client.truststore

这样做会将服务器证书 server_cert.cer 导入信任存储并在当前工作目录中生成 client.truststore 文件。您可以在编写客户端程序建立安全代理连接时指定 client.truststore 文件作为信任库。

要使用客户端信任存储区默认位置以外的位置,请使用 Java 系统属性设置信任存储区位置和密码,可以使用 Java 代码或在运行 Java 客户端程序时使用命令行。

  • 在代码中设置 Java 系统属性:

    System.setProperty("javax.net.ssl.trustStore",
                       "PATH_TO_TRUSTSTORE\\client.truststore");
    System.setProperty("javax.net.ssl.trustStorePassword",
                       "TS_PASSWORD");
    MWClient client = new MWHttpClient();
    URL sslURL = new URL("https://server FQDN:port/myApplication");
    
    MyProxy sslProxy = client.createProxy(sslURL, MyProxy.class);

  • 在运行时使用命令行设置 Java 系统属性:

    C:\>java -Djavax.net.ssl.trustStore="client.truststore" -Djavax.net.ssl.trustStorePassword="TS_PASSWORD" CLIENT_NAME

要连接到需要客户端身份验证的服务器,客户端证书还必须存在于客户端的密钥库中。有关详细信息,请参阅使用客户端身份验证建立安全连接

建立安全代理连接

在您的客户端计算机配置为使用服务器证书后,或者如果服务器使用 Java 信任的 CA 签名 SSL 证书,您可以编写客户端程序以使用以下代码与服务器创建安全代理连接:

MWClient client = new MWHttpClient();
URL sslURL = new URL("https://server FQDN:port/myApplication");
MyProxy sslProxy = client.createProxy(sslURL, MyProxy.class);

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

sslProxy 检查客户端计算机的默认 Java 信任存储以执行 HTTPS 服务器身份验证。如果服务器请求客户端身份验证,则 HTTPS 握手将失败,因为 JRE 创建的默认 SSLContext 对象不提供密钥存储。

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

在 .NET 客户端可以与需要客户端身份验证的服务器实例通信之前,您必须创建客户端证书。

创建客户端证书

  1. 在客户端计算机上,在密钥库中创建 JKS 格式的客户端证书。

    C:\tmp>keytool -genkey -alias javaclient -keystore client.jks
    该命令创建一个别名为 client.jks 的证书 javaclient

  2. 在您的客户端程序中,使用文件 client.jks 设置密钥存储位置,并使用 Java 系统属性设置密码。

    System.setProperty("javax.net.ssl.keyStore", "PATH_TO_KEYSTORE\\client.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "keystore_pass");
    MWClient client = new MWHttpClient();
    URL sslURL = new URL("https://hostname:port/myApplication");
    MyProxy sslProxy = client.createProxy(sslURL, MyProxy.class);

在服务器上保存客户端证书

  1. 使用 client.jks 以 DER 格式导出公共客户端证书 keytool,然后使用 openssl 将其转换为 PEM 格式。

    C:\tmp>keytool -export -keystore client.jks -alias javaclient -file client.cer
    C:\tmp>openssl x509 -inform DER -in client.cer -outform PEM -text -out client_cert.pem

  2. MATLAB Production Server 管理员必须在服务器实例上保存客户端证书 client_cert.pem,并在服务器配置文件 main_config 中设置 x509-ca-file-store。有关配置服务器进行客户端身份验证的信息,请参阅 配置客户端身份验证

处理异常

覆盖证书检查

如果客户端计算机上的 Java 信任存储中不存在服务器的自签名证书或根 CA 证书,并且 MATLAB 函数执行的 HTTPS URL 的主机名与服务器的 SSL 证书的通用名称 (CN) 之间没有不匹配,则运行客户端程序会导致以下异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

使用下列选项之一来处理此异常:

  • 将服务器的 SSL 证书添加到客户端计算机上的 Java 信任存储。有关详细信息,请参阅将证书添加到 Java 信任存储

  • 使用以下代码覆盖证书检查并接受不受信任的证书。代码提供了 MWSSLConfig 接口的自定义实现,以使用自定义的 SSLContext 实现。

    MWSSLConfig sslConfig = new MWSSLDefaultConfig(){
        public SSLContext getSSLContext(){
            try {
                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) {  }
                    }
                };
     
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                return sc;
            } catch(Exception ex){
                throw new RuntimeException("Error creating SSLContext : ", ex);
            }
        }
    };
             
    // Create a non-interruptible MWHttpClient instance
    final MWClient client = new MWHttpClient(sslConfig);
    不建议在生产环境中使用此选项。

禁用主机名验证

如果 MATLAB 函数执行的 HTTPS URL 的主机名与服务器上的 SSL 证书的 CN 不匹配,您可以在客户端程序中使用以下代码覆盖证书检查以禁用主机名验证:

class MySSLConfig extends MWSSLDefaultConfig {
  public HostnameVerifier getHostnameVerifier() {
    return new HostnameVerifier() {
      public boolean verify(String s, SSLSession sslSession) {
        return true;
      }
    };
  }
}

Azure® 上的 MATLAB Production Server 部署默认使用自签名 SSL 证书。建议用 CA 签名的证书替换自签名证书。但如果要使用自签名证书向服务器发送 HTTPS 请求,客户端程序必须禁用主机名验证,以避免遇到因主机名验证失败导致的异常。由于 MATLAB 函数执行的 HTTPS URL 中的主机名与自签名证书的通用名称 (CN) 不匹配,导致验证失败。MATLAB 执行端点的主机名的值为 <uniqueID>.<location>.cloudapp.azure.com,但 CN 的值为 azure.com

示例代码

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

 MagicAsync.java

另请参阅

主题

外部网站