使用 Android Citrix SSO 固定 Citrix Gateway 证书

证书固定有助于防止中间人攻击。Citrix SSO 仅支持 Android Enterprise 模式和旧版设备管理员模式下的托管 VPN 配置的证书固定。最终用户添加的 VPN 配置文件不支持此功能。

使用 Android Citrix SSO 配置 Citrix Gateway 证书固定

有关 Citrix SSO 托管配置(以前称为应用程序限制)中的证书固定的详细信息,请参阅 证书和身份验证

定义了一个新的键值对来承载固定的 Citrix Gateway 证书哈希值,如下所示。

Key: ServerCertificatePins
Value: {
  "hash-alg": "sha256",
  "pinset": [
    "cert1_base64_encoded_SHA-256_hash_of_the_X509_SubjectPublicKeyInfo(SPKI)",
    "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
    ...
  ]
}
<!--NeedCopy-->

在托管配置中指定证书固定详细信息的密钥是 ServerCertificatePins。该值是一个 JSON 有效负载,其中包含固定的 Citrix Gateway 证书的 base64 编码的 SHA-256 哈希值以及使用的哈希算法。固定的证书可以是操作系统验证的信任链中的任何证书。在这种情况下,它是 Android 系统。

只有在操作系统在 TLS 握手期间验证了证书链之后,才会进行证书固定。证书的 PIN 码是通过对证书的主题公钥信息 (SPKI) 进行哈希处理来计算的。必须在 JSON 负载中指定两个字段( hash-alg” 和 “pinset”)。

hash-alg” 指定用于计算 SPKI 哈希的哈希算法。 “针脚集” 指定包含 Citrix Gateway 证书的 SPKI 数据的 base64 编码的 SHA-256 哈希值的 JSON 数组。 必须为证书 PIN 指定至少一个值。可以指定更多的引脚值以允许证书轮换或到期。

您可以使用以下 openssl 命令来计算域(例如 gw.yourdomain.com)的引脚值。

openssl s_client -servername gw.yourdomain.com -connect gw.yourdomain.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
<!--NeedCopy-->

该命令显示网关提供的叶证书的 base64 编码的 SHA-256 哈希值。链中的任何证书都可以用于固定证书。例如,如果企业使用自己的中间 CA 为多个网关生成证书,则可以使用与中间签名证书对应的 PIN。如果所有引脚都不与经过验证的证书链中的证书匹配,则 TLS 握手将中止,并且不会继续连接到网关。

注意:

在设备管理员模式下,仅 Citrix Endpoint Management 和 Microsoft 端点管理解决方案支持证书固定。必须在旧版 VPN 配置文件(非托管配置)中使用的自定义参数中配置证书固定,并使用自定义参数 ServerCertificatEPins 具有相同的 JSON 有效负载进行固定。

使用 Android Citrix SSO 固定 Citrix Gateway 证书