共用方式為


輪替已啟用 Azure Arc 的 SQL 受控執行個體憑證 (間接連線)

本文描述如何使用 Azure CLI 或 kubectl 命令,針對間接連線模式中已啟用 Azure Arc 的 SQL 受控執行個體,輪替使用者提供的傳輸層安全性 (TLS) 憑證。

本文中使用 OpenSSL 的範例。 OpenSSL 是開放原始碼命令列工具組,適用於一般用途的密碼編譯和安全通訊。

必要條件

使用 openssl 產生憑證要求

如果受控執行個體使用自我簽署憑證,請新增所有必要的主體別名 (SAN)。 SAN 是 X.509 的延伸模組,可讓各種值使用 subjectAltName 欄位與安全性憑證相關聯。SAN 欄位可讓您指定要受單一 SSL 憑證保護的其他主機名稱 (網站、IP 位址、一般名稱等),例如多網域 SAN 或延伸驗證多網域 SSL 憑證。

若要自行產生憑證,您必須建立憑證簽署要求 (CSR)。 驗證憑證的設定是否有一個具有必要 SAN 的一般名稱,以及是否具有一個 CA 簽發者。 例如:

openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr

請執行下列命令以檢查必要的 SAN:

openssl x509 -in /<cert path>/<filename>.pem -text

下列範例示範此命令:

openssl x509 -in ./mssql-certificate.pem -text

此命令會傳回下列輸出:

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

範例輸出︰

X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc

為您的服務憑證建立 Kubernetes 秘密 yaml 規格

  1. 使用下列命令搭配任何 Linux 散發套件中的 base64 編碼檔案。資料會進行編碼和解碼,讓資料傳輸和儲存流程更輕鬆。

    base64 /<path>/<file> > cert.txt 
    

    若為 Windows 使用者,請使用 certutil 公用程式來執行 Base64 編碼和解碼,如下列命令所示:

    $certutil -encode -f input.txt b64-encoded.txt
    

    手動移除輸出檔案中的標頭,或使用下列命令:

    $findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt 
    
  2. 將 base64 編碼的憑證和私密金鑰新增至 yaml 規格檔案,以建立 Kubernetes 秘密:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secretName>
    type: Opaque
    data:
      certificate.pem: < base64 encoded certificate >
      privatekey.pem: < base64 encoded private key >
    

透過 Azure CLI 輪替憑證

提供您先前建立的 Kubernetes 秘密來使用下列命令,以輪替憑證:

az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>

例如:

az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret

使用下列命令,搭配 PEM 格式的憑證公開和私密金鑰輪替憑證。 此命令會產生預設服務憑證名稱。

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>

例如:

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 參數提供 Kubernetes 服務憑證秘密名稱。 在此情況下,其會作為更新的秘密名稱。 此命令會檢查秘密是否存在。 如果不存在,命令會建立秘密名稱,然後在受控執行個體中輪替秘密。

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>

例如:

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

使用 kubectl 命令輪替憑證

一旦建立了 Kubernetes 秘密,您就可以將其繫結至 serviceCertificateSecret 所在的 SQL 受控執行個體 yaml 定義 security 區段,如下所示:

  security:
    adminLoginSecret: <your-admin-login-secret>
    serviceCertificateSecret: <your-cert-secret>

下列 .yaml 檔案是一個範例,可在名為 mysqlmi 的 SQL 執行個體中輪替服務憑證,並使用名為 my-service-cert 的 Kubernetes 秘密來更新規格:

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

您可以使用下列 kubectl 命令來套用此設定:

   kubectl apply -f <my-sql-mi-yaml-file>