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

本文介绍如何在反向代理与服务之间建立安全连接,从而启用端到端的安全通道。

仅当反向代理配置为侦听 HTTPS 时,才支持连接到安全服务。 本文档的余下部分假设采用这种配置。 请参阅 Azure Service Fabric 中的反向代理,在 Service Fabric 中配置反向代理。

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

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

反向代理使用群集资源类型部分中的 reverseProxyCertificate 属性指定的反向代理证书在服务中验证其身份。 服务可以实现逻辑来验证反向代理提供的证书。 服务可以在配置包中将已接受的客户端证书详细信息指定为配置设置。 此设置可在运行时读取,并用于验证反向代理提供的证书。 请参阅管理应用程序参数来添加配置设置。

反向代理通过服务提供的证书验证服务的身份:

为了对服务提供的证书执行服务器证书验证,反向代理支持以下选项之一:None、ServiceCommonNameAndIssuer 和 ServiceCertificateThumbprints。 若要从这三个选项中选择一个,请在 fabricSettings 下面的 ApplicationGateway/Http 元素的 parameters 节中指定 ApplicationCertificateValidationPolicy

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

有关其中每个选项的其他配置详细信息,请参阅下一部分。

服务证书验证选项

  • None:反向代理跳过代理服务证书的验证,并建立安全连接。 这是默认行为。 在 ApplicationGateway/Http 元素的 parameters 节中指定值为 NoneApplicationCertificateValidationPolicy

  • ServiceCommonNameAndIssuer:反向代理根据证书的公用名和中间颁发者的指纹验证服务提供的证书:在 ApplicationGateway/Http 元素的 parameters 节中指定值为 ServiceCommonNameAndIssuerApplicationCertificateValidationPolicy

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

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

如果反向代理要连接的终结点所提供的证书的公用名和颁发者指纹与此处指定的任何值匹配,则会建立 SSL 通道。 如果无法匹配证书详细信息,则反向代理将无法处理该客户端的请求并返回 502(错误的网关)状态代码。 HTTP 状态行也会包含短语“Invalid SSL Certificate”。

{
"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 元素的 parameters 节中指定值为 ServiceCertificateThumbprintsApplicationCertificateValidationPolicy
{
"fabricSettings": [
          ...
          {
            "name": "ApplicationGateway/Http",
            "parameters": [
              {
                "name": "ApplicationCertificateValidationPolicy",
                "value": "ServiceCertificateThumbprints"
              }
            ]
          }
        ],
        ...
}

此外,请在 ApplicationGateway/Http 元素的 parameters 节下面指定包含 ServiceCertificateThumbprints 条目的指纹。 可在 value 字段中以逗号分隔列表的形式指定多个指纹,如下所示:

{
"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 支持为服务配置多个终结点。 请参阅在服务清单中指定资源

反向代理根据 ListenerName 查询参数选择某个终结点来转发请求。 如果未指定此参数,反向代理将从终结点列表中选择任意终结点。 目前可以选择 HTTP 或 HTTPS 终结点。 可能在某些情况下/出于某种要求,你希望反向代理以“仅限安全模式”运行,例如, 你不希望安全反向代理将请求转发到不安全的终结点。 为此,可以在 ApplicationGateway/Http 元素的 parameters 节中指定值为 trueSecureOnlyMode 配置条目。

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

SecureOnlyMode 运行时,如果客户端指定了对应于 HTTP(不安全)终结点的 ListenerName,则反向代理将无法处理请求并返回 404(未找到)HTTP 状态代码。

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

反向代理会发生 SSL 终止,并且所有客户端证书数据都会丢失。 为使服务执行客户端证书身份验证,请在 ApplicationGateway/Http 元素的 parameters 节中指定 ForwardClientCertificate 设置。

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

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

反向代理只是一个转发器。 它不会对客户端的证书执行任何验证。

后续步骤