تخطَّ إلى المحتوى

Add Jetstack Helm repository

منصةأمر
kubectl (Static Manifests)kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.yaml
Helm (Recommended)helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
macOS (cmctl CLI)brew install cmctl
Linux (cmctl CLI)`curl -sSL https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cmctl-linux-amd64.tar.gz \
Windows (cmctl CLI)curl.exe -L -o cmctl.exe https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cmctl-windows-amd64.exe
Verify Installationkubectl get pods -n cert-manager
# Add Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io

# Update repository
helm repo update

# Install with custom values
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.13.3 \
  --values custom-values.yaml
```## التثبيت

| أمر | وصف |
|---------|-------------|
| `kubectl get certificates` | اسرد جميع الشهادات في المساحة الحالية |
| `kubectl get certificates -A` | قائمة الشهادات عبر جميع مساحات الأسماء |
| `kubectl describe certificate <name>` | عرض معلومات الشهادة بالتفصيل |
| `kubectl get certificate <name> -o yaml` | عرض الشهادة بتنسيق YAML |
| `kubectl get issuer` | قائمة بجميع المصدرين في المساحة الحالية |
| `kubectl get clusterissuer` | قائمة جميع المُصدِرين على مستوى العنقود |
| `kubectl describe issuer <name>` | عرض معلومات المُصدِر بالتفصيل |
| `kubectl get certificaterequest` | قائمة طلبات الشهادات |
| `kubectl get order` | عرض طلبات شهادة ACME |
| `kubectl get challenge` | عرض تحديات ACME للتحقق من المجال |
| `kubectl logs -n cert-manager deployment/cert-manager` | عرض سجلات وحدة التحكم cert-manager |
| `kubectl logs -n cert-manager deployment/cert-manager-webhook` | عرض سجلات webhook |
| `kubectl logs -n cert-manager deployment/cert-manager-cainjector` | عرض سجلات CA injector |
| `cmctl check api` | تحقق من توفر واجهة برمجة التطبيقات الخاصة بـ cert-manager |
| `cmctl version` | عرض معلومات إصدار cert-manager |
| `cmctl status certificate <name>` | تحقق من حالة الشهادة وجاهزيتها |
| `cmctl inspect secret <secret-name>` | افحص سر TLS الذي تم إنشاؤه بواسطة cert-manager |
| `cmctl renew <cert-name>` | تشغيل تجديد الشهادة يدويًا |
| `kubectl get crd \ | grep cert-manager` | قم بسرد جميع تعريفات الموارد المخصصة (CRDs) لـ cert-manager |
| `kubectl get events --field-selector involvedObject.name=<cert-name>` | عرض الأحداث المتعلقة بشهادة محددة |### إعداد مستودع Helm

| أمر | وصف |
|---------|-------------|
| `cmctl approve <certificaterequest-name>` | الموافقة يدويًا على طلب شهادة |
| `cmctl deny <certificaterequest-name>` | رفض طلب شهادة |
| `cmctl create certificaterequest test --from-certificate-file=cert.yaml` | إنشاء طلب شهادة من ملف |
| `cmctl convert --output-format=pem --input-file=cert.yaml` | تحويل الشهادة إلى تنسيق PEM |
| `cmctl experimental create acmeaccount --server=<url> --email=<email>` | اختبار تسجيل حساب ACME |
| `kubectl annotate certificate <name> cert-manager.io/issue-temporary-certificate="true" --overwrite` | فرض التجديد الفوري للشهادة |
| `kubectl delete certificaterequest <name>` | إزالة طلب الشهادة الفاشل |
| `kubectl delete order <name>` | احذف طلب ACME |
| `kubectl delete challenge <name>` | قم بإزالة تحدي ACME العالق |
| `kubectl get certificate <name> -o jsonpath='{.status.conditions}'` | استخراج حالات حالة الشهادة |
| `kubectl get secret <tls-secret> -o jsonpath='{.data.tls\.crt}' \ | base64 -d \ | openssl x509 -text -noout` | فك تشفير وعرض تفاصيل الشهادة |
| `kubectl get secret <tls-secret> -o jsonpath='{.data.tls\.crt}' \ | base64 -d \ | openssl x509 -noout -dates` | تحقق من تواريخ انتهاء الشهادات |
| `helm upgrade cert-manager jetstack/cert-manager --namespace cert-manager --version v1.13.3` | قم بترقية cert-manager إلى الإصدار الجديد |
| `kubectl rollout restart deployment -n cert-manager` | أعد تشغيل جميع مكونات cert-manager |
| `kubectl scale deployment cert-manager -n cert-manager --replicas=2` | قم بتوسيع cert-manager للتوافر العالي |
| `kubectl get certificate --watch` | تتبع التغيرات في حالة الشهادة في الوقت الفعلي |
| `kubectl patch certificate <name> --type merge -p '{"spec":{"renewBefore":"720h"}}'` | تعديل نافذة تجديد الشهادة |
| `kubectl delete secret <tls-secret>` | حذف سر الشهادة (يؤدي إلى إعادة الإنشاء) |
| `cmctl experimental install` | قم بتثبيت cert-manager باستخدام أداة cmctl |
| `cmctl experimental uninstall` | قم بإلغاء تثبيت cert-manager وتنظيف الموارد |
```yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsigned-issuer
spec:
  selfSigned: {}
```## الأوامر الأساسية
```yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
    - http01:
        ingress:
          class: nginx
```## الاستخدام المتقدم
```yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - dns01:
        cloudDNS:
          project: my-gcp-project
          serviceAccountSecretRef:
            name: clouddns-dns01-solver
            key: key.json
```## التكوين
```yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-issuer
  namespace: default
spec:
  ca:
    secretName: ca-key-pair
```### ClusterIssuer موقّع ذاتي
```yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com
  namespace: default
spec:
  secretName: example-com-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - example.com
  - www.example.com
  duration: 2160h      # 90 days
  renewBefore: 360h    # 15 days before expiry
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-cert
  namespace: default
spec:
  secretName: wildcard-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - "*.example.com"
  - example.com
```### Let's Encrypt المرحلة التجريبية (تحدي HTTP-01)
```yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: vault-issuer
  namespace: default
spec:
  vault:
    server: https://vault.example.com
    path: pki/sign/example-dot-com
    auth:
      kubernetes:
        mountPath: /v1/auth/kubernetes
        role: cert-manager
        secretRef:
          name: vault-token
          key: token
# custom-values.yaml
installCRDs: true
replicaCount: 2

resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 200m
    memory: 256Mi

prometheus:
  enabled: true
  servicemonitor:
    enabled: true

webhook:
  replicaCount: 2

cainjector:
  replicaCount: 2
```### Let's Encrypt الإنتاج (تحدي DNS-01)
```bash
# Create ClusterIssuer
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

# Create Ingress with TLS annotation
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - example.com
    secretName: example-com-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
EOF

# Verify certificate creation
kubectl get certificate
kubectl describe certificate example-com-tls
# Create self-signed CA
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsigned-issuer
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: my-ca
  namespace: cert-manager
spec:
  isCA: true
  commonName: my-ca
  secretName: my-ca-secret
  privateKey:
    algorithm: ECDSA
    size: 256
  issuerRef:
    name: selfsigned-issuer
    kind: ClusterIssuer
EOF

# Create CA issuer from generated CA
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: my-ca-issuer
spec:
  ca:
    secretName: my-ca-secret
EOF

# Issue service certificates
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: service-a-cert
  namespace: default
spec:
  secretName: service-a-tls
  duration: 8760h
  renewBefore: 720h
  subject:
    organizations:
    - my-org
  commonName: service-a.default.svc.cluster.local
  dnsNames:
  - service-a.default.svc.cluster.local
  issuerRef:
    name: my-ca-issuer
    kind: ClusterIssuer
EOF
```### موقّع CA (PKI داخلي)
```bash
# Create DNS provider secret (example: Cloudflare)
kubectl create secret generic cloudflare-api-token \
  --from-literal=api-token=YOUR_CLOUDFLARE_API_TOKEN

# Create ClusterIssuer with DNS-01 solver
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-dns
    solvers:
    - dns01:
        cloudflare:
          email: admin@example.com
          apiTokenSecretRef:
            name: cloudflare-api-token
            key: api-token
EOF

# Request wildcard certificate
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-example
  namespace: default
spec:
  secretName: wildcard-example-tls
  issuerRef:
    name: letsencrypt-dns
    kind: ClusterIssuer
  dnsNames:
  - "*.example.com"
  - example.com
EOF

# Monitor certificate issuance
kubectl get certificate wildcard-example -w
# Create certificate for webhook
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: webhook-cert
  namespace: webhook-system
spec:
  secretName: webhook-server-cert
  duration: 8760h
  renewBefore: 720h
  issuerRef:
    name: selfsigned-issuer
    kind: ClusterIssuer
  dnsNames:
  - webhook-service.webhook-system.svc
  - webhook-service.webhook-system.svc.cluster.local
EOF

# Reference in webhook configuration
kubectl apply -f - <<EOF
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-webhook
  annotations:
    cert-manager.io/inject-ca-from: webhook-system/webhook-cert
webhooks:
- name: webhook.example.com
  clientConfig:
    service:
      name: webhook-service
      namespace: webhook-system
      path: "/validate"
    caBundle: "" # Injected by cert-manager
EOF
```### مورد الشهادة
```bash
# Create certificate with short duration for testing
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: short-lived-cert
  namespace: default
spec:
  secretName: short-lived-tls
  duration: 24h
  renewBefore: 8h
  issuerRef:
    name: selfsigned-issuer
    kind: ClusterIssuer
  dnsNames:
  - test.example.com
EOF

# Monitor renewal
kubectl get certificate short-lived-cert -w

# Force immediate renewal
kubectl annotate certificate short-lived-cert \
  cert-manager.io/issue-temporary-certificate="true" \
  --overwrite

# Check renewal history
kubectl get certificaterequest -l cert-manager.io/certificate-name=short-lived-cert

# Verify new certificate
cmctl inspect secret short-lived-tls

renewBefore### شهادة Wildcard certmanager_certificate_expiration_timestamp_seconds

  • استخدم DNS-01 للخدمات العامة والداخلية: يُطلب تحدي DNS-01 للشهادات العامة ويعمل بشكل أفضل للخدمات غير المعروضة على الإنترنت

  • تطبيق RBAC بشكل صحيح: تقييد الوصول إلى Issuers وأسرار الشهادات باستخدام RBAC الخاص بـ Kubernetes لمنع إنشاء الشهادات غير المصرح بها

  • وضع التكوينات تحت التحكم بالإصدارات: تخزين manifests الشهادات والإصدارات في Git لتتبع التغييرات وتمكين سير عمل GitOps

  • استخدام إصدارات منفصلة لكل بيئة: إنشاء إصدارات مختلفة للتطوير/الاختبار/الإنتاج لعزل بيانات الاعتماد ومنع مشاكل الشهادات بين البيئات

  • تمكين حقن CA للwebhooks: استخدم cert-manager.io/inject-ca-fromالتعليق التوضيحي لحقن CA بشكل تلقائي في تكوينات webhook

مشكلةحل
Certificate stuck in “Pending”Check certificate request: kubectl describe certificaterequest <name>. Look for ACME challenge failures or issuer configuration errors
ACME HTTP-01 challenge failingVerify ingress is accessible: curl http://<domain>/.well-known/acme-challenge/test. Check ingress class matches solver configuration
DNS-01 challenge timeoutConfirm DNS provider credentials: kubectl get secret <dns-secret> -o yaml. Verify DNS propagation: dig TXT _acme-challenge.<domain>
”Too many certificates” rate limitانتقل إلى خادم Let’s Encrypt التجريبي أو انتظر 7 أيام. تحقق من حدود المعدل: https://letsencrypt.org/docs/rate-limits/
Certificate not renewing automaticallyCheck renewBefore setting and cert-manager logs: kubectl logs -n cert-manager deployment/cert-manager. Verify controller is running
Webhook connection failuresVerify webhook service is running: kubectl get svc -n cert-manager. Check webhook certificate validity: cmctl check api
CA injection not workingEnsure cainjector is running: kubectl get pods -n cert-manager. Verify annotation syntax: cert-manager.io/inject-ca-from: namespace/certificate
Certificate shows “Ready=False”Get detailed status: cmctl status certificate <name>. Check events: kubectl get events --field-selector involvedObject.name=<cert-name>
Order stuck in “Pending”Delete order to retry: kubectl delete order <order-name>. Certificate controller will create new order automatically
Secret not created after certificate readyCheck secret name matches secretName in Certificate spec. Verify namespace: kubectl get secret <name> -n <namespace>
Wildcard certificate validation failsتأكد من تكوين حل DNS-01 (HTTP-01 لا يدعم الwildcards). تحقق من أذونات مزود DNS لإنشاء سجل TXT
Certificate shows wrong issuerDelete certificate request: kubectl delete certificaterequest <name>. Update Certificate spec with correct issuerRef
High memory usageReduce certificate count or increase resources: kubectl set resources deployment cert-manager -n cert-manager --limits=memory=512Mi
Duplicate certificates createdCheck for multiple Certificate resources with same secretName. Remove duplicates to prevent conflicts
ACME account registration failsتحقق من تنسيق البريد الإلكتروني في مواصفات المُصدِر. تأكد من صحة عنوان URL لخادم ACME. راجع سجلات cert-manager للحصول على رسائل الخطأ المفصلة
# Complete troubleshooting workflow
kubectl describe certificate <cert-name>
kubectl get certificaterequest -l cert-manager.io/certificate-name=<cert-name>
kubectl describe certificaterequest <request-name>
kubectl get order
kubectl describe order <order-name>
kubectl get challenge
kubectl describe challenge <challenge-name>
kubectl logs -n cert-manager deployment/cert-manager --tail=100
```### أنماط السجلات الشائعة```bash
# Search for specific certificate errors
kubectl logs -n cert-manager deployment/cert-manager | grep "certificate=<cert-name>"

# Find ACME challenge errors
kubectl logs -n cert-manager deployment/cert-manager | grep "challenge"

# Check for rate limit errors
kubectl logs -n cert-manager deployment/cert-manager | grep "rate limit"

# Monitor certificate renewal attempts
kubectl logs -n cert-manager deployment/cert-manager -f | grep "renewal"