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 могут фильтроваться по этому полю, используя поле выбора "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" выдает сертификаты для предоставления TLS-точек доступа, к которым kube-apiserver может безопасно подключаться. Запросы для этого подписчика никогда не одобряются автоматически kube-controller-manager и могут быть выданы контроллером "csrsigning" в kube-controller-manager.
Более подробная информация доступна по адресу https://k8s.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers
Также могут быть указаны пользовательские signerNames. Подписчик определяет:
- Распределение доверия: как распределяются пакеты доверия (CA).
- Разрешенные субъекты: и поведение при запросе запрещённого субъекта.
- Требуемые, разрешенные или запрещенные расширения x509 в запросе (включая разрешение subjectAltNames, типы, ограничения на допустимые значения) и поведение при запросе запрещенного расширения.
- Требуемые, разрешенные или запрещенные ключевые использования/расширенные ключевые использования.
- Срок действия/жизнь сертификата: является ли он фиксированным подписчиком, настраиваемым администратором.
- Разрешены ли запросы на сертификаты CA.
-
expirationSeconds (int32)
expirationSeconds — запрашиваемая продолжительность действия выданного сертификата. Подписывающий сертификат может выдать сертификат с другим сроком действия, поэтому клиент должен проверить разницу между полями notBefore и notAfter в выданном сертификате, чтобы определить фактическую продолжительность.
Реализации известных подписчиков Kubernetes в v1.22+ будут учитывать это поле, если запрашиваемая продолжительность не превышает максимальную продолжительность, которую они будут учитывать в соответствии с флагом командной строки --cluster-signing-duration для менеджера контроллера Kubernetes.
Подписывающие сертификаты могут не учитывать это поле по разным причинам:
- Старый подписчик, не знающий о поле (например, реализации в дереве до 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", не содержать заголовков, а закодированные данные должны быть структурой ASN.1 сертификата BER, закодированной в соответствии с разделом 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
© 2024 The Kubernetes Authors | Documentation Distributed under CC BY 4.0
Copyright © 2024 The Linux Foundation ®. All rights reserved.
https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/certificate-signing-request-v1/