全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan ACME CA untuk menerbitkan sertifikat untuk gateway ingress ASM

更新时间:Jul 02, 2025

Automatic Certificate Management Environment (ACME) adalah protokol yang mengotomatiskan penerbitan sertifikat X.509. Protokol ini memungkinkan otoritas sertifikat (CA) memverifikasi kepemilikan domain secara otomatis dan menerbitkan sertifikat untuk pemohon. Let's Encrypt, sebuah CA publik nirlaba, menggunakan protokol ACME untuk menerbitkan sertifikat yang dipercaya oleh sebagian besar browser. Topik ini menjelaskan cara menggunakan cert-manager bersama dengan Let's Encrypt untuk menerbitkan sertifikat HTTPS yang dipercaya browser untuk gateway ingress Service Mesh (ASM).

Prasyarat

ACME dalam cert-manager

Saat menggunakan cert-manager, Penerbit ACME mendaftarkan akun dengan server CA yang mendukung protokol ACME. Saat membuat sumber daya Penerbit ACME, cert-manager menghasilkan kunci privat untuk komunikasi aman dengan server CA ACME. Sertifikat yang diterbitkan oleh CA publik seperti Let's Encrypt umumnya dipercaya oleh browser web. Ini berarti bahwa ketika pengguna mengakses situs web melalui browser, browser mereka akan mempercayai sertifikat Secure Sockets Layer (SSL) dan Transport Layer Security (TLS) dari situs tersebut. Tujuan utama sertifikat ini adalah membuktikan kepada browser bahwa server saat ini adalah penyedia layanan sah untuk domain tersebut. Oleh karena itu, CA publik perlu memverifikasi bahwa server yang mengajukan sertifikat benar-benar memiliki domain sebelum menerbitkan sertifikat. Untuk informasi lebih lanjut tentang protokol ACME, lihat Automatic Certificate Management Environment.

Menyelesaikan Tantangan

Tantangan adalah mekanisme utama yang digunakan oleh protokol ACME untuk memvalidasi bahwa pemohon sertifikat memiliki domain dalam sertifikat. Dalam proses pengajuan sertifikat, server CA ACME mengharuskan klien menyelesaikan tantangan tertentu untuk memastikan bahwa hanya pemilik sah domain yang dapat berhasil mengajukan sertifikat. Hal ini meningkatkan keamanan jaringan dan mencegah risiko peniruan domain. cert-manager mendukung dua jenis tantangan utama: tantangan HTTP-01 dan tantangan DNS-01.

  • Tantangan HTTP-01 diselesaikan dengan menyajikan kunci yang dihitung di titik akhir URL HTTP. Kunci ini dirutekan melalui Internet menggunakan domain yang diminta untuk sertifikat. Setelah server ACME dapat mengambil kunci ini dari URL tersebut melalui Internet, server ACME dapat memvalidasi bahwa pemohon adalah pemilik domain tersebut. Ketika tantangan HTTP-01 dibuat, cert-manager secara otomatis mengonfigurasi ingress kluster Anda untuk merutekan lalu lintas ke server web kecil yang menyajikan kunci ini. Server web kecil tersebut merespons permintaan validasi tantangan yang diinisiasi oleh server ACME dengan mengembalikan kunci ini.

  • Tantangan DNS-01 diselesaikan dengan memberikan kunci yang dihitung dalam catatan TXT Sistem Nama Domain (DNS). Setelah catatan TXT ini menyebar di seluruh Internet, server ACME dapat mengambil kunci ini melalui pencarian DNS dan memvalidasi bahwa pemohon memiliki domain untuk sertifikat yang diminta. Dengan izin yang sesuai, cert-manager secara otomatis menyajikan catatan TXT ini untuk penyedia DNS.

Catatan

Dalam skenario dunia nyata, pastikan CA Anda mendukung protokol ACME. Jika CA Anda mendukung protokol ACME, gateway ingress ASM Anda dapat menggunakan cert-manager untuk secara otomatis mendapatkan sertifikat dari CA. Sebagai contoh, Sectigo mendukung protokol ACME, dan cara kerjanya serupa dengan yang dijelaskan dalam topik ini.

Langkah 1: Siapkan domain publik

Untuk menggunakan Let's Encrypt untuk menerbitkan sertifikat untuk domain, Anda harus memiliki domain publik dan mengarahkan domain tersebut ke gateway ingress ASM yang ingin Anda gunakan. Untuk informasi lebih lanjut, lihat dokumentasi penyedia DNS Anda. Jika Anda menggunakan Alibaba Cloud DNS, lihat Tambahkan Catatan DNS. Untuk informasi lebih lanjut tentang Let's Encrypt, lihat Memulai.

Langkah 2: Buat sumber daya Penerbit untuk menghubungkan cert-manager ke Let's Encrypt

  1. Gunakan file kubeconfig kluster ACK pada bidang data plane yang Anda tambahkan ke instance ASM, lalu buat sumber daya yang ditampilkan dalam blok kode berikut:

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: letsencrypt-prod-issuer
      namespace: istio-system
    spec:
      acme:
        email: 'te**@mail.com'    # Bidang ini opsional tetapi kami sarankan Anda menentukan bidang ini. Server ACME mungkin mengirimkan pemberitahuan penting terkait sertifikat kepada Anda melalui email ini.
        privateKeySecretRef:
          name: letsencrypt-prod
        server: https://acme-v02.api.letsencrypt.org/directory
        solvers:
        - http01:
            ingress:
              ingressClassName: istio

    Sumber daya Penerbit di atas menentukan Solver tipe http01. Akses API Ingress diaktifkan, dan nilai bidang ingressClassName adalah istio. Langkah-langkah berikut menjelaskan bagaimana Solver ini berlaku.

    Catatan

    cert-manager mendukung dua jenis Solver: API Ingress dan API Gateway. ASM juga mendukung kedua API ini. Dalam contoh ini, API Ingress digunakan.

  2. Tunggu hingga sumber daya Penerbit siap. Jalankan perintah berikut untuk memeriksa status sumber daya Penerbit:

    kubectl -n istio-system get issuer letsencrypt-prod-issuer

    Output yang Diharapkan:

    NAME                      READY   AGE
    letsencrypt-prod-issuer   True    8m3s

Langkah 3: Terbitkan sertifikat untuk gateway ingress ASM

  1. Gunakan file kubeconfig kluster ACK pada bidang data plane yang Anda tambahkan ke instance ASM, lalu buat sumber daya yang ditampilkan dalam blok kode berikut:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: istio-ingressgateway-certs
      namespace: istio-system
    spec:
      dnsNames:
      - ${Test domain} # test.com
      issuerRef:
        group: cert-manager.io
        kind: Issuer
        name: letsencrypt-prod-issuer
      secretName: istio-ingressgateway-certs
  2. Tunggu hingga sumber daya Sertifikat siap. Jalankan perintah berikut untuk memeriksa status sumber daya Sertifikat:

    kubectl -n istio-system get certificate istio-ingressgateway-certs

    Output yang Diharapkan:

    NAME                         READY   SECRET                       AGE
    istio-ingressgateway-certs   True    istio-ingressgateway-certs   59m

Proses penerbitan sertifikat

Setelah Anda membuat sumber daya Sertifikat, cert-manager menggunakan sumber daya Penerbit yang dibuat untuk menerbitkan sertifikat untuk domain yang Anda tentukan dalam sumber daya Sertifikat. Selama proses ini, Solver yang dikonfigurasi mulai berlaku.

Let's Encrypt memulai tantangan HTTP-01 untuk memvalidasi bahwa server saat ini adalah pemilik domain yang Anda tentukan dalam sertifikat. Untuk melakukan ini, Let's Encrypt mengirimkan permintaan HTTP ke domain tersebut. Permintaan ini harus mendapatkan respons yang valid sebelum dapat memvalidasi kepemilikan domain. Dalam contoh ini, hanya aturan routing HTTPBin yang dikonfigurasikan pada gateway ingress ASM. Tidak ada konfigurasi terkait tantangan yang dikonfigurasikan untuk gateway ingress ASM. Apakah Let's Encrypt mengirimkan permintaan validasi tantangan? Bagaimana permintaan tersebut direspons?

Anda dapat menjalankan perintah berikut untuk melihat log akses gateway ingress ASM. Kemudian, Anda dapat menentukan apakah Let's Encrypt mengirimkan permintaan validasi tantangan ke gateway ingress ASM:

kubectl -n istio-system logs ${Nama pod gateway ingress ASM} | grep letsencrypt | tail -1

Tampilkan Output yang Diharapkan

{

    "authority_for": "xxxxxxx",

    "bytes_received": "0",

    "bytes_sent": "87",

    "downstream_local_address": "xx.xx.xx.xx:80",

    "downstream_remote_address": "xx.xx.xx.xx:57101",

    "duration": "0",

    "istio_policy_status": "-",

    "method": "GET",

    "path": "/.well-known/acme-challenge/JfKvfdSNmkR7UqmCQU0OSkJC3EsnP4ZUiCc28OLLLxA",

    "protocol": "HTTP/1.1",

    "request_id": "e6806d08-0469-4383-be8e-4d7506b39ec5",

    "requested_server_name": "-",

    "response_code": "200",

    "response_flags": "-",

    "route_name": "-",

    "start_time": "2024-04-08T12:04:06.153Z",

    "trace_id": "-",

    "upstream_cluster": "outbound|8089||cm-acme-http-solver-c4ch9.istio-system.svc.cluster.local",

    "upstream_host": "xx.xx.xx.xx:8089",

    "upstream_local_address": "xx.xx.xx.xx:55886",

    "upstream_response_time": "0",

    "upstream_service_time": "0",

    "upstream_transport_failure_reason": "-",

    "user_agent": "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)",

    "x_forwarded_for": "xx.xx.xx.xx"

}

Output tersebut menunjukkan bahwa Let's Encrypt mengirimkan permintaan validasi tantangan ke gateway ingress ASM, dan permintaan tersebut berhasil direspons. Dalam sumber daya Penerbit, bidang ingressClassName diatur ke istio. Oleh karena itu, cert-manager secara otomatis membuat sumber daya Ingress yang ingressClassName-nya adalah istio dan meneruskan permintaan validasi tantangan ke Solver cert-manager untuk menyelesaikan validasi kepemilikan domain.

Setelah sumber daya Sertifikat siap, Anda tidak dapat melihat sumber daya Ingress terkait dengan menjalankan perintah kubectl -n istio-system get ingress. Alasannya adalah setelah sertifikat diterbitkan, cert-manager secara otomatis menghapus sumber daya terkait Solver, seperti sumber daya Ingress, Service, dan Deployment.

Langkah 4: Verifikasi sertifikat yang diterbitkan oleh Let's Encrypt

  1. Buat gateway Istio yang ditampilkan dalam blok kode berikut. Konfigurasikan sertifikat yang dihasilkan di Langkah 3 pada port 443 gateway ingress ASM. Untuk informasi lebih lanjut, lihat Kelola Gateway Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: httpbin-https
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - ${Test domain}
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          credentialName: istio-ingressgateway-certs
          mode: SIMPLE
  2. Ubah layanan virtual httpbin-vs asli menjadi konten yang ditampilkan dalam blok kode berikut. Untuk informasi lebih lanjut, lihat Kelola Layanan Virtual.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: httpbin-vs
      namespace: default
    spec:
      gateways:
        - httpbin
        -httpbin-https # Tambahkan baris ini.
      hosts:
        - '*'
      http:
        - name: test
          route:
            - destination:
                host: httpbin.default.svc.cluster.local
                port:
                  number: 8000
  3. Masukkan https://${Test domain} di bilah alamat browser Anda.

    Bilah alamat browser Anda akan mirip dengan gambar berikut. Klik ikon image. Koneksi Aman ditampilkan, menunjukkan bahwa browser telah mempercayai sertifikat Anda.

    image