Octavia 证书配置指南

本文档适用于设置双向 TLS 身份验证中使用的证书颁发机构的 Octavia 管理员,用于 Octavia 对 Amphora 的命令和控制。

本指南不适用于负载均衡器上 TERMINATED_TLS 监听器的配置。请参阅 负载均衡 Cookbook,了解创建 TERMINATED_TLS 监听器的说明。

Octavia 中的双向 TLS 身份验证

Octavia 控制器进程通过 TLS 连接与 Amphora 通信,就像与网站的 HTTPS 连接一样。但是,Octavia 通过执行双向 TLS 身份验证来验证双方是否受信任。

注意

这是完整的 TLS 握手过程的简化。有关完整的握手,请参阅 TLS 1.3 RFC 8446

第一阶段

当控制器进程(例如 Octavia worker 进程)连接到 Amphora 时,Amphora 将其 server 证书呈现给控制器。然后,控制器将根据存储在控制器上的 server 证书颁发机构 (CA) 证书对其进行验证。如果呈现的证书通过 server CA 证书验证,则连接进入双向 TLS 身份验证的第二阶段。

第二阶段

完成第一阶段后,控制器将向 Amphora 呈现其 client 证书。然后,Amphora 将根据存储在 Amphora 内部的 client CA 证书验证该证书。如果此证书成功验证,则其余 TLS 握手将继续建立控制器和 Amphora 之间的安全通信通道。

证书生命周期

控制器为每个 amphora 唯一生成 server 证书,使用 server 证书颁发机构证书和密钥。当这些 server 证书接近到期时,它们将由 Octavia housekeeping 控制器进程自动轮换。

client 证书用于 Octavia 控制器进程。这些由操作员管理,并且由于它们在云的控制平面中使用,因此通常具有较长的生命周期。

有关证书生命周期的更多信息,请参阅 操作员维护指南

创建证书颁发机构

如上所述,此配置使用两个证书颁发机构;一个用于 server 证书,一个用于 client 证书。

注意

从技术上讲,Octavia 可以使用一个证书颁发机构运行,方法是使用它来为两种角色颁发证书。但是,如果 Amphora 的 server 证书可用于冒充控制器,这将降低安全性。我们建议您在测试之外的所有部署中使用两个证书颁发机构。

对于本文档,我们将设置基于 OpenSSL 的简单的证书颁发机构。但是,任何符合标准的证书颁发机构软件都可以用来创建所需的证书。

  1. 为证书颁发机构创建一个工作目录。确保为此目录设置适当的权限,以便其他人无法访问此处生成的文件私钥、随机位等。

    $ mkdir certs
    $ chmod 700 certs
    $ cd certs
    
  2. 创建 OpenSSL 配置文件。这可以在两个证书颁发机构之间共享。

    $ vi openssl.cnf
    
    # OpenSSL root CA configuration file.
    
    [ ca ]
    # `man ca`
    default_ca = CA_default
    
    [ CA_default ]
    # Directory and file locations.
    dir               = ./
    certs             = $dir/certs
    crl_dir           = $dir/crl
    new_certs_dir     = $dir/newcerts
    database          = $dir/index.txt
    serial            = $dir/serial
    RANDFILE          = $dir/private/.rand
    
    # The root key and root certificate.
    private_key       = $dir/private/ca.key.pem
    certificate       = $dir/certs/ca.cert.pem
    
    # For certificate revocation lists.
    crlnumber         = $dir/crlnumber
    crl               = $dir/crl/ca.crl.pem
    crl_extensions    = crl_ext
    default_crl_days  = 30
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md        = sha256
    
    name_opt          = ca_default
    cert_opt          = ca_default
    default_days      = 3650
    preserve          = no
    policy            = policy_strict
    
    [ policy_strict ]
    # The root CA should only sign intermediate certificates that match.
    # See the POLICY FORMAT section of `man ca`.
    countryName             = match
    stateOrProvinceName     = match
    organizationName        = match
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ req ]
    # Options for the `req` tool (`man req`).
    default_bits        = 2048
    distinguished_name  = req_distinguished_name
    string_mask         = utf8only
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md          = sha256
    
    # Extension to add when the -x509 option is used.
    x509_extensions     = v3_ca
    
    [ req_distinguished_name ]
    # See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
    countryName                     = Country Name (2 letter code)
    stateOrProvinceName             = State or Province Name
    localityName                    = Locality Name
    0.organizationName              = Organization Name
    organizationalUnitName          = Organizational Unit Name
    commonName                      = Common Name
    emailAddress                    = Email Address
    
    # Optionally, specify some defaults.
    countryName_default             = US
    stateOrProvinceName_default     = Oregon
    localityName_default            =
    0.organizationName_default      = OpenStack
    organizationalUnitName_default  = Octavia
    emailAddress_default            =
    commonName_default              = example.org
    
    [ v3_ca ]
    # Extensions for a typical CA (`man x509v3_config`).
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ usr_cert ]
    # Extensions for client certificates (`man x509v3_config`).
    basicConstraints = CA:FALSE
    nsCertType = client, email
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth, emailProtection
    
    [ server_cert ]
    # Extensions for server certificates (`man x509v3_config`).
    basicConstraints = CA:FALSE
    nsCertType = server
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    
    [ crl_ext ]
    # Extension for CRLs (`man x509v3_config`).
    authorityKeyIdentifier=keyid:always
    
  3. 对 openssl.cnf 进行任何本地所需的配置更改。需要考虑的一些设置是

    • 默认证书生命周期为 10 年。

    • 默认位长度为 2048。

  4. 为两个证书颁发机构创建目录。

    $ mkdir client_ca
    $ mkdir server_ca
    
  5. server 证书颁发机构开始,准备 CA。

    $ cd server_ca
    $ mkdir certs crl newcerts private
    $ chmod 700 private
    $ touch index.txt
    $ echo 1000 > serial
    
  6. 创建 server CA 密钥。

    • 您需要指定一个密码短语来保护密钥文件。

    $ openssl genpkey -algorithm RSA -out private/ca.key.pem -aes-128-cbc -pkeyopt rsa_keygen_bits:4096
    $ chmod 400 private/ca.key.pem
    
  7. 创建 server CA 证书。

    • 您需要指定步骤 6 中使用的密码短语。

    • 您还需要提供证书的详细信息。这些由您决定,应适合您的组织。

    • 您可能需要在 common name 字段中提及这是 server CA。

    • 由于这是 CA 证书,您可能希望为其赋予非常长的生命周期,例如此示例命令中显示的二十年。

    $ openssl req -config ../openssl.cnf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem
    
  8. 转到 client 证书颁发机构,准备 CA。

    $ cd ../client_ca
    $ mkdir certs crl csr newcerts private
    $ chmod 700 private
    $ touch index.txt
    $ echo 1000 > serial
    
  9. 创建 client CA 密钥。

    • 您需要指定一个密码短语来保护密钥文件。

    $ openssl genpkey -algorithm RSA -out private/ca.key.pem -aes-128-cbc -pkeyopt rsa_keygen_bits:4096
    $ chmod 400 private/ca.key.pem
    
  10. 创建 client CA 证书。

    • 您需要指定步骤 9 中使用的密码短语。

    • 您还需要提供证书的详细信息。这些由您决定,应适合您的组织。

    • 您可能需要在 common name 字段中提及这是 client CA。

    • 由于这是 CA 证书,您可能希望为其赋予非常长的生命周期,例如此示例命令中显示的二十年。

    $ openssl req -config ../openssl.cnf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem
    
  11. 为要使用的 client 证书创建一个密钥。

    • 您可以创建一个证书和密钥,供所有控制器使用,也可以为每个控制器创建一个唯一的证书和密钥。

    • 您需要指定一个密码短语来保护密钥文件。

    $ openssl genpkey -algorithm RSA -out private/client.key.pem -aes-128-cbc -pkeyopt rsa_keygen_bits:2048
    
  12. 创建用于控制器上的 client 证书的证书请求。

    • 您需要指定步骤 11 中使用的密码短语。

    • 您还需要提供证书的详细信息。这些由您决定,应适合您的组织。

    • 您必须填写 common name 字段。

    • 您可能需要在 common name 字段中提及这是 client 证书,或单个控制器信息。

    $ openssl req -config ../openssl.cnf -new -sha256 -key private/client.key.pem -out csr/client.csr.pem
    
  13. 签署 client 证书请求。

    • 您需要指定步骤 9 中使用的 CA 密码短语。

    • 由于此证书用于控制平面,您可能希望为其赋予非常长的生命周期,例如此示例命令中显示的二十年。

    $ openssl ca -config ../openssl.cnf -extensions usr_cert -days 7300 -notext -md sha256 -in csr/client.csr.pem -out certs/client.cert.pem
    
  14. 创建一个连接的 client 证书和密钥文件。

    • 您需要指定步骤 11 中使用的 CA 密码短语。

    $ openssl rsa -in private/client.key.pem -out private/client.cert-and-key.pem
    $ cat certs/client.cert.pem >> private/client.cert-and-key.pem
    

配置 Octavia

在本节中,我们将配置 Octavia 以使用在 创建证书颁发机构 部分创建的证书和密钥。

  1. 将所需的文件复制到您的 Octavia 控制器。

    • 只有 Octavia worker、health manager 和 housekeeping 进程才需要访问这些文件。

    • 第一个命令应将您返回到 创建证书颁发机构 部分步骤 1 中创建的“certs”目录。

    • 这些命令假定您正在以“octavia”用户身份运行 octavia 进程。

    • 请注意,其中一些步骤应使用“sudo”运行,并由“#”前缀指示。

    $ cd ..
    # mkdir /etc/octavia/certs
    # chmod 700 /etc/octavia/certs
    # cp server_ca/private/ca.key.pem /etc/octavia/certs/server_ca.key.pem
    # chmod 700 /etc/octavia/certs/server_ca.key.pem
    # cp server_ca/certs/ca.cert.pem /etc/octavia/certs/server_ca.cert.pem
    # cp client_ca/certs/ca.cert.pem /etc/octavia/certs/client_ca.cert.pem
    # cp client_ca/private/client.cert-and-key.pem /etc/octavia/certs/client.cert-and-key.pem
    # chmod 700 /etc/octavia/certs/client.cert-and-key.pem
    # chown -R octavia.octavia /etc/octavia/certs
    
  2. 配置 octavia.conf 文件的 [certificates] 部分。

    • 只有 Octavia worker、health manager 和 housekeeping 进程才需要这些设置。

    • “<server CA passphrase>”应替换为在 创建证书颁发机构 部分步骤 6 中使用的密码短语。

    [certificates]
    cert_generator = local_cert_generator
    ca_certificate = /etc/octavia/certs/server_ca.cert.pem
    ca_private_key = /etc/octavia/certs/server_ca.key.pem
    ca_private_key_passphrase = <server CA key passphrase>
    
  3. 配置 octavia.conf 文件的 [controller_worker] 部分。

    • 只有 Octavia worker、health manager 和 housekeeping 进程才需要这些设置。

    [controller_worker]
    client_ca = /etc/octavia/certs/client_ca.cert.pem
    
  4. 配置 octavia.conf 文件的 [haproxy_amphora] 部分。

    • 只有 Octavia worker、health manager 和 housekeeping 进程才需要这些设置。

    [haproxy_amphora]
    client_cert = /etc/octavia/certs/client.cert-and-key.pem
    server_ca = /etc/octavia/certs/server_ca.cert.pem
    
  5. 启动控制器进程。

    # systemctl start octavia-worker
    # systemctl start octavia-healthmanager
    # systemctl start octavia-housekeeping