主要内容

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

自定义安全配置

MWSSLConfig 对象提供配置 HTTPS 的信息。Java® 客户端 API 提供了默认的 MWSSLConfig 实现 MWSSLDefaultConfig,当没有 SSL 配置传递给 MWHttpClient 构造函数时,它会使用该实现。MWSSLDefaultConfig 对象的实现如下:

  • getSSLContext() 返回 JRE 创建的默认 SSLContext 对象。

  • getHostnameVerifier() 返回一个始终返回 false 的 HostnameVerifier 实现。如果 HTTPS 主机名验证失败,这不会覆盖该决定。

  • getServerAuthorizer() 返回一个授权所有 MATLAB® Production Server™ 实例的 MWSSLServerAuthorizer 实现。

您将 MWSSLDefaultConfig 类扩展为:

  • 指定客户端可以使用的安全协议

  • 自定义客户端如何验证主机名

  • 指定额外的服务器身份验证逻辑

MWSSLDefaultConfig 类有三种方法:

  • getSSLContext() - 返回 SSLContext 对象

  • getHostnameVerifier() - 如果 HTTPS 主机名验证失败,则返回要使用的 HostnameVerifier 对象

  • getServerAuthorizer() - 返回一个 MWSSLServerAuthorizer 对象,根据服务器证书执行服务器授权

指定启用的加密协议

MATLAB Production Server 支持以下加密协议:

  • TLSv1.0

  • TLSv1.1

  • TLSv1.2

默认情况下,所有协议都已启用。如果您想控制启用哪些协议,您可以重写 getSSLContext() 方法以返回带有启用协议列表的 MWCustomSSLContext 实例。未在列表中的协议不会被启用。例如,为了通过禁用 SSL 协议来避免 POODLE 漏洞,您可以启用 TLS 协议。

import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import com.mathworks.mps.client.*;

public class MySSLConfig extends MWSSLDefaultConfig 
{
  public SSLContext getSSLContext()
  {
    try 
    {
      final SSLContext context = MWCustomSSLContext.getInstance("TLSv1", "TLSv1.1", "TLSv1.2");
      context.init(null,null,null);
      return context;
    }
    catch (NoSuchAlgorithmException e)
    {
      return null;
    } 
    catch (KeyManagementException e) 
    {
      return null;
    }
  }
}

覆盖默认主机名验证

作为 SSL 握手的一部分,HTTPS 层尝试将提供的 URL 中的主机名与服务器证书中提供的主机名进行匹配。如果两个主机名不匹配,HTTPS 层将调用 HostnameVerifier.verify() 方法进行额外检查。HostnameVerifier.verify() 方法的返回值决定主机名是否已经验证。

HostnameVerifier.verify() 对象提供的 MWSSLDefaultConfig 方法的实现总是返回 false。结果是,如果 URL 中的主机名和服务器证书中的主机名不匹配,则 HTTPS 握手失败。

为了获得更强大的主机名验证方案,扩展 MWSSLDefaultConfig 类以返回使用自定义逻辑的 HostnameVerifier.verify() 的实现。例如,如果您只想为运行 MATLAB Production Server 实例的所有服务器生成一个证书,则可以指定 MPS 作为证书的主机名。然后,如果证书中存储的主机名是 HostnameVerifier.verify(),则 MPS 的实现将返回 true。

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import com.mathworks.mps.client.*;

public class MySSLConfig extends MWSSLDefaultConfig
{
  public HostnameVerifier getHostnameVerifier() 
  {
    return new HostNameVerifier() 
    {
      public boolean verify(String s, SSLSession sslSession) 
      {
        if (sslSession.getPeerHost().equals("MPS"))
          return true;
        else
          return false;
      }
    }
  }
}

有关 HostnameVerify 的更多信息,请参阅 Oracle 的 Java 文档

有关禁用主机名验证的信息,请参阅 禁用主机名验证

使用附加服务器身份验证

HTTPS 层建立安全连接后,客户端可以在向服务器发送请求之前执行额外的身份验证步骤。MWSSLServerAuthorizer 接口的实现执行此附加身份验证。MWSSLSServerAuthorizer 实现执行两项检查来授权服务器:

  • isCertificateRequired() 确定服务器是否必须出示证书才能获得授权。如果返回 true 并且服务器未提供证书,则客户端不会授权该服务器。

  • authorize(Certificate serverCert) 使用服务器的证书来确定客户端是否授权服务器处理请求。

MWSSLSServerAuthorizer 对象返回的 MWSSLDefaultConfig 实现授权所有服务器而不执行任何检查。

要使用服务器身份验证,请扩展 MWSSLDefaultConfig 类并重写 getServerAuthorizer() 的实现以返回执行授权检查的 MWSSLSServerAuthorizer 实现。

另请参阅

主题