# Випуск сертифіката для клієнта Kubernetes API за допомогою CertificateSigningRequest

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

Kubernetes дозволяє використовувати інфраструктуру відкритих ключів (PKI) для автентифікації у кластері в якості клієнта.

Для того, щоб звичайний користувач міг автентифікуватися і викликати API, потрібно виконати кілька кроків. По-перше, цей користувач повинен мати сертифікат [X.509](https://www.itu.int/rec/T-REC-X.509), виданий органом, якому довіряє ваш кластер Kubernetes. Потім клієнт повинен предʼявити цей сертифікат API Kubernetes.

Ви використовуєте запит [CertificateSigningRequest](/docs/reference/access-authn-authz/certificate-signing-requests/) як частину цього процесу; ви або інша довірена особа маєте схвалити запит.

Ви створите приватний ключ, а потім отримаєте виданий сертифікат і, нарешті, налаштуєте цей приватний ключ для клієнта.

## Перш ніж ви розпочнете

* <p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>


* Вам знадобляться утиліти `kubectl`, `openssl` та `base64`.

Ця сторінка передбачає, що ви використовуєте Kubernetes <a class='glossary-tooltip' title='Управління рішеннями з авторизації, яке дозволяє адміністраторам динамічно налаштовувати політики доступу через API Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/access-authn-authz/rbac/' target='_blank' aria-label='контроль доступу на основі ролей'>контроль доступу на основі ролей</a> (RBAC). Якщо ви використовуєте альтернативні або додаткові механізми безпеки для авторизації, вам також потрібно врахувати їх.

<!-- steps -->

## Створення приватного ключа {#create-private-key}

На цьому кроці ви створюєте приватний ключ. Ви повинні тримати цей приватний ключ в таємниці; будь-хто, хто його має, може видавати себе за користувача.

```shell
# Створіть приватний ключ
openssl genrsa -out myuser.key 3072
```

## Створіть запит на підписання сертифіката X.509 {#create-x.509-certificatessigningrequest}


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Це не те саме, що API CertificateSigningRequest з подібною назвою; файл, який ви генеруєте тут, входить до CertificateSigningRequest.</div>


Важливо встановити атрибути CN та O для CSR. CN — це імʼя користувача, а O — група, до якої цей користувач буде належати. Ви можете ознайомитися з [RBAC](/docs/reference/access-authn-authz/rbac/) для отримання інформації про стандартні групи.

```shell
# Змініть загальне імʼя "myuser" на фактичне імʼя користувача, яке ви хочете використовувати
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"
```

## Створіть CertificateSigningRequest Kubernetes {#create-k8s-certificatessigningrequest}

Закодуйте документ CSR, використовуючи цю команду:

```shell
cat myuser.csr | base64 | tr -d "\n"
```

Створіть [CertificateSigningRequest](/docs/reference/kubernetes-api/authentication-resources/certificate-signing-request-v1/) та надішліть його до кластера Kubernetes через kubectl. Нижче наведено уривок коду оболонки, який ви можете використати для генерації CertificateSigningRequest.

```shell
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser # example
spec:
  # Це закодований CSR. Змініть його на вміст myuser.csr у кодуванні base64
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth
EOF
```

Ви також можете створити маніфест YAML та застосувати його за допомогою `kubectl`:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/tls/myuser.yaml" download="tls/myuser.yaml"><code>tls/myuser.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('tls-myuser-yaml')" title="Копіювати tls/myuser.yaml до буферу обміну"></img></div>
    <div class="includecode" id="tls-myuser-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">certificates.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CertificateSigningRequest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">myuser</span><span class="w"> </span><span class="c"># приклад</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Це закодований CSR. Змініть це на вміст myuser.csr, закодований у base64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">request</span><span class="p">:</span><span class="w"> </span><span class="l">LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">signerName</span><span class="p">:</span><span class="w"> </span><span class="l">kubernetes.io/kube-apiserver-client</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">expirationSeconds</span><span class="p">:</span><span class="w"> </span><span class="m">86400</span><span class="w"> </span><span class="c"># один день</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">usages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">client auth</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Застосуйте маніфест:

```bash
kubectl apply -f myuser.yaml --server-side
```

Деякі моменти, на які слід звернути увагу:

* `usages` має бути `client auth`.
* `expirationSeconds` можна зробити довшим (наприклад, `864000` для десяти днів) або коротшим (наприклад, `3600` для однієї години). Ви не можете подати запит тривалістю менше ніж 10 хвилин.
* `request` — це закодоване в base64 значення вмісту файлу CSR.

## Схваліть CertificateSigningRequest {#approve-certificate-signing-request}

Використовуйте kubectl, щоб знайти CSR, який ви створили, і вручну схвалити його.

Отримайте список CSR:

```shell
kubectl get csr
```

Схваліть CSR:

```shell
kubectl certificate approve myuser
```

## Отримайте сертифікат {#get-the-certificate}

Отримайте сертифікат із CSR, щоб перевірити, чи виглядає він правильно.

```shell
kubectl get csr/myuser -o yaml
```

Значення сертифікату знаходиться в Base64-кодованому форматі в розділі `.status.certificate`.

Експортуйте виданий сертифікат з CertificateSigningRequest.

```shell
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
```

## Налаштуйте сертифікат у kubeconfig {#configure-the-certificate-into-kubeconfig}

Наступним кроком буде додавання цього користувача до файлу kubeconfig.

Спочатку потрібно додати нові облікові дані:

```shell
kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true

```

Потім потрібно додати контекст:

```shell
kubectl config set-context myuser --cluster=kubernetes --user=myuser
```

Перевірте:

```shell
kubectl --context myuser auth whoami
```

Ви повинні побачити вивід, який підтверджує, що ви є «myuser».

## Створіть Role та RoleBinding {#create-role-and-rolebinding}


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Якщо ви не використовуєте Kubernetes RBAC, пропустіть цей крок і внесіть відповідні зміни до механізму авторизації який використовується у вашому кластері.</div>


Після створення сертифіката настав час визначити Role і RoleBinding для цього користувача для доступу до ресурсів кластера Kubernetes.

Це приклад команди для створення Role для цього нового користувача:

```shell
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
```

Еквівалентний YAML:

















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/tls/role.yaml" download="tls/role.yaml"><code>tls/role.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('tls-role-yaml')" title="Копіювати tls/role.yaml до буферу обміну"></img></div>
    <div class="includecode" id="tls-role-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Role</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">developer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;pods&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;create&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;get&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;list&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;update&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;delete&#34;</span><span class="p">]</span></span></span></code></pre></div></div>
</div>

Це приклад команди для створення RoleBinding для цього нового користувача:

```shell
kubectl create rolebinding developer-binding-myuser --role=developer --user=myuser
```

Еквівалентний YAML:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/tls/rolebinding.yaml" download="tls/rolebinding.yaml"><code>tls/rolebinding.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('tls-rolebinding-yaml')" title="Копіювати tls/rolebinding.yaml до буферу обміну"></img></div>
    <div class="includecode" id="tls-rolebinding-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">RoleBinding</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">developer-binding-myuser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">subjects</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">User</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">myuser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">apiGroup</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">roleRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Role</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">developer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">apiGroup</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io</span></span></span></code></pre></div></div>
</div>

## Що далі

* Прочитайте [Керування сертифікатами TLS у кластері](/docs/tasks/tls/managing-tls-in-a-cluster/)
* Для отримання детальної інформації про сам X.509 зверніться до [RFC 5280](https://tools.ietf.org/html/rfc5280#section-3.1), розділ 3.1
* Інформацію про синтаксис запитів на підписання сертифікатів PKCS#10 наведено в [RFC 2986](https://tools.ietf.org/html/rfc2986)
* Прочитайте про [ClusterTrustBundles](/docs/reference/access-authn-authz/certificate-signing-requests/#cluster-trust-bundles)
