Octavia 证书配置指南
本文档适用于设置双向 TLS 身份验证中使用的证书颁发机构的 Octavia 管理员,用于 Octavia 对 Amphora 的命令和控制。
本指南不适用于负载均衡器上 TERMINATED_TLS 监听器的配置。请参阅 负载均衡 Cookbook,了解创建 TERMINATED_TLS 监听器的说明。
Octavia 中的双向 TLS 身份验证
Octavia 控制器进程通过 TLS 连接与 Amphora 通信,就像与网站的 HTTPS 连接一样。但是,Octavia 通过执行双向 TLS 身份验证来验证双方是否受信任。
第一阶段
当控制器进程(例如 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 的简单的证书颁发机构。但是,任何符合标准的证书颁发机构软件都可以用来创建所需的证书。
为证书颁发机构创建一个工作目录。确保为此目录设置适当的权限,以便其他人无法访问此处生成的文件私钥、随机位等。
$ mkdir certs
$ chmod 700 certs
$ cd certs
创建 OpenSSL 配置文件。这可以在两个证书颁发机构之间共享。
# 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
对 openssl.cnf 进行任何本地所需的配置更改。需要考虑的一些设置是
默认证书生命周期为 10 年。
默认位长度为 2048。
为两个证书颁发机构创建目录。
$ mkdir client_ca
$ mkdir server_ca
从 server 证书颁发机构开始,准备 CA。
$ cd server_ca
$ mkdir certs crl newcerts private
$ chmod 700 private
$ touch index.txt
$ echo 1000 > serial
创建 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
创建 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
转到 client 证书颁发机构,准备 CA。
$ cd ../client_ca
$ mkdir certs crl csr newcerts private
$ chmod 700 private
$ touch index.txt
$ echo 1000 > serial
创建 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
创建 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
为要使用的 client 证书创建一个密钥。
$ openssl genpkey -algorithm RSA -out private/client.key.pem -aes-128-cbc -pkeyopt rsa_keygen_bits:2048
创建用于控制器上的 client 证书的证书请求。
$ openssl req -config ../openssl.cnf -new -sha256 -key private/client.key.pem -out csr/client.csr.pem
签署 client 证书请求。
$ openssl ca -config ../openssl.cnf -extensions usr_cert -days 7300 -notext -md sha256 -in csr/client.csr.pem -out certs/client.cert.pem
创建一个连接的 client 证书和密钥文件。
$ 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 以使用在 创建证书颁发机构 部分创建的证书和密钥。
将所需的文件复制到您的 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
配置 octavia.conf 文件的 [certificates] 部分。
[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>
配置 octavia.conf 文件的 [controller_worker] 部分。
[controller_worker]
client_ca = /etc/octavia/certs/client_ca.cert.pem
配置 octavia.conf 文件的 [haproxy_amphora] 部分。
[haproxy_amphora]
client_cert = /etc/octavia/certs/client.cert-and-key.pem
server_ca = /etc/octavia/certs/server_ca.cert.pem
启动控制器进程。
# systemctl start octavia-worker
# systemctl start octavia-healthmanager
# systemctl start octavia-housekeeping