1.8. 使用 OpenShift serving 证书


在 OpenShift 中运行应用时,您可以使用 OpenShift 服务证书 自动生成和更新 TLS 证书。Quarkus TLS registry 可以使用这些证书和证书颁发机构(CA)文件来处理 HTTPS 流量并安全地验证证书。

1.8.1. 获取证书

要让 OpenShift 生成服务证书,请注解现有的 Service 对象。生成的证书将存储在 secret 中,然后可以挂载到 pod 中。

以下片段使用带有注解示例 Service 对象来生成 TLS 证书。

  1. 查看 Service 对象的配置:

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/name: ...
        app.kubernetes.io/version: ...
        app.kubernetes.io/managed-by: quarkus
      name: hero-service
    spec:
      ports:
        - name: http
          port: 443
          protocol: TCP
          targetPort: 8443
      selector:
        app.kubernetes.io/name: ...
        app.kubernetes.io/version: ...
      type: ClusterIP
    Copy to Clipboard Toggle word wrap
  2. 要生成证书,请在已创建的 OpenShift 服务 中添加其注解:

    oc annotate service hero-service \
         service.beta.openshift.io/serving-cert-secret-name=my-tls-secret
    Copy to Clipboard Toggle word wrap

    注解 service.beta.openshift.io/serving-cert-secret-name 指示 OpenShift 生成证书并将其存储在名为 my-tls-secret 的 secret 中。

  3. 通过更新部署配置,将 secret 挂载为 pod 中的卷

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/name: ...
        app.kubernetes.io/version: ...
      name: my-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: ...
          app.kubernetes.io/version: ...
      template:
        metadata:
          labels:
            app.kubernetes.io/name: ...
            app.kubernetes.io/version: ...
        spec:
          volumes:
            - name: my-tls-secret  
    1
    
              secret:
                secretName: my-tls-secret
          containers:
            - env:
                - name: KUBERNETES_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: QUARKUS_TLS_KEY_STORE_PEM_ACME_CERT 
    2
    
                  value: /etc/tls/tls.crt
                - name: QUARKUS_TLS_KEY_STORE_PEM_ACME_KEY
                  value: /etc/tls/tls.key
              image: ...
              imagePullPolicy: Always
              name: my-service
              volumeMounts:  
    3
    
                - name: my-tls-secret
                  mountPath: /etc/tls
                  readOnly: true
              ports:
                - containerPort: 8443  
    4
    
                  name: https
                  protocol: TCP
    Copy to Clipboard Toggle word wrap
    1
    定义要挂载 secret 的卷。使用与上面声明的 secret 的名称相同。
    2
    使用到证书和私钥的路径设置密钥存储。这可以通过使用环境变量或配置文件来配置。本例使用环境变量。OpenShift serving 证书总是创建 tls.crttls.key 文件。
    3
    将机密挂载到容器中。确保路径与配置中使用的路径匹配(这里的 /etc/tls)。
    4
    配置端口以提供 HTTPS。
  4. 部署应用以使用 OpenShift 生成的证书。这将通过 HTTPS 提供该服务。
注意

通过设置 quarkus.tls.key-store.pem.acme.certquarkus.tls.key-store.pem.acme.key 变量或其环境变量变体,TLS registry 将使用 secret 中的证书和私钥。

这会配置 Quarkus HTTP 服务器的默认密钥存储,它允许服务器使用该证书。有关在命名配置中使用此证书的详情,请参考 TLS 配置

1.8.2. 信任证书颁发机构(CA)

先决条件

现在,您的服务使用 OpenShift 发布的证书,请将您的客户端应用程序配置为信任此证书。为此,请创建一个包含 CA 证书的 ConfigMap,然后将 pod 配置为挂载它。以下步骤使用 Quarkus REST 客户端作为示例,但相同的方法适用于任何客户端。

  1. 首先定义一个 ConfigMap,它将填充 CA 证书:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: client-tls-config
      annotations:
        service.beta.openshift.io/inject-cabundle: "true"
    Copy to Clipboard Toggle word wrap

    service.beta.openshift.io/inject-cabundle 注解用于将 CA 证书注入 ConfigMap。请注意,ConfigMap 最初没有数据 - 它为空。在处理过程中,OpenShift 会将 CA 证书注入 service-ca.crt 文件中的 ConfigMap 中。

  2. 通过添加卷并在部署配置中挂载 ConfigMap 来挂载 ConfigMap

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-service-client
      labels:
        app.kubernetes.io/name: ...
        app.kubernetes.io/version: ...
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: ...
          app.kubernetes.io/version: ...
      template:
        metadata:
          labels:
            app.kubernetes.io/name: ...
            app.kubernetes.io/version: ...
        spec:
          containers:
            - name: my-service-client
              image: ...
              ports:
                - name: http
                  containerPort: 8080
                  protocol: TCP
              volumeMounts: 
    1
    
                - name: my-client-volume
                  mountPath: /deployments/tls
          volumes: 
    2
    
            - name: my-client-volume
              configMap:
                name: client-tls-config
    Copy to Clipboard Toggle word wrap
    1
    在容器中挂载 ConfigMap。确保路径与配置中使用的路径匹配(在本例中为 /deployments/tls)。
    2
    定义卷挂载 ConfigMap 并引用接收 CA 证书的 ConfigMap。
  3. 配置 REST 客户端以使用此 CA 证书。

    考虑以下 REST 客户端接口:

    package org.acme;
    
    import jakarta.ws.rs.GET;
    import jakarta.ws.rs.Path;
    import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
    
    @RegisterRestClient(baseUri = "https://hero-service.cescoffi-dev.svc", configKey = "hero") 
    1
    
    public interface HeroClient {
    
        record Hero (Long id, String name, String otherName, int level, String picture, String powers) {
        }
    
        @GET
        @Path("/api/heroes/random")
        Hero getRandomHero();
    
    }
    Copy to Clipboard Toggle word wrap
    1
    配置基础 URI 和配置密钥。名称的格式必须是 < service-name>.<namespace>.svc。否则,证书将不被信任。确保也配置了 configKey
  4. 将 REST 客户端配置为信任 OpenShift 生成的 CA 证书:

    quarkus.rest-client.hero.tls-configuration-name=my-service-tls 
    1
    
    quarkus.tls.my-service-tls.trust-store.pem.certs=/deployments/tls/service-ca.crt 
    2
    Copy to Clipboard Toggle word wrap
    1
    使用名为 my-service-tls 的 TLS 配置配置 hero REST 客户端。
    2
    设置 my-service-tls TLS 配置,特别是使用 CA 证书的信任存储。确保路径与 Kubernetes Deployment 配置中使用的路径匹配。该文件始终命名为 service-ca.crt

1.8.3. 证书续订

OpenShift 自动续订它生成的服务证书。当证书被续订时,会使用新证书和私钥来更新 secret。

要确保应用程序使用新证书,您可以使用 Quarkus TLS registry 的定期重新载入功能。

通过设置 reload-period 属性,TLS registry 会定期检查密钥存储和信任存储的更改,并在需要时重新载入它们:

quarkus.tls.reload-period=24h
Copy to Clipboard Toggle word wrap
  1. (可选)实施自定义机制,以在更新 secret 时重新加载证书。如需更多信息,请参阅 重新加载证书
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部