使用反向代理连接到安全服务

本文介绍了如何在反向代理和服务之间建立安全连接,从而启用端到端安全通道。 若要了解有关反向代理的详细信息,请参阅 Azure Service Fabric 中的反向代理

只有将反向代理配置为侦听 HTTPS 时,才支持连接到安全服务。 本文假定现为这种情况。 请参阅在 Azure Service Fabric 中设置反向代理,在 Service Fabric 中配置反向代理。

在反向代理和服务之间建立安全连接

向服务进行反向代理身份验证:

反向代理使用其证书向服务标识自己。 对于 Azure 群集,证书使用资源管理器模板 Microsoft.ServiceFabric/clusters 资源类型部分中的 reverseProxyCertificate 属性指定。 对于独立群集,证书使用 ClusterConfig.json“安全”部分中的 ReverseProxyCertificate 或 ReverseProxyCertificateCommonNames 属性指定。 若要了解详细信息,请参阅在独立群集上启用反向代理

服务可以通过实现逻辑验证反向代理提供的证书。 服务可以将接受的客户端证书详细信息指定为配置包中的配置设置。 此信息可在运行时读取,并可用于验证反向代理提供的证书。 若要添加配置设置,请参阅管理应用程序参数

反向代理通过服务提供的证书验证服务标识:

反向代理支持使用以下策略来对服务提供的证书执行服务器证书验证:None、ServiceCommonNameAndIssuer 和 ServiceCertificateThumbprints。 若要选择反向代理使用的策略,请在 fabricSettings 中的 ApplicationGateway/Http 节下指定 ApplicationCertificateValidationPolicy

下一部分介绍了其中每个选项的配置详细信息。

服务证书验证选项

  • 无:反向代理跳过对代理服务证书的验证,并建立安全连接。 此选项为默认行为。 在 ApplicationGateway/Http 节中,指定值为 NoneApplicationCertificateValidationPolicy

    {
    "fabricSettings": [
             ...
             {
               "name": "ApplicationGateway/Http",
               "parameters": [
                 {
                   "name": "ApplicationCertificateValidationPolicy",
                   "value": "None"
                 }
               ]
             }
           ],
           ...
    }
    
  • ServiceCommonNameAndIssuer:反向代理根据证书公用名称和直接颁发者的指纹,验证服务提供的证书:在 ApplicationGateway/Http 节中指定值为 ServiceCommonNameAndIssuerApplicationCertificateValidationPolicy

    {
    "fabricSettings": [
              ...
              {
                "name": "ApplicationGateway/Http",
                "parameters": [
                  {
                    "name": "ApplicationCertificateValidationPolicy",
                    "value": "ServiceCommonNameAndIssuer"
                  }
                ]
              }
            ],
            ...
    }
    

    若要指定服务公用名称和颁发者指纹,请在 fabricSettings 下添加 ApplicationGateway/Http/ServiceCommonNameAndIssuer 节,如下所示。 可在 parameters 数组中添加多个证书公用名称和颁发者指纹对。

    如果连接终结点反向代理后提供的证书的公用名称和颁发者指纹与此处指定的任何值匹配,则建立 SSL 通道。 如果与证书详细信息不匹配,则反向代理拒绝客户端请求,并显示 502(网关错误)状态代码。 并且 HTTP 状态行还会显示“无效 SSL 证书”短语。

    {
    "fabricSettings": [
              ...
              {
                "name": "ApplicationGateway/Http/ServiceCommonNameAndIssuer",
                "parameters": [
                  {
                    "name": "WinFabric-Test-Certificate-CN1",
                    "value": "b3 44 9b 01 8d 0f 68 39 a2 c5 d6 2b 5b 6c 6a c8 22 b4 22 11"
                  },
                  {
                    "name": "WinFabric-Test-Certificate-CN2",
                    "value": "b3 44 9b 01 8d 0f 68 39 a2 c5 d6 2b 5b 6c 6a c8 22 11 33 44"
                  }
                ]
              }
            ],
            ...
    }
    
  • ServiceCertificateThumbprints:反向代理根据指纹验证代理服务证书。 使用自签名证书配置服务后,可以选择此方法:在 ApplicationGateway/Http 节中,指定值为 ServiceCertificateThumbprintsApplicationCertificateValidationPolicy

    {
    "fabricSettings": [
              ...
              {
                "name": "ApplicationGateway/Http",
                "parameters": [
                  {
                    "name": "ApplicationCertificateValidationPolicy",
                    "value": "ServiceCertificateThumbprints"
                  }
                ]
              }
            ],
            ...
    }
    

    另外,在 ApplicationGateway/Http 节中,指定包含 ServiceCertificateThumbprints 条目的指纹。 可将多个指纹指定为值字段中的逗号分隔列表,如下所示:

    {
    "fabricSettings": [
              ...
              {
                "name": "ApplicationGateway/Http",
                "parameters": [
                    ...
                  {
                    "name": "ServiceCertificateThumbprints",
                    "value": "78 12 20 5a 39 d2 23 76 da a0 37 f0 5a ed e3 60 1a 7e 64 bf,78 12 20 5a 39 d2 23 76 da a0 37 f0 5a ed e3 60 1a 7e 64 b9"
                  }
                ]
              }
            ],
            ...
    }
    

    如果此配置项中列出了服务器证书的指纹,则反向代理的 SSL 连接成功。 否则将终止连接,拒绝客户端请求,并显示 502(网关错误)。 HTTP 状态行也会包含短语“Invalid SSL Certificate”。

服务同时公开安全和不安全终结点时的终结点选择逻辑

Service Fabric 支持为一个服务配置多个终结点。 有关详细信息,请参阅在服务清单中指定资源

反向代理根据服务 URI 中的 ListenerName 查询参数选择某个终结点来转发请求。 如果未指定 ListenerName 参数,则反向代理可以选取终结点列表中的任一终结点。 根据为服务配置的终结点,所选终结点可以是 HTTP 或 HTTPS 终结点。 在某些情况下,或者根据某些要求,你希望反向代理在“仅限安全模式”下运行;也就是说,你不希望安全反向代理将请求转发到不安全的终结点。 若要将反向代理设置为仅限安全模式,请在 ApplicationGateway/Http 节中指定值为 trueSecureOnlyMode 配置条目。

{
"fabricSettings": [
          ...
          {
            "name": "ApplicationGateway/Http",
            "parameters": [
                ...
              {
                "name": "SecureOnlyMode",
                "value": true
              }
            ]
          }
        ],
        ...
}

Note

SecureOnlyMode 下运行时,如果客户端已指定对应于 HTTP(不安全)终结点的 ListenerName,则反向代理拒绝请求,并显示 404 (Not Found) HTTP 状态代码。

通过反向代理设置客户端证书身份验证

反向代理和所有客户端证书数据丢失时,SSL 将终止。 若要让服务执行客户端证书身份验证,请在 ApplicationGateway/Http 节中指定 ForwardClientCertificate 设置。

  1. 如果将 ForwardClientCertificate 设置为 false,在反向代理与客户端执行 SSL 握手期间,反向代理不会请求客户端证书。 此选项为默认行为。

  2. 如果将 ForwardClientCertificate 设置为 true,在反向代理与客户端执行 SSL 握手期间,反向代理会请求客户端的证书。 然后会转发名为 X-Client-Certificate 的自定义 HTTP 标头中的客户端证书数据。 标头值是客户端证书的 base64 编码 PEM 格式字符串。 检查证书数据后,服务可以接受/拒绝请求,并显示相应状态代码。 如果客户端不提供证书,反向代理将转发空标头,并让服务处理该情况。

Note

反向代理只是一个转发程序。 它不会对客户端证书执行验证。

后续步骤