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リソースを監視し、自動的に以下を行います:
- Certificateリソースを作成
- Traefik経由でACME HTTP-01チャレンジを実行
- 発行された証明書を指定されたSecretに保存
- 有効期限の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エラーを確認