Freigeben über


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

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

  1. 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 
    
  2. 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>