Übersicht
In dieser Anleitung wird die Integration von Keyfactor EJBCA Enterprise (als externe Appliance bereitgestellt) als Drittanbieter-Zertifizierungsstelle (Certificate Authority, CA) für Google Distributed Cloud (GDC) mit Air Gap beschrieben.
Keyfactor EJBCA Enterprise ist eine hoch skalierbare, robuste und FIPS-konforme Zertifizierungsstellenplattform, mit der Unternehmen die Public-Key-Infrastruktur (PKI) in heterogenen Umgebungen verwalten können.
GDC mit Air Gap umfasst einen integrierten Certificate Authority Service für die automatisierte Schlüssel- und Zertifikatsverwaltung innerhalb der gehosteten Cloud-Grenze. Organisationen, die ihre PKI-Infrastruktur für vorhandene Arbeitslasten außerhalb von GDC auf Keyfactor EJBCA standardisiert haben, ziehen es jedoch möglicherweise vor, dieselbe konsistente CA-Architektur und dieselben Verwaltungsrichtlinien für Arbeitslasten zu verwenden, die in ihren Air-Gap-GDC-Umgebungen ausgeführt werden.
In diesem Leitfaden wird gezeigt, wie Sie die GDC-Netzwerkfunktionen, den internen DNS und Kubernetes cert-manager konfigurieren, um die Zertifikatslebenszyklusverwaltung (ACME) zu automatisieren und die programmgesteuerte Ausstellung in großem Umfang mithilfe eines RA-Musters (Registration Authority) zu unterstützen.
Annahmen
Bevor Sie mit dieser Anleitung fortfahren, sollten Sie prüfen, ob die folgenden Voraussetzungen erfüllt sind:
- Keyfactor EJBCA wird entweder als Software- oder Hardware-Appliance bereitgestellt und für den Dienst wird eine stabile IP-Adresse konfiguriert.
- In der EJBCA-Instanz wurden Root-, untergeordnete und Verwaltungs-Zertifizierungsstellen (CAs) erstellt.
- End Entity-Profile (EE) wurden konfiguriert (z.B. für TLS-Serverzertifikate).
- Zertifikate für die administrativen CA-Nutzer wurden heruntergeladen.
- Erforderliche Protokolle (z. B. ACME) sind auf der EJBCA-Instanz aktiviert.
- In dieser Anleitung werden RSA-Signaturalgorithmen verwendet. Sie können den Signaturalgorithmus entsprechend Ihren spezifischen Anforderungen oder der Konfiguration in Ihrer EJBCA-Instanz ändern.
Architektur
Die Architektur folgt dem Modell einer externen Zertifizierungsstelle, bei dem der EJBCA-Server und das zugehörige Hardwaresicherheitsmodul (HSM) extern außerhalb der physischen GDC-Grenzen gehostet werden, aber über das Netzwerk erreichbar sind. Der EJBCA-Server kann extern als Hardware- oder Software-Appliance bereitgestellt werden. Für die in dieser Anleitung beschriebene Kernintegration ist nur erforderlich, dass der externe EJBCA-Server über eine stabile IP-Adresse erreichbar ist.

Zu den wichtigsten Komponenten dieser Architektur gehören:
- EJBCA Enterprise Server: Wird extern als Keyfactor-Hardware- oder Software-Appliance bereitgestellt, in der sich die Zertifizierungsstellen (Stamm- und untergeordnete Zertifizierungsstellen) befinden und in der das gesamte CA-Schlüsselmaterial in einem CC EAL4+-zertifizierten HSM generiert wird.
- GDC Standard Kubernetes-Cluster: Die Rechenumgebung, in der Kundenarbeitslasten, cert-manager und Integrationsproxys ausgeführt werden.
- GDC Internal DNS: Verwaltet lokale private DNS-Zonen (mit dem in den Umgebungsvariablen konfigurierten privaten Domainnamen), die zum Auflösen von ACME DNS-01-Herausforderungen verwendet werden.
- GDC-Ausgangsgateway: Leitet ausgehenden Traffic von Cluster-Pods an die externe EJBCA-Server-IP-Adresse weiter.
- Harbor Private Registry: Hier werden gespiegelte Container-Images (z. B. der EJBCA-Cert-Manager-Aussteller) für die Bereitstellung in Umgebungen ohne Internetverbindung gehostet.
Hinweis
Prüfen Sie vor Beginn der Integration, ob Ihre GDC-Umgebung die folgenden Anforderungen erfüllt:
- Erstellen Sie zuerst ein Projekt, das als Container für alle Ressourcen dient, die in dieser Anleitung generiert werden.
Konfigurieren Sie Umgebungsvariablen, auf die in diesem Leitfaden verwiesen wird. Passen Sie diese Werte nach Bedarf an Ihre spezifische Umgebung an:
# GDC Environment Configuration export GDC_ORG="your-org-name" export GDC_ZONE="your-zone-name" export GDC_PROJECT_ID="your-project-id" export GDC_USER_NAME="your-gdc-user-email" export GDC_CLUSTER_NAME="your-cluster-name" # EJBCA Server Configuration export EJBCA_DNS_ZONE="example.internal" export EJBCA_HOSTNAME="ejbca.${EJBCA_DNS_ZONE}" export EJBCA_LB_IP="XX.XX.XX.XX" # Stable IP of your EJBCA Server export EJBCA_CA_NAME="GDC Subordinate CA" export EJBCA_NAMESPACE="ejbca-ee" export CERTIFICATE_PROFILE_NAME="GDC TLS SERVER PROFILE" export END_ENTITY_PROFILE_NAME="GDC TLS SERVER EE PROFILE" # Harbor Private Registry Configuration export HARBOR_INSTANCE_URL="your-harbor-url.internal" export HARBOR_PROJECT="your-harbor-project" export HARBOR_ROBOT_ACCOUNT="robot$your-robot-name" export HARBOR_ROBOT_SECRET="your-robot-secret" export HARBOR_PULL_SECRET_NAME="harbor-secret"Hinweis zum Netzwerk: In dieser Anleitung wird davon ausgegangen, dass sie von einem Bastion-Knoten aus ausgeführt wird, der Zugriff auf die GDC-Air-Gap-APIs und auf das Internet hat, um die erforderlichen Manifeste und Container-Images herunterzuladen. Wenn Sie diesen Befehl auf einem Computer ohne Internetzugang ausführen, müssen Sie diese Assets separat abrufen (z. B. mit
docker save, um Bilder von einem verbundenen Computer zu exportieren, und mitdocker load, um sie zu importieren) und sie sicher in Ihre Umgebung hochladen, bevor Sie fortfahren.
kubectl-Aliasse konfigurieren
In diesem Abschnitt erstellen Sie praktische Befehlszeilen-Aliase für die zonalen Verwaltungs- und globalen APIs von GDC:
Erstellen Sie einen Alias für die zonale Management-API (ersetzen Sie MANAGEMENT_API_KUBECONFIG durch den Pfad zur kubeconfig für die Management-API):
alias km="kubectl --kubeconfig MANAGEMENT_API_KUBECONFIG"Erstellen Sie einen Alias für die globale API (ersetzen Sie GLOBAL_API_KUBECONFIG durch den Pfad zur kubeconfig für die globale API):
alias kg="kubectl --kubeconfig GLOBAL_API_KUBECONFIG"
GDC-Standardcluster erstellen
In diesem Abschnitt stellen Sie einen Standard-Kubernetes-Cluster in GDC bereit und konfigurieren Administratorrollen für GDC-Standardcluster und lokale Anmeldedaten für die Harbor-Containerregistrierung:
1. Verfügbare VM-Imagetypen ermitteln:
```shell
gdcloud compute machine-types list
```
2. Wählen Sie einen geeigneten Maschinentyp für die Worker-Knoten Ihres Clusters aus:
```shell
export MACHINE_TYPE="n3-standard-8-gdc"
```
3. Erstellen Sie einen Standardcluster mit zwei Worker-Knoten mit der zonalen Verwaltungs-API:
```shell
km create -f - <<EOF
apiVersion: cluster.gdc.goog/v1
kind: Cluster
metadata:
name: ${GDC_CLUSTER_NAME}
namespace: ${GDC_PROJECT_ID}
spec:
nodePools:
- machineTypeName: ${MACHINE_TYPE}
nodeCount: 2
name: ${GDC_CLUSTER_NAME}-node-pool
EOF
```
This creates a simple GDC cluster. Cluster creation
can take up to 60 minutes to complete. To check the status, use the
following command:
```shell
km get clusters/${GDC_CLUSTER_NAME} \
-n ${GDC_PROJECT_ID} \
--watch
```
After the cluster is ready, the output should show a STATE of `Running`.
4. Rufen Sie nach der Bereitstellung des Clusters die Anmeldedaten ab:
```shell
KUBECONFIG=kubeconfig-${GDC_CLUSTER_NAME}.yaml gdcloud clusters \
get-credentials ${GDC_CLUSTER_NAME} \
--standard \
--project ${GDC_PROJECT_ID} \
--zone ${GDC_ZONE}
```
5. Weisen Sie Ihrem GDC-Nutzer GDC-Standardcluster-Administratorrollen zu:
```shell
gdcloud projects add-iam-policy-binding ${GDC_PROJECT_ID} \
--member="user:${GDC_USER_NAME}" \
--role=cluster-admin
gdcloud projects add-iam-policy-binding ${GDC_PROJECT_ID} \
--member="user:${GDC_USER_NAME}" \
--role=standard-cluster-admin
```
6. Erstellen Sie eine Harbor-Instanz und ein Harbor-Projekt in GDC, um die gespiegelten Container-Images zu hosten:
```shell
gdcloud projects add-iam-policy-binding ${GDC_PROJECT_ID} \
--member="user:${GDC_USER_NAME}" \
--role=harbor-instance-admin
```
7. Erstellen Sie ein Harbor-Roboterkonto und notieren Sie sich den Nutzernamen und den Secret-Schlüssel.
8. Authentifizieren Sie sich bei Ihrer Harbor-Instanz:
```shell
docker --config=./docker-harbor login ${HARBOR_INSTANCE_URL} \
-u ${HARBOR_ROBOT_ACCOUNT} \
-p ${HARBOR_ROBOT_SECRET}
```
This saves the robot account credentials to
`./docker-harbor/config.json` for subsequent Secret creation.
Infrastruktur- und Netzwerkkonfiguration
In diesem Abschnitt konfigurieren Sie die zugrunde liegende GDC-Infrastruktur und die Netzwerkeinstellungen. So wird sichergestellt, dass Ihre Kubernetes-Arbeitslasten den externen EJBCA-Host-Domainnamen auflösen und ausgehende API-Aufrufe erfolgreich an die zugehörige IP-Adresse weiterleiten können.
Einrichtung von privatem DNS in GDC mit Air Gap
Um die Domainauflösung einzurichten, stellen Sie eine private DNS-Zone und einen Datensatz bereit, um den externen EJBCA-Server einem lokalen Domainnamen zuzuordnen. So können Dienste innerhalb von GDC eine Verbindung über einen stabilen Hostnamen anstelle einer Roh-IP-Adresse herstellen:
Weisen Sie Ihrem Nutzer die Rolle „Managed DNS Project Admin“ zu:
gdcloud projects add-iam-policy-binding ${GDC_PROJECT_ID} \ --member=user:${GDC_USER_NAME} \ --role=managed-dns-project-adminStellen Sie die globale
ManagedDNSZone-Ressource bereit:kubectl --kubeconfig GLOBAL_API_KUBECONFIG apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ManagedDNSZone metadata: name: private-example-internal namespace: ${GDC_PROJECT_ID} spec: dnsName: ${EJBCA_DNS_ZONE} visibility: PRIVATE EOFStellen Sie
ResourceRecordSetbereit und verweisen Sie auf die IP-Adresse Ihrer EJBCA-Appliance:kubectl --kubeconfig GLOBAL_API_KUBECONFIG apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ResourceRecordSet metadata: name: ${EJBCA_HOSTNAME} namespace: ${GDC_PROJECT_ID} spec: name: ${EJBCA_HOSTNAME} ttlSeconds: 600 type: A rrData: - ${EJBCA_LB_IP} dnsZone: private-example-internal EOF
NAT-Gateway für ausgehenden Traffic einrichten
Als Nächstes konfigurieren Sie das ausgehende Netzwerk von GDC, indem Sie ein benutzerdefiniertes Subnetz und ein NAT-Gateway einrichten, damit Kubernetes-Arbeitslasten (z. B. cert-manager- und Registration Authority-Clients) ausgehenden Traffic sicher an den EJBCA-Server weiterleiten können:
Weisen Sie Netzwerkentwicklerrollen auf Projekt- und Organisationsebene zu:
gdcloud projects add-iam-policy-binding ${GDC_PROJECT_ID} \ --member=user:${GDC_USER_NAME} \ --role=cloud-nat-developer gdcloud projects add-iam-policy-binding ${GDC_PROJECT_ID} \ --member=user:${GDC_USER_NAME} \ --role=subnet-project-admin gdcloud organizations add-iam-policy-binding ${GDC_ORG} \ --member="user:${GDC_USER_NAME}" \ --role=subnet-org-adminEgress-Subnetz erstellen:
kubectl --kubeconfig MANAGEMENT_API_KUBECONFIG apply -f - <<EOF apiVersion: ipam.gdc.goog/v1 kind: Subnet metadata: name: ejbca-cluster-egress namespace: ${GDC_PROJECT_ID} spec: ipv4Request: prefixLength: 32 parentReference: name: data-network-segment-${GDC_ZONE}-group namespace: platform type: SubnetGroup type: Leaf EOFErstellen Sie das
CloudNATGateway, das dem Cert-Manager-Ausstellerselektor entspricht:kubectl --kubeconfig MANAGEMENT_API_KUBECONFIG apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: CloudNATGateway metadata: name: ejbca-egress-gateway namespace: ${GDC_PROJECT_ID} spec: subnetRefs: - ejbca-cluster-egress workloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: ${GDC_CLUSTER_NAME} workloads: matchLabels: app.kubernetes.io/name: ejbca-cert-manager-issuer EOF
Einbindung von Kubernetes cert-manager
In diesem Abschnitt binden Sie den benutzerdefinierten EJBCA-cert-manager-Aussteller in den cert-manager-Dienst von GDC ein. So können Sie die automatische Zertifikatbereitstellung, ‑verlängerung und ‑lebenszyklusverwaltung für Ihre containerisierten Dienste einrichten.

EJBCA für den Aussteller konfigurieren
Um den Aussteller zu integrieren, konfigurieren Sie die erforderlichen Profile, registrieren die Anmeldedaten des Verwaltungsclients und richten Rollenbindungen auf dem EJBCA-Server ein. Dadurch wird ein sicherer administrativer Kanal eingerichtet, über den cert-manager sich bei EJBCA authentifizieren und Zertifikate anfordern kann.
Administratorzertifikatprofil erstellen
Zuerst erstellen Sie in EJBCA ein Zertifikatprofil, um die technischen Eigenschaften und kryptografischen Einschränkungen (z. B. Algorithmen und Gültigkeitszeiträume) des administrativen Zertifikats zu definieren:
- Öffnen Sie die EJBCA Admin UI und rufen Sie CA Functions > Certificate Profiles auf.
- Klonen Sie das Profil ENDUSER und nennen Sie es
GDC ADMIN PROFILE. - Bearbeiten Sie die
GDC ADMIN PROFILEund konfigurieren Sie die folgenden Einstellungen:- Verfügbare Schlüsselalgorithmen: RSA
- Verfügbare Bitlängen: 2.048, 3.072, 4.096
- Signaturalgorithmus: SHA512WithRSA
- Gültigkeit:
200d - Alternativer Name des Ausstellers: Verwenden
- CRL-Verteilungspunkte: Verwenden muss aktiviert sein.
- Von der Zertifizierungsstelle definierte CRL-Verteilungspunkte verwenden: Klicken Sie auf Verwenden.
- Zugriff auf Zertifizierungsstelleninfos: Verwenden muss aktiviert sein.
- CA-definierten OCSP-Locator verwenden: Aktivieren Sie Verwenden.
- Von CA definierten CA-Aussteller verwenden: Verwenden aktivieren
- Verfügbare CAs: Wählen Sie
GDC Subordinate CAaus.
- Klicken Sie auf Speichern.
Administrator-Endentitätsprofil erstellen
Als Nächstes erstellen Sie in EJBCA ein Endentitätsprofil, um Standardfelder und CA-Zuweisungen zu definieren. Dadurch wird die Registrierung und Ausstellung des Administratorzertifikats vereinfacht:
- Rufen Sie RA Functions > End Entity Profiles auf.
- Geben Sie unter End-Entity-Profil hinzufügen
GDC ADMIN EE PROFILEein und klicken Sie auf Profil hinzufügen. - Bearbeiten Sie das Profil und konfigurieren Sie die folgenden Einstellungen:
- Standardzertifikatprofil:
GDC ADMIN PROFILE - Verfügbare Zertifikatprofile:
GDC ADMIN PROFILE - Standard-Zertifizierungsstelle:
GDC Subordinate CA - Verfügbare Zertifizierungsstellen:
GDC Subordinate CA
- Standardzertifikatprofil:
- Klicken Sie auf Speichern.
Administratorzertifikat registrieren
Nachdem Sie die Profile eingerichtet haben, registrieren Sie die administrative Identität über die EJBCA Registration Authority (RA)-Schnittstelle und extrahieren den privaten Schlüssel, das öffentliche Zertifikat und die Vertrauenskette, um die physischen Berechtigungsnachweisdateien zu generieren, die für die Authentifizierung von cert-manager erforderlich sind:
- Rufen Sie den Tab RA Web auf.
- Klicken Sie auf Neue Anfrage stellen und konfigurieren Sie Folgendes:
- Zertifikattyp:
GDC ADMIN EE PROFILE - Generierung von Schlüsselpaaren: durch die Zertifizierungsstelle
- Schlüsselalgorithmus: RSA 4.096 Bit
- Allgemeiner Name (CN):
cert-manager - Nutzername:
cert-manager - Registrierungscode:
abcd
- Zertifikattyp:
- Klicken Sie auf PEM-Datei herunterladen und speichern Sie sie als
cert-manager.pem. Teilen Sie die PEM-Dateien in drei Dateien auf:
client.key(der geheime Schlüssel):openssl pkey -in cert-manager.pem -out client.keyclient.crt(das öffentliche Zertifikat):openssl x509 -in cert-manager.pem -out client.crtca.crt(die Vertrauenskette mit den Zertifikaten der untergeordneten und der Stammzertifizierungsstelle):awk '/BEGIN CERTIFICATE/{i++} i>1' cert-manager.pem > ca.crt
Rollen und Zugriffsregeln konfigurieren
Schließlich erstellen Sie eine Administratorrolle in EJBCA und binden sie an die Seriennummer des cert-manager-Zertifikats, damit der Aussteller nur die minimalen Berechtigungen hat, die zum Genehmigen und Anfordern von Zertifikaten erforderlich sind:
- Rufen Sie in der EJBCA Admin UI RA Functions > Search End Entities auf.
- Suchen Sie nach der Endentität
cert-managerund notieren Sie sich die Seriennummer des Zertifikats. - Rufen Sie Systemfunktionen > Rollen und Zugriffsregeln auf und klicken Sie auf Hinzufügen.
- Geben Sie der Rolle den Namen
cert-managerund fügen Sie ein neues Mitglied mit der von Ihnen notierten Seriennummer hinzu. - Klicken Sie auf Zugriffsregeln bearbeiten und konfigurieren Sie die folgenden Berechtigungen:
- Rollenvorlage: RA-Administratoren
- Autorisierte Zertifizierungsstellen:
GDC Subordinate CA - Regeln für Endentitäten: Endentitäten genehmigen, erstellen und bearbeiten
- End Entity Profiles (Endentitätsprofile):
GDC TLS SERVER EE PROFILE - Andere Regeln: Klicken Sie auf Audit-Log ansehen.
- Klicken Sie auf Speichern.
GDC-Cluster vorbereiten
Zur Vorbereitung der GDC-Umgebung authentifizieren Sie sich mit Ihrem Standard-Kubernetes-Cluster und speichern die extrahierten EJBCA-Administratoranmeldedaten in Kubernetes-Secrets, sodass sie für die cert-manager-Aussteller-Pods sicher zugänglich sind:
Standard-Clusteranmeldedaten abrufen:
gdcloud clusters get-credentials "${GDC_CLUSTER_NAME}" \ --standard \ --project "${GDC_PROJECT_ID}" \ --zone "${GDC_ZONE}"Erstellen Sie den Ziel-Namespace für den benutzerdefinierten Aussteller:
kubectl create ns ejbca-issuer-systemStellen Sie das Secret für die TLS-Authentifizierung bereit:
kubectl create secret tls ejbca-secret \ -n ejbca-issuer-system \ --cert=client.crt \ --key=client.keyStellen Sie das EJBCA-Secret für die Vertrauenskette bereit:
kubectl create secret generic ejbca-ca-secret \ -n ejbca-issuer-system \ --from-file=ca.crt
EJBCA-Aussteller installieren
Um die Bereitstellung zu konfigurieren, spiegeln Sie das EJBCA-Cert-Manager-Aussteller-Container-Image in Ihrer privaten Harbor-Registry und stellen das Helm-Diagramm bereit. Dadurch wird der benutzerdefinierte Controller instanziiert, der erforderlich ist, um Kubernetes-Zertifikatanfragen in EJBCA-API-Aufrufe zu übersetzen:
Erstellen Sie ein Harbor-Secret zum Abrufen von Images im Namespace des Ausstellers:
# Authenticate with the private Harbor registry docker --config=./docker-harbor login ${HARBOR_INSTANCE_URL} \ -u ${HARBOR_ROBOT_ACCOUNT} \ -p ${HARBOR_ROBOT_SECRET} kubectl create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker-harbor/config.json \ -n ejbca-issuer-systemSpiegeln Sie das offizielle EJBCA-cert-manager-Aussteller-Image in Harbor:
docker pull keyfactor/ejbca-cert-manager-issuer:latest --platform linux/amd64 docker tag keyfactor/ejbca-cert-manager-issuer:latest \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/ejbca-cert-manager-issuer:latest docker --config=./docker-harbor push \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/ejbca-cert-manager-issuer:latestFügen Sie das Helm-Repository hinzu und laden Sie das Diagramm herunter:
helm repo add ejbca-issuer https://keyfactor.github.io/ejbca-cert-manager-issuer helm repo update helm pull ejbca-issuer/ejbca-cert-manager-issuer --untarStellen Sie das Helm-Diagramm mit dem gespiegelten Image-Repository bereit:
helm install ejbca-cert-manager-issuer ./ejbca-cert-manager-issuer \ --namespace ejbca-issuer-system \ --set image.repository=${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/ejbca-cert-manager-issuer \ --set "imagePullSecrets[0].name=${HARBOR_PULL_SECRET_NAME}" \ --set image.tag=latest
Ausstellerressource erstellen
Als Nächstes richten Sie GDC-RBAC-Berechtigungen ein und stellen eine globale ClusterIssuer-Ressource bereit, mit der der EJBCA-Server als vertrauenswürdige Signaturquelle im Kubernetes-cert-manager-Framework registriert wird:
Konfigurieren Sie RBAC-Berechtigungen, damit der cert-manager-Controller von GDC den benutzerdefinierten EJBCA-Aussteller verwenden kann:
kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cert-manager-controller-approve:issuers-ejbca-issuer-keyfactor-com rules: - verbs: - approve apiGroups: - cert-manager.io resources: - signers resourceNames: - issuers.ejbca-issuer.keyfactor.com/* - clusterissuers.ejbca-issuer.keyfactor.com/* --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cert-manager-controller-approve:issuers-ejbca-issuer-keyfactor-com subjects: - kind: ServiceAccount name: cert-manager namespace: cert-manager roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cert-manager-controller-approve:issuers-ejbca-issuer-keyfactor-com EOFStellen Sie die globale
ClusterIssuer-Ressource bereit:kubectl apply -f - <<EOF apiVersion: ejbca-issuer.keyfactor.com/v1alpha1 kind: ClusterIssuer metadata: name: clusterissuer-ejbca spec: hostname: "${EJBCA_HOSTNAME}" ejbcaSecretName: "ejbca-secret" caBundleSecretName: "ejbca-ca-secret" certificateAuthorityName: "${EJBCA_CA_NAME}" certificateProfileName: "${CERTIFICATE_PROFILE_NAME}" endEntityProfileName: "${END_ENTITY_PROFILE_NAME}" endEntityName: "" EOFPrüfen Sie den Ausstellerstatus:
kubectl get clusterissuer.ejbca-issuer.keyfactor.com/clusterissuer-ejbca \ -o "custom-columns=NAME:.metadata.name,STATUS:.status.conditions[0].message"Die Ausgabe sollte Folgendes enthalten:
NAME STATUS clusterissuer-ejbca Success
Zertifikat anfordern
Zur Überprüfung der Integration stellen Sie eine standardmäßige Kubernetes-Zertifikatsressource bereit, um den End-to-End-Ablauf von cert-manager zu testen und zu bestätigen, dass EJBCA das angeforderte Zertifikat erfolgreich signiert und bereitstellt:
Erstellen Sie eine Certificate-Testressource, um die erfolgreiche Integration zu überprüfen:
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: ejbca-test-certificate
namespace: ${EJBCA_NAMESPACE}
spec:
commonName: example.com
secretName: ejbca-certificate
issuerRef:
name: clusterissuer-ejbca
group: ejbca-issuer.keyfactor.com
kind: ClusterIssuer
EOF
Prüfen Sie, ob das Zertifikat erstellt wurde und bereit ist:
kubectl get certificates.cert-manager.io -n ${EJBCA_NAMESPACE}
Die Ausgabe sollte Folgendes enthalten:
NAME READY SECRET AGE
ejbca-test-certificate True ejbca-certificate 12s
Automatisierte ACME-Identitätsbestätigung mit DNS-01-Identitätsbestätigungen
In diesem Abschnitt konfigurieren Sie den ACME-Dienst von EJBCA und verwenden interne DNS-Ressourcen von GDC, um die Ausstellung von domainvalidierten Zertifikaten zu automatisieren. So können Standard-cert-manager- oder Certbot-Clients Zertifikate mit standardmäßigen automatisierten ACME-Protokollen anfordern.
EJBCA für ACME konfigurieren
Um den Server vorzubereiten, aktivieren Sie den ACME-Dienst in EJBCA und konfigurieren Sie einen ACME-Alias mit einem dedizierten DNS-Resolver. Dadurch wird der EJBCA-Server darauf vorbereitet, DNS-01-Challenge-Antworten in GDC zu verarbeiten und zu validieren:
- Rufen Sie in der EJBCA-Administratoroberfläche System Configuration > ACME Configuration auf.
- Klicken Sie auf Hinzufügen und konfigurieren Sie Folgendes:
- Name:
default - End-Entity-Profil:
GDC TLS SERVER EE PROFILE - Wildcard Certificate Issuance Allowed (Ausstellung von Platzhalterzertifikaten zulässig): Aktiviert
- Challenge-Response-MPIC-Validierung – DNS-Identifier-Challenge-Typen:
Wählen Sie
dns-01aus. - DNS-Resolver: Geben Sie die IP-Adresse Ihres globalen DNS ein.
- DNSSEC validieren: nicht erforderlich (da es sich um eine lokale private Umgebung handelt)
- Name:
- Klicken Sie auf Speichern.
ACME-Umgebungsvariablen erstellen
In diesem Abschnitt erstellen Sie die folgenden Umgebungsvariablen, um Ihren Certbot-Client zu konfigurieren. Ändern Sie diese Werte nach Bedarf:
# ACME Alias created in the EJBCA configuration
export ACME_ALIAS="default"
# Arbitrary email address used for ACME registration
export ACME_EMAIL="your-email@example.com"
Certbot-Client registrieren
Als Nächstes installieren Sie den Standard-Certbot-Client und registrieren ihn beim privaten ACME-Endpunkt von EJBCA. Dadurch wird das vertrauenswürdige Kundenkonto eingerichtet, das für die automatische Zertifikatsverwaltung erforderlich ist:
Installieren Sie
certbotauf Ihrer Workstation. Beispiel für macOS:brew install certbotErstellen Sie lokale Ordner für die Konfiguration und die Logs:
mkdir -p ./certbot/config ./certbot/work ./certbot/logsRegistrieren Sie den Client beim EJBCA ACME-Verzeichnisendpunkt:
certbot register \ --config-dir ./certbot/config \ --work-dir ./certbot/work \ --logs-dir ./certbot/logs \ --server https://${EJBCA_HOSTNAME}/ejbca/acme/${ACME_ALIAS}/directory \ --email ${ACME_EMAIL} \ --agree-tos \ --no-eff-email
Zertifikat mit DNS-Challenge ausstellen
Schließlich führen Sie eine manuelle Certbot-Anfrage aus und stellen eine temporäre GDC-DNS-TXT-Ressource bereit, um die DNS-01-Herausforderung zu lösen. Dadurch wird Ihre Inhaberschaft der Zieldomain bestätigt und die automatische Zertifikatausstellung ausgelöst:
Führen Sie den Befehl für die manuelle Challenge aus:
certbot certonly \ --manual \ --preferred-challenges dns \ --key-type rsa \ --rsa-key-size 2048 \ --config-dir ./certbot/config \ --work-dir ./certbot/work \ --logs-dir ./certbot/logs \ --server https://${EJBCA_HOSTNAME}/ejbca/acme/${ACME_ALIAS}/directory \ -d test.${EJBCA_DNS_ZONE}Das Terminal hält an und zeigt einen Challenge-Wert an. Beispielausgabe:
Please deploy a DNS TXT record under the name: _acme-challenge.test.example.internal. with the following value: q3pCmzXfIhsTpT4f4JAulHmHaAR3udC_9Wf1G498ER0 Before continuing, verify the TXT record has been deployed.Stellen Sie den TXT-Eintrag mit dem von Certbot bereitgestellten String in Ihrem globalen DNS bereit.
Warten Sie etwa 30 Sekunden, bis die DNS-Weiterleitung erfolgt ist. Kehren Sie dann zum Certbot-Terminal zurück und drücken Sie die Eingabetaste.
Beispielausgabe:
Successfully received certificate. Certificate is saved at:./certbot/config/live/test.example.internal/fullchain.pem Key is saved at:./certbot/config/live/test.example.internal/privkey.pem This certificate expires on 2026-11-16. These files will be updated when the certificate renews.Prüfen Sie, ob das Zertifikat erfolgreich in
./certbot/config/live/test.${EJBCA_DNS_ZONE}/geschrieben wurde.