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}'

记录返回的主机名——在订购或生成证书时需要用到它们。

验证证书要求

在将证书应用到 Bob 之前,确保证书满足以下要求:

  • 私钥未加密。
  • 证书包含完整的证书链。
  • 所有 Bob 入口主机名都包含在 SAN 条目中。
  • 证书和密钥以 PEM 格式提供。

创建证书 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-secret

bobctl 验证 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 连接。

这个主题怎么样?