コンテンツにスキップ

SSL/TLS証明書

KanjiIQは、自動TLS証明書のプロビジョニングと更新にcert-managerとLet's Encryptを使用しています。

仕組み

sequenceDiagram
    participant I as Ingress Resource
    participant CM as cert-manager
    participant LE as Let's Encrypt
    participant T as Traefik
    participant S as K8s Secret

    I->>CM: New Ingress with cert-manager annotation
    CM->>LE: Request certificate (ACME HTTP-01)
    LE->>T: HTTP-01 challenge request
    T->>LE: Challenge response
    LE->>CM: Certificate issued
    CM->>S: Store as TLS Secret
    T->>S: Read certificate
    Note over T: HTTPS now active
    CM->>CM: Monitor expiry (auto-renew at 30 days)

ClusterIssuer

Let's Encrypt本番環境用にクラスター全体のissuerが設定されています:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            class: traefik

証明書のリクエスト

任意のIngressリソースが単一のアノテーションを追加するだけでTLS証明書をリクエストできます:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - kanjiiq.com
        - api.kanjiiq.com
      secretName: kanjiiq-tls  # cert-manager creates this

cert-managerはそのアノテーションを持つIngressリソースを監視し、自動的に以下を行います:

  1. Certificateリソースを作成
  2. Traefik経由でACME HTTP-01チャレンジを実行
  3. 発行された証明書を指定されたSecretに保存
  4. 有効期限の30日前に更新

現在の証明書

Secret名 ドメイン Ingress
kanjiiq-tls kanjiiq.com, www.kanjiiq.com, api.kanjiiq.com, admin.kanjiiq.com ingress-kanjiiq.yaml
kanjiiq-docs-tls docs.kanjiiq.app ingress-docs.yaml

トラブルシューティング

証明書の状態を確認:

# List all certificates
kubectl get certificates -n jlpt-kanji

# Check certificate details
kubectl describe certificate kanjiiq-tls -n jlpt-kanji

# Check cert-manager logs
kubectl logs -n cert-manager deploy/cert-manager

# View certificate challenges in progress
kubectl get challenges -n jlpt-kanji

よくある問題:

  • チャレンジの失敗:DNS AレコードがサーバーIPを指しており、ポート80がアクセス可能であることを確認
  • レート制限:Let's Encryptにはドメインごとに週50証明書の制限があります
  • Secretが作成されない:cert-managerのログでACMEエラーを確認