Certificados TLS

Configure certificados TLS externos para o IBM Bob on-premises para que os clientes bob-ide e bob-shell possam se conectar com segurança.

O Bob expõe suas APIs via HTTPS. Antes que os usuários possam se conectar usando bob-ide ou bob-shell, o certificado do endpoint deve ser confiável pelas estações de trabalho dos clientes.

Dica:

Use um certificado emitido por uma autoridade de certificação empresarial ou publicamente confiável sempre que possível. Isso elimina a necessidade de distribuir certificados CA específicos do Bob para as estações de trabalho dos desenvolvedores.

Para reverter ao certificado autoassinado padrão a qualquer momento, execute bobctl reset-route. Isso remove spec.externalCertificate do repositório de certificados Bob e o operador retorna o endpoint externo ao cert-manager.

Use essa abordagem quando um certificado estiver disponível de uma PKI corporativa ou de uma autoridade de certificação publicamente confiável.

Antes de solicitar ou gerar um certificado, identifique cada nome de host exposto pelo Bob. Todos os nomes de host devem ser incluídos como Subject Alternative Names (SANs) no certificado.

Recuperar nomes de host de ingress

Execute o seguinte comando para listar todos os nomes de host de ingress do Bob:

oc get ingress -n <instance-namespace> \
  -o jsonpath='{range .items[*]}{range .spec.rules[*]}{.host}{"\n"}{end}{end}'

Registre os nomes de host retornados — eles são necessários ao solicitar ou gerar certificados.

Verificar os requisitos do certificado

Certifique-se de que o certificado atende aos seguintes requisitos antes de aplicá-lo ao Bob:

  • A chave privada não está criptografada.
  • O certificado contém a cadeia de certificados completa.
  • Todos os nomes de host de ingress do Bob estão incluídos como entradas SAN.
  • O certificado e a chave são fornecidos no formato PEM.

Criar o segredo do certificado

Crie um segredo Kubernetes contendo o certificado e a chave privada:

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>

Para atualizar um segredo existente:

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 -

Aplicar o certificado

Configure o Bob para usar o certificado:

./bobctl setup-route --tls-secret my-tls-secret
ParâmetroDescrição
--tls-secretEspecifica o segredo que contém o certificado e a chave privada.
--no-waitRetorna imediatamente sem aguardar a reconciliação.
--dry-runValida a configuração sem aplicar as mudanças.

Verificar o certificado

Verifique se o certificado esperado está sendo servido:

echo | openssl s_client \
  -connect <hostname>:443 \
  -servername <hostname> 2>/dev/null \
  | openssl x509 -noout -issuer -subject -dates

Verifique se:

  • O emissor está correto.
  • O nome de host está presente na lista SAN.
  • As datas de validade do certificado estão corretas.

Use este procedimento para gerar um certificado assinado por uma autoridade de certificação privada ou interna e configurar o Bob para usá-lo para tráfego HTTPS externo.

Gerar um certificado CA

Gere uma chave privada e um certificado autoassinado para a autoridade de certificação:

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"

Isso cria ca.key e ca.crt.

Nota:

O Bob espera que o certificado CA seja nomeado ca.crt quando incluído no segredo Kubernetes. Se você estiver usando um certificado CA existente, renomeie-o para ca.crt antes de criar o segredo.

Gerar uma chave privada do servidor

Gere uma chave privada não criptografada para o certificado do endpoint Bob:

openssl genrsa -out tls.key 4096

Se a chave privada estiver criptografada com uma frase secreta, remova a frase secreta antes de continuar:

openssl rsa -in encrypted.key -out tls.key

Criar um arquivo de configuração SAN

Crie um arquivo chamado san.cnf e substitua os nomes de host de espaço reservado pelos nomes de host de ingress recuperados anteriormente:

[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>

Adicione ou remova entradas DNS.* conforme necessário para que todos os nomes de host de ingress do Bob estejam incluídos.

Gerar uma solicitação de assinatura de certificado

openssl req \
  -new \
  -key tls.key \
  -out tls.csr \
  -config san.cnf

Assinar o certificado

openssl x509 \
  -req \
  -in tls.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -out tls.crt \
  -days 365 \
  -extensions v3_req \
  -extfile san.cnf

Criar o segredo TLS

Para certificados emitidos por uma autoridade de certificação privada ou corporativa:

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>

Para certificados publicamente confiáveis:

oc create secret tls my-tls-secret \
  --cert=/path/to/tls.crt \
  --key=/path/to/tls.key \
  -n <instance-namespace>

Aplicar o certificado

Configure o Bob para usar o segredo TLS:

./bobctl setup-route --tls-secret my-tls-secret

O bobctl valida o segredo, atualiza a configuração do Bob e aguarda a conclusão da reconciliação.

ParâmetroDescrição
--tls-secret <secret>Especifica o segredo que contém o certificado TLS e a chave privada.
--no-waitRetorna imediatamente sem aguardar a conclusão da reconciliação.
--dry-runValida a configuração sem aplicar as mudanças.
Nota:

Se ca.crt não estiver incluído no segredo, o bobctl exibe um aviso. Isso é esperado quando o certificado é emitido por uma autoridade de certificação que já é confiável pelas estações de trabalho dos clientes.

Verificar o certificado

Verifique se o Bob está servindo o certificado esperado:

echo | openssl s_client \
  -connect <BOB_HOSTNAME_1>:443 \
  -servername <BOB_HOSTNAME_1> 2>/dev/null \
  | openssl x509 -noout -issuer -subject -dates

Verifique se:

  • O emissor corresponde à autoridade de certificação esperada.
  • O certificado contém as entradas de nome de host esperadas.
  • As datas de validade do certificado estão corretas.

Se a autoridade de certificação emissora não for confiável pelas estações de trabalho dos desenvolvedores, distribua o certificado CA aos usuários antes que eles se conectem ao Bob usando bob-ide ou bob-shell.

Se nenhum certificado externo estiver configurado, o Bob usa um certificado autoassinado gerenciado pelo cert-manager. Nessa configuração, os usuários devem confiar no certificado CA do Bob antes de se conectar.

Determinar a configuração do certificado

Verifique se o endpoint externo do Bob está usando um certificado autoassinado:

oc get secret bob-external-tls -n <instance-namespace> \
  -o jsonpath='{.data.tls\.crt}' \
  | base64 -d \
  | openssl x509 -noout -issuer
  • Se o emissor for CN=Bob Internal CA, o cluster está usando o certificado autoassinado padrão. Continue com o próximo passo.
  • Se o emissor for uma autoridade de certificação empresarial ou publicamente confiável, nenhuma configuração de certificado no lado do cliente é necessária. Consulte Gerenciamento de usuários.

Exportar o certificado CA

./bobctl get-ca-cert --output bob-ca.crt

Distribuir o certificado CA

Forneça o bob-ca.crt exportado aos usuários e instrua-os a adicioná-lo ao trust store do sistema operacional. Os usuários poderão estabelecer conexões HTTPS confiáveis após importar o certificado CA do Bob.

Como está este tópico?