Rotieren des Zertifikats von SQL Managed Instance mit Azure Arc-Unterstützung (indirekt verbunden)
Dieser Artikel beschreibt, wie Sie das vom Benutzer bereitgestellte Transport Layer Security(TLS)-Zertifikat für die von Azure Arc im indirekten Verbindungsmodus aktivierte SQL Managed Instance mithilfe von Azure CLI oder kubectl
Befehlen drehen.
Die Beispiele in diesem Artikel verwenden OpenSSL. OpenSSL ein Open-Source-Befehlszeilen-Toolkit für allgemeine Kryptografie und sichere Kommunikation.
Voraussetzungen
- Installieren des Hilfsprogramms openssl
- eine von Azure Arc im indirekt verbundenen Modus aktivierte SQL Managed Instance
Generieren einer Zertifikatanforderung mit openssl
Wenn die verwaltete Instanz ein selbstsigniertes Zertifikat verwendet, fügen Sie alle erforderlichen alternativen Antragstellernamen (SANs) hinzu. Das SAN ist eine Erweiterung auf X.509, mit der verschiedene Werte mithilfe eines subjectAltName
-Felds einem Sicherheitszertifikat zugeordnet werden können. Mit dem SAN-Feld können Sie zusätzliche Hostnamen angeben (z. B. Standorte, IP-Adressen und allgemeine Namen), die durch ein einzelnes SSL-Zertifikat geschützt werden sollen, z. B. ein SAN mit mehreren Domänen oder ein SSL-Zertifikat mit mehreren Domänen und einer erweiterten Validierung.
Um ein Zertifikat selbst zu generieren, müssen Sie eine Zertifikatsignieranforderung (Certificate Signing Request, CSR) erstellen. Stellen Sie sicher, dass die Konfiguration für das Zertifikat einen allgemeinen Namen mit den erforderlichen SANs und einen Zertifizierungsstellenaussteller hat. Beispiel:
openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr
Führen Sie den folgenden Befehl aus, um das erforderliche SAN zu überprüfen:
openssl x509 -in /<cert path>/<filename>.pem -text
Dieser Befehl wird im folgenden Beispiel veranschaulicht:
openssl x509 -in ./mssql-certificate.pem -text
Der Befehl gibt die folgende Ausgabe zurück:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 7686530591430793847 (0x6aac0ad91167da77)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = Cluster Certificate Authority
Validity
Not Before: Mmm dd hh:mm:ss yyyy GMT
Not After: Mmm dd hh:mm:ss yyyy GMT
Subject: CN = mi4-svc
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:ad:7e:16:3e:7d:b3:1e: ...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Extended Key Usage: critical
TLS Web Client Authentication, TLS Web Server Authentication
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:mi4-svc, DNS:mi4-svc.test.svc.cluster.local, DNS:mi4-svc.test.svc
Signature Algorithm: sha256WithRSAEncryption
7a:f8:a1:25:5c:1d:e2:b4: ...
-----BEGIN CERTIFICATE-----
MIIDNjCCAh6gAwIB ...==
-----END CERTIFICATE-----
Beispielausgabe:
X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc
Erstellen einer YAML-Spezifikation für Kubernetes-Geheimnisse für Ihr Dienstzertifikat
Codieren Sie eine Datei mit dem folgenden Befehl mit base64 in jeder Linux-Distribution. Daten werden codiert und decodiert, um die Datenübertragung und Datenspeicherung zu vereinfachen.
base64 /<path>/<file> > cert.txt
Windows-Benutzer verwenden das Dienstprogramm certutil, um die Base64-Codierung und -Dekodierung mit folgendem Befehl durchzuführen:
$certutil -encode -f input.txt b64-encoded.txt
Entfernen Sie den Header manuell aus der Ausgabedatei oder verwenden Sie den folgenden Befehl:
$findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt
Fügen Sie der YAML-Spezifikationsdatei das Base64-codierte Zertifikat und den privaten Schlüssel hinzu, um ein Kubernetes-Geheimnis zu erstellen:
apiVersion: v1 kind: Secret metadata: name: <secretName> type: Opaque data: certificate.pem: < base64 encoded certificate > privatekey.pem: < base64 encoded private key >
Rotieren des Zertifikats über Azure CLI
Verwenden Sie den folgenden Befehl, indem Sie das Kubernetes-Geheimnis bereitstellen, das Sie zuvor erstellt haben, um das Zertifikat zu rotieren:
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>
Beispiel:
az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret
Verwenden Sie den folgenden Befehl, um das Zertifikat mit den öffentlichen und privaten Schlüsseln des PEM-formatierten Zertifikats zu rotieren. Der Befehl generiert einen Standardnamen für das Dienstzertifikat.
az sql mi-arc update -n <managed instance name> --k8s-namespace arc --use-k8s --cert-public-key-file <path-to-my-cert-public-key> --cert-private-key-file <path-to-my-cert-private-key> --k8s-namespace <your-k8s-namespace>
Beispiel:
az sql mi-arc update -n mysqlmi --k8s-namespace arc --use-k8s --cert-public-key-file ./mi1-1-cert --cert-private-key-file ./mi1-1-pvt
Sie können auch den Namen eines Kubernetes Service-Zertifikatgeheimnis für den Parameter --service-cert-secret
angeben. In diesem Fall wird dieser als aktualisierter Geheimnisname übernommen. Der Befehl überprüft, ob das Geheimnis vorhanden ist. Wenn dies nicht der Fall ist, erstellt der Befehl einen Geheimnisnamen und rotiert dann das Geheimnis in der verwalteten Instanz.
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --cert-public-key-file <path-to-my-cert-public-key> --cert-private-key-file <path-to-my-cert-private-key> --service-cert-secret <path-to-mymi-cert-secret>
Beispiel:
az sql mi-arc update -n mysqlmi --k8s-namespace arc --use-k8s --cert-public-key-file ./mi1-1-cert --cert-private-key-file ./mi1-1-pvt --service-cert-secret mi1-12-1-cert-secret
Rotieren des Zertifikats mit dem Befehl kubectl
Nachdem Sie das Kubernetes-Geheimnis erstellt haben, können Sie es an den Abschnitt der yaml-Definition security
der SQL Managed Instance binden, wobei serviceCertificateSecret
sich wie folgt befindet:
security:
adminLoginSecret: <your-admin-login-secret>
serviceCertificateSecret: <your-cert-secret>
Die folgende Datei .yaml
ist ein Beispiel für die Rotation des Service-Zertifikats in der SQL-Instanz namens mysqlmi
, aktualisieren Sie die Spezifikation mit einem Kubernetes-Geheimnis namens my-service-cert
:
apiVersion: sql.arcdata.microsoft.com/v1
kind: sqlmanagedinstance
metadata:
name: mysqlmi
namespace: my-arc-namespace
spec:
spec:
dev: false
licenseType: LicenseIncluded
replicas: 1
security:
adminLoginSecret: mysqlmi-admin-login-secret
# Update the serviceCertificateSecret with name of the K8s secret
serviceCertificateSecret: my-service-cert
services:
primary:
type: NodePort
storage:
data:
volumes:
- size: 5Gi
logs:
volumes:
- size: 5Gi
tier: GeneralPurpose
Sie können den folgenden kubectl-Befehl verwenden, um diese Einstellung anzuwenden:
kubectl apply -f <my-sql-mi-yaml-file>