升级到 OpenSSL 3

从 17.7 开始,极狐GitLab 将开始使用 OpenSSL 3。这是 OpenSSL 的一个重要发版,包含了显著的废弃和对 OpenSSL 默认行为的更改(更多详情可以查看 OpenSSL 3 官方迁移指南)。

有些针对外部集成的老旧版本的 TLS 和密码套件可能会和这些变更不太兼容。因此,在升级到使用 OpenSSL 3 的极狐GitLab 前,评估您外部集成的兼容性是至关重要的。

随着升级到 OpenSSL 3:

  • 对于所有进入或者出去的 TLS 链接都需要 TLS 1.2 或者更高版本。
  • TLS 证书必须最少要有 112 位的安全码。短于 2048 位的 RSA、DSA 和 DH key 以及短于 224 位的 ECC key 都将被禁止。

识别外部集成

外部集成可能是通过 gitlab.rb 文件或者在极狐GitLab 的项目、群组或者管理设置界面上配置的。

下面是一个您可以使用的集成的初步列表:

所有包含在 Linux 软件包中的组件和 OpenSSL 3 都是兼容的。因此,您仅需要验证那些没有包含在 Linux 软件包中的“外部”服务的兼容性即可。

评估与 OpenSSL 3 的兼容性

您可以使用不同的工具来验证外部集成端点的兼容性。不管您使用哪种工具,您都需要检查支持的 TLS 版本和密码套件信息。

openssl 命令行工具

您可以使用 openssl s_client 命令行工具链接到开启了 TLS 的服务器。它有一系列广泛的选项,您可以使用这些选项来强制执行特定的 TLS 版本或密码套件:

  1. 通过检查版本来确认您在使用 OpenSSL 3 命令行工具:

    openssl version
    
  2. 使用下面的脚本来检查服务器是否支持密码套件和 TLS 版本:

    # Host and port of the server
    SERVER='HOST:PORT'
    
    # Check supported ciphers for TLS1.2 and TLS1.3
    # See `openssl s_client` manual for other available options.
    for tls_version in tls1_2 tls1_3; do
      echo "Supported ciphers for ${tls_version}:"
      for cipher in $(openssl ciphers -${tls_version} | sed -e 's/:/ /g'); do
        # NOTE: The cipher will be combined with any TLSv1.3 cipher suites that
        # have been configured.
        if openssl s_client -${tls_version} -cipher "${cipher}" -connect ${SERVER} </dev/null >/dev/null 2>&1; then
          echo "\t${cipher}"
        fi
      done
    done
    

Nmap ssl-enum-ciphers 脚本

Nmap 的 ssl-enum-ciphers 脚本能够识别所支持的 TLS 版本和密码套件且能够提供详细的输出信息。

  1. 安装 namp
  2. 确保您使用的版本是和 OpenSSL 3 兼容的:

    nmap --version
    

    输出信息会包含详细的版本信息,包括 Namp 和 OpenSSL 3 的兼容信息。

  3. 在您的站点上执行 namp 命令:

    nmap -sV --script ssl-enum-ciphers -p PORT HOST
    

    您可能会看到如下信息:

    PORT    STATE SERVICE  VERSION
    443/tcp open  ssl/http Cloudflare http proxy
    | ssl-enum-ciphers:
    |   TLSv1.2:
    |     ciphers:
    |       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
    |       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
    |       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256-draft (ecdh_x25519) - A
    |       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
    |       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
    |       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
    |       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
    |       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
    |       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
    |       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
    |       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (ecdh_x25519) - A
    |       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
    |       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (ecdh_x25519) - A
    |       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
    |     compressors:
    |       NULL
    |     cipher preference: server
    |   TLSv1.3:
    |     ciphers:
    |       TLS_AKE_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
    |       TLS_AKE_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
    |       TLS_AKE_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
    |     cipher preference: client
    |_  least strength: A
    |_http-server-header: cloudflare