TLS 证书
为 IBM Bob 本地版配置外部 TLS 证书,以便 bob-ide 和 bob-shell 客户端可以安全连接。
Bob 通过 HTTPS 公开其 API。在用户使用 bob-ide 或 bob-shell 连接之前,端点证书必须被客户端工作站信任。
尽可能使用由企业或公开受信任的证书颁发机构颁发的证书。这消除了向开发者工作站分发 Bob 专用 CA 证书的需要。
要随时还原为默认的自签名证书,请运行 bobctl reset-route。这会从 Bob 证书仓库中移除 spec.externalCertificate,Operator 会将外部端点返回给 cert-manager。
当证书可从企业 PKI 或公开受信任的证书颁发机构获取时使用此方法。
在请求或生成证书之前,确认 Bob 公开的每个主机名。所有主机名必须作为主题备用名称(SAN)包含在证书中。
获取入口主机名
运行以下命令列出所有 Bob 入口主机名:
oc get ingress -n <instance-namespace> \
-o jsonpath='{range .items[*]}{range .spec.rules[*]}{.host}{"\n"}{end}{end}'记录返回的主机名——在订购或生成证书时需要用到它们。
创建证书 Secret
创建包含证书和私钥的 Kubernetes Secret:
oc create secret generic my-tls-secret \
--from-file=tls.crt=tls.crt \
--from-file=tls.key=tls.key \
--from-file=ca.crt=ca.crt \
-n <instance-namespace>更新现有 Secret:
oc create secret generic my-tls-secret \
--from-file=tls.crt=tls.crt \
--from-file=tls.key=tls.key \
--from-file=ca.crt=ca.crt \
-n <instance-namespace> \
--dry-run=client -o yaml | oc apply -f -应用证书
配置 Bob 使用该证书:
./bobctl setup-route --tls-secret my-tls-secret| 参数 | 描述 |
|---|---|
--tls-secret | 指定包含证书和私钥的 Secret。 |
--no-wait | 立即返回而不等待协调完成。 |
--dry-run | 在不应用更改的情况下验证配置。 |
验证证书
验证预期的证书正在被提供:
echo | openssl s_client \
-connect <hostname>:443 \
-servername <hostname> 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates验证:
- 颁发者正确。
- 主机名存在于 SAN 列表中。
- 证书有效期日期正确。
使用此过程生成由私有或内部证书颁发机构签名的证书,并配置 Bob 将其用于外部 HTTPS 流量。
生成 CA 证书
为证书颁发机构生成私钥和自签名证书:
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes \
-key ca.key \
-sha256 \
-days 365 \
-out ca.crt \
-subj "/CN=<BOB_HOSTNAME> CA"这会创建 ca.key 和 ca.crt。
当 CA 证书包含在 Kubernetes Secret 中时,Bob 期望其命名为 ca.crt。如果你使用现有的 CA 证书,请在创建 Secret 之前将其重命名为 ca.crt。
生成服务器私钥
为 Bob 端点证书生成未加密的私钥:
openssl genrsa -out tls.key 4096如果私钥使用密码短语加密,请在继续之前移除密码短语:
openssl rsa -in encrypted.key -out tls.key创建 SAN 配置文件
创建名为 san.cnf 的文件,并将占位符主机名替换为之前获取的入口主机名:
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = <BOB_HOSTNAME_1>
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = <BOB_HOSTNAME_1>
DNS.2 = <BOB_HOSTNAME_2>
DNS.3 = <BOB_HOSTNAME_3>根据需要添加或删除 DNS.* 条目,确保包含所有 Bob 入口主机名。
生成证书签名请求
openssl req \
-new \
-key tls.key \
-out tls.csr \
-config san.cnf签署证书
openssl x509 \
-req \
-in tls.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out tls.crt \
-days 365 \
-extensions v3_req \
-extfile san.cnf创建 TLS Secret
对于由私有或企业证书颁发机构颁发的证书:
oc create secret generic my-tls-secret \
--from-file=tls.crt=/path/to/tls.crt \
--from-file=tls.key=/path/to/tls.key \
--from-file=ca.crt=/path/to/ca.crt \
-n <instance-namespace>对于公开受信任的证书:
oc create secret tls my-tls-secret \
--cert=/path/to/tls.crt \
--key=/path/to/tls.key \
-n <instance-namespace>应用证书
配置 Bob 使用 TLS Secret:
./bobctl setup-route --tls-secret my-tls-secretbobctl 验证 Secret,更新 Bob 配置,并等待协调完成。
| 参数 | 描述 |
|---|---|
--tls-secret <secret> | 指定包含 TLS 证书和私钥的 Secret。 |
--no-wait | 立即返回而不等待协调完成。 |
--dry-run | 在不应用更改的情况下验证配置。 |
如果 Secret 中不包含 ca.crt,bobctl 会显示警告。当证书由客户端工作站已信任的证书颁发机构颁发时,这是预期的行为。
验证证书
验证 Bob 正在提供预期的证书:
echo | openssl s_client \
-connect <BOB_HOSTNAME_1>:443 \
-servername <BOB_HOSTNAME_1> 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates验证:
- 颁发者与预期的证书颁发机构匹配。
- 证书包含预期的主机名条目。
- 证书有效期日期正确。
如果颁发证书的颁发机构不受开发者工作站信任,请在用户使用 bob-ide 或 bob-shell 连接到 Bob 之前向其分发 CA 证书。
如果未配置外部证书,Bob 使用由 cert-manager 管理的自签名证书。在此配置中,用户必须在连接之前信任 Bob CA 证书。
确定证书配置
检查 Bob 外部端点是否使用自签名证书:
oc get secret bob-external-tls -n <instance-namespace> \
-o jsonpath='{.data.tls\.crt}' \
| base64 -d \
| openssl x509 -noout -issuer- 如果颁发者为
CN=Bob Internal CA,则集群正在使用默认的自签名证书。继续执行下一步。 - 如果颁发者是企业或公开受信任的证书颁发机构,则不需要客户端证书配置。请参阅用户管理。
导出 CA 证书
./bobctl get-ca-cert --output bob-ca.crt分发 CA 证书
将导出的 bob-ca.crt 提供给用户,并指导他们将其添加到操作系统的信任库。用户导入 Bob CA 证书后即可建立受信任的 HTTPS 连接。