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 連線。

這個主題如何?