Что такое самоподписанный сертификат?

Самоподписанный сертификат — это TLS/SSL-сертификат, который подписан тем же субъектом, чья личность удостоверяется. В отличие от сертификатов, выданных Центрами Сертификации (CA), самоподписанные сертификаты по умолчанию не доверяются браузерами и клиентами.

Когда использовать самоподписанные сертификаты

  • Среды разработки
  • Внутренние тестовые и staging-системы
  • Внутрисетевые сервисы, например, в Kubernetes

⚠️ Не используйте самоподписанные сертификаты в продакшене, если сервис доступен из интернета.

Как сгенерировать самоподписанный сертификат с помощью OpenSSL

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out cert.pem -days 365 -subj "/CN=my-service.local"

Создастся два файла:

  • key.pem: приватный ключ
  • cert.pem: самоподписанный сертификат

Использование самоподписанных сертификатов в Kubernetes

  1. Создайте TLS-секрет:
kubectl create secret tls my-tls-secret --key key.pem --cert cert.pem
  1. Используйте в Ingress или в поде:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
    - hosts:
        - my-service.local
      secretName: my-tls-secret
  rules:
    - host: my-service.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80

Доверие к самоподписанному сертификату

Сертификат нужно вручную установить как доверенный на клиенте:

curl --cacert cert.pem https://my-service.local

Или добавить его в хранилище доверенных сертификатов системы.

Заключение

Самоподписанные сертификаты — удобный способ зашифровать внутреннее взаимодействие между сервисами. Особенно актуально в Kubernetes или при локальной разработке. Главное — понимать ограничения в доверии.