你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

轮换由 Azure Arc 启用的 SQL 托管实例(间接连接)中的证书

本文介绍如何使用 Azure CLI 或 kubectl 命令在间接连接模式下为由 Azure Arc 启用的 SQL 托管实例轮换用户提供的传输层安全性 (TLS) 证书。

本文中的示例使用 OpenSSL。 OpenSSL 是一个开源命令行工具包,适用于常规用途的加密和安全通信。

先决条件

使用 openssl 生成证书请求

如果托管实例使用自签名证书,请添加所有需要的使用者可选名称 (SAN)。 SAN 是 X.509 的扩展,它允许使用 subjectAltName 字段将各种值与安全证书关联,SAN 字段允许你指定其他主机名(站点、IP 地址、公用名等)由单个 SSL 证书保护,例如多域 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 机密后,可以将其绑定到 SQL 托管实例 yaml 定义 security 部分,其中 serviceCertificateSecret 位置如下:

  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>