CertificateSigningRequest
apiVersion: certificates.k8s.io/v1
import "k8s.io/api/certificates/v1"
CertificateSigningRequest
Объекты CertificateSigningRequest предоставляют механизм получения сертификатов x509 путём отправки запроса на подписание сертификата и его асинхронного утверждения и выдачи.
Kubelet используют этот API для получения:
- клиентских сертификатов для аутентификации с kube-apiserver (с signerName "kubernetes.io/kube-apiserver-client-kubelet").
- сервисных сертификатов для TLS-точек входа, к которым kube-apiserver может подключаться безопасно (с signerName "kubernetes.io/kubelet-serving").
Этот API может быть использован для запроса клиентских сертификатов для аутентификации с kube-apiserver (с signerName "kubernetes.io/kube-apiserver-client") или для получения сертификатов от пользовательских не-Kubernetes подписчиков.
-
apiVersion: certificates.k8s.io/v1
-
kind: CertificateSigningRequest
-
metadata (ObjectMeta)
-
spec (CertificateSigningRequestSpec), обязательно
spec содержит запрос на сертификат и является неизменяемым после создания. Только поля request, signerName, expirationSeconds и usages могут быть установлены при создании. Другие поля вычисляются Kubernetes и не могут быть изменены пользователями.
-
status (CertificateSigningRequestStatus)
status содержит информацию о том, утверждён ли запрос или отклонен, выданный сертификат подписчиком или условие ошибки, указывающее на неудачу подписчика.
CertificateSigningRequestSpec
CertificateSigningRequestSpec содержит запрос на сертификат.
-
request ([]byte), обязательно
Атомарно: будет заменён при слиянии
request содержит запрос на подписание x509-сертификата, закодированный в блоке PEM "CERTIFICATE REQUEST". При сериализации в JSON или YAML данные дополнительно кодируются в base64.
-
signerName (строка), обязательно
signerName указывает запрашиваемого подписчика и представляет собой полное имя.
Запросы list/watch для CertificateSigningRequests могут фильтроваться по этому полю с помощью fieldSelector "spec.signerName=NAME".
Известные подписчики Kubernetes:
- "kubernetes.io/kube-apiserver-client": выдает клиентские сертификаты, которые могут быть использованы для аутентификации с kube-apiserver. Запросы для этого подписчика никогда не утверждаются автоматически kube-controller-manager, могут выдаваться контроллером "csrsigning" в kube-controller-manager.
- "kubernetes.io/kube-apiserver-client-kubelet": выдает клиентские сертификаты, которые kubelet используют для аутентификации с kube-apiserver. Запросы для этого подписчика могут быть автоматически утверждены контроллером "csrapproving" в kube-controller-manager и могут выдаваться контроллером "csrsigning" в kube-controller-manager.
- "kubernetes.io/kubelet-serving" выдает сервисные сертификаты, которые kubelet используют для обслуживания TLS-точек входа, к которым kube-apiserver может подключаться безопасно. Запросы для этого подписчика никогда не утверждаются автоматически kube-controller-manager, и могут выдаваться контроллером "csrsigning" в kube-controller-manager.
Более подробная информация доступна по адресу https://k8s.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers
Также могут быть указаны пользовательские signerName. Подписчик определяет:
- Распределение доверия: как распределяются сертификаты доверия (CA-пакеты).
- Разрешённые субъекты: и поведение при запросе запрещённого субъекта.
- Требуемые, разрешённые или запрещённые расширения x509 в запросе (включая разрешение subjectAltNames, типы, ограничения на разрешённые значения) и поведение при запросе запрещённого расширения.
- Требуемые, разрешённые или запрещённые ключи использования/расширенные ключи использования.
- Срок действия/срок действия сертификата: фиксируется ли он подписчиком, настраивается ли администратором.
- Разрешён ли запрос сертификатов CA.
-
expirationSeconds (int32)
expirationSeconds — запрашиваемая продолжительность действия выданного сертификата. Подписывающий сертификат может выдать сертификат с другим сроком действия, поэтому клиент должен проверить разницу между полями notBefore и notAfter в выданном сертификате, чтобы определить фактическую продолжительность.
Реализации хорошо известных подписчиков Kubernetes в v1.22+ будут учитывать это поле, при условии, что запрашиваемая продолжительность не превышает максимальной продолжительности, которую они будут учитывать в соответствии со флагом командной строки --cluster-signing-duration для управляющего компонента Kubernetes.
Подписывающие сертификаты могут не учитывать это поле по разным причинам:
- Старый подписчик, не знающий о поле (например, реализации в tree до v1.22)
- Подписчик, чьё максимальное значение короче, чем запрашиваемая продолжительность
- Подписчик, чьё минимальное значение длиннее, чем запрашиваемая продолжительность
Минимальное допустимое значение для expirationSeconds составляет 600, т. е. 10 минут.
-
extra (map[string][]string)
extra содержит дополнительные атрибуты пользователя, создавшего CertificateSigningRequest. Заполняется API-сервером при создании и неизменяемо.
-
groups ([]string)
Атомарно: будет заменён при слиянии
groups содержит членство в группах пользователя, создавшего CertificateSigningRequest. Заполняется API-сервером при создании и неизменяемо.
-
uid (строка)
uid содержит uid пользователя, создавшего CertificateSigningRequest. Заполняется API-сервером при создании и неизменяемо.
-
usages ([]string)
Атомарно: будет заменён при слиянии
usages задаёт набор запрошенных типов использования ключа в выданном сертификате.
Запросы клиентских сертификатов TLS обычно запрашивают: "цифровая подпись", "шифрование ключом", "клиентская аутентификация".
Запросы сервисных сертификатов TLS обычно запрашивают: "шифрование ключом", "цифровая подпись", "серверная аутентификация".
Допустимые значения: "signing", "digital signature", "content commitment", "key encipherment", "key agreement", "data encipherment", "cert sign", "crl sign", "encipher only", "decipher only", "any", "server auth", "client auth", "code signing", "email protection", "s/mime", "ipsec end system", "ipsec tunnel", "ipsec user", "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"
-
username (строка)
username содержит имя пользователя, создавшего CertificateSigningRequest. Заполняется API-сервером при создании и неизменяемо.
CertificateSigningRequestStatus
CertificateSigningRequestStatus содержит условия, используемые для указания статуса запроса (утверждён/отклонен/неудался) и выданного сертификата.
-
certificate ([]byte)
Атомарно: будет заменён при слиянии
certificate заполняется выданным сертификатом подписчиком после добавления условия Approved. Это поле устанавливается с помощью подресурса /status. После заполнения это поле неизменяемо.
Если запрос на подписание сертификата отклонен, добавляется условие типа "Denied", а это поле остаётся пустым. Если подписчик не может выдать сертификат, добавляется условие типа "Failed", а это поле остаётся пустым.
Требования к валидации:
- certificate должен содержать один или несколько блоков PEM.
- Все блоки PEM должны иметь метку "CERTIFICATE", не содержать заголовков, а закодированные данные должны представлять собой структуру BER-кодированного ASN.1 Certificate, как описано в разделе 4 RFC5280.
- Содержание, не являющееся PEM, может появляться до или после блоков PEM "CERTIFICATE" и не проверяется, чтобы позволить поясняющий текст, как описано в разделе 5.2 RFC7468.
Если присутствует более одного блока PEM, и определение запрошенного spec.signerName не указывает иного, то первый блок является выданным сертификатом, а последующие блоки следует рассматривать как промежуточные сертификаты и представлять их в TLS-обмене.
Сертификат закодирован в формате PEM.
При сериализации в JSON или YAML данные дополнительно кодируются в base64, поэтому они состоят из:
base64( -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ) -
conditions ([]CertificateSigningRequestCondition)
Map: уникальные значения ключа type будут сохранены при слиянии
Установленные условия для запроса. Известные условия — "Approved", "Denied" и "Failed".
CertificateSigningRequestCondition описывает состояние объекта CertificateSigningRequest
-
conditions.status (строка), обязательно
статус условия, одно из True, False, Unknown. Условия Approved, Denied и Failed не могут быть "False" или "Unknown".
-
conditions.type (строка), обязательно
тип условия. Известные условия — "Approved", "Denied" и "Failed".
Условие "Approved" добавляется через подресурс /approval, указывая, что запрос утверждён и должен быть выдан подписчиком.
Условие "Denied" добавляется через подресурс /approval, указывая, что запрос отклонен и не должен быть выдан подписчиком.
Условие "Failed" добавляется через подресурс /status, указывая, что подписчик не смог выдать сертификат.
Условия Approved и Denied взаимно исключают друг друга. Условия Approved, Denied и Failed нельзя удалить после добавления.
Допускается только одно условие заданного типа.
-
conditions.lastTransitionTime (Time)
lastTransitionTime — время последнего перехода условия из одного состояния в другое. Если не задано, при добавлении нового типа условия или изменении состояния существующего условия сервер устанавливает его по умолчанию на текущее время.
Time — обертка вокруг time.Time, поддерживающая корректную сериализацию в YAML и JSON. Обёртки предоставляются для многих фабричных методов, которые предоставляет пакет time.
-
conditions.lastUpdateTime (Time)
lastUpdateTime — время последнего обновления этого условия
Time — обертка вокруг time.Time, поддерживающая корректную сериализацию в YAML и JSON. Обёртки предоставляются для многих фабричных методов, которые предоставляет пакет time.
-
conditions.message (строка)
message содержит удобочитаемое сообщение с подробностями о состоянии запроса
-
conditions.reason (строка)
reason указывает краткое объяснение состояния запроса
-
CertificateSigningRequestList
CertificateSigningRequestList — коллекция объектов CertificateSigningRequest
-
apiVersion: certificates.k8s.io/v1
-
kind: CertificateSigningRequestList
-
metadata (ListMeta)
-
items ([]CertificateSigningRequest), required
items — коллекция объектов CertificateSigningRequest
© 2022 The Kubernetes Authors | Documentation Distributed under CC BY 4.0
Copyright © 2022 The Linux Foundation ®. All rights reserved.
https://v1-24.docs.kubernetes.io/docs/reference/kubernetes-api/authentication-resources/certificate-signing-request-v1/