|
| 1 | +--- |
| 2 | +title: Генерация сертификатов вручную |
| 3 | +content_type: task |
| 4 | +weight: 20 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +При аутентификации с помощью клиентского сертификата сертификаты можно генерировать вручную с помощью `easyrsa`, `openssl` или `cfssl`. |
| 10 | + |
| 11 | +<!-- body --> |
| 12 | + |
| 13 | +### easyrsa |
| 14 | + |
| 15 | +**easyrsa** поддерживает ручную генерацию сертификатов для кластера. |
| 16 | + |
| 17 | +1. Скачайте, распакуйте и инициализируйте пропатченную версию `easyrsa3`. |
| 18 | + |
| 19 | + ```shell |
| 20 | + curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz |
| 21 | + tar xzf easy-rsa.tar.gz |
| 22 | + cd easy-rsa-master/easyrsa3 |
| 23 | + ./easyrsa init-pki |
| 24 | + ``` |
| 25 | +1. Создайте новый центр сертификации (certificate authority, CA). `--batch` задает автоматический режим; |
| 26 | + `--req-cn` указывает общее имя (Common Name, CN) для нового корневого сертификата CA. |
| 27 | + |
| 28 | + ```shell |
| 29 | + ./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass |
| 30 | + ``` |
| 31 | + |
| 32 | +1. Сгенерируйте сертификат и ключ сервера. |
| 33 | + |
| 34 | + Аргумент `--subject-alt-name` задает допустимые IP-адреса и DNS-имена, с которых будет осуществляться доступ к серверу API. `MASTER_CLUSTER_IP` обычно является первым IP из CIDR сервиса, который указан в качестве аргумента `--service-cluster-ip-range` как для сервера API, так и для менеджера контроллеров. Аргумент `--days` задает количество дней, через которое истекает срок действия сертификата. В приведенном ниже примере предполагается, что `cluster.local` используется в качестве доменного имени по умолчанию. |
| 35 | + |
| 36 | + ```shell |
| 37 | + ./easyrsa --subject-alt-name="IP:${MASTER_IP},"\ |
| 38 | + "IP:${MASTER_CLUSTER_IP},"\ |
| 39 | + "DNS:kubernetes,"\ |
| 40 | + "DNS:kubernetes.default,"\ |
| 41 | + "DNS:kubernetes.default.svc,"\ |
| 42 | + "DNS:kubernetes.default.svc.cluster,"\ |
| 43 | + "DNS:kubernetes.default.svc.cluster.local" \ |
| 44 | + --days=10000 \ |
| 45 | + build-server-full server nopass |
| 46 | + ``` |
| 47 | + |
| 48 | +1. Скопируйте `pki/ca.crt`, `pki/issued/server.crt` и `pki/private/server.key` в свою директорию. |
| 49 | + |
| 50 | +1. Заполните и добавьте следующие параметры в параметры запуска сервера API: |
| 51 | + |
| 52 | + ```shell |
| 53 | + --client-ca-file=/yourdirectory/ca.crt |
| 54 | + --tls-cert-file=/yourdirectory/server.crt |
| 55 | + --tls-private-key-file=/yourdirectory/server.key |
| 56 | + ``` |
| 57 | + |
| 58 | +### openssl |
| 59 | + |
| 60 | +**openssl** поддерживает ручную генерацию сертификатов для кластера. |
| 61 | + |
| 62 | +1. Сгенерируйте 2048-разрядный ключ ca.key: |
| 63 | + |
| 64 | + ```shell |
| 65 | + openssl genrsa -out ca.key 2048 |
| 66 | + ``` |
| 67 | + |
| 68 | +1. На основе ca.key сгенерируйте ca.crt (используйте `-days` для установки времени действия сертификата): |
| 69 | + |
| 70 | + ```shell |
| 71 | + openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt |
| 72 | + ``` |
| 73 | + |
| 74 | +1. Сгенерируйте 2048-битный ключ server.key: |
| 75 | + |
| 76 | + ```shell |
| 77 | + openssl genrsa -out server.key 2048 |
| 78 | + ``` |
| 79 | + |
| 80 | +1. Создайте файл конфигурации для генерации запроса на подписание сертификата (Certificate Signing Request, CSR). |
| 81 | + |
| 82 | + Замените значения, помеченные угловыми скобками (например, `<MASTER_IP>`), нужными значениями перед сохранением в файл (например, `csr.conf`). Обратите внимание, что значение для `MASTER_CLUSTER_IP` – это cluster IP сервиса для сервера API, как описано в предыдущем подразделе. В приведенном ниже примере предполагается, что `cluster.local` используется в качестве доменного имени по умолчанию. |
| 83 | + |
| 84 | + ```ini |
| 85 | + [ req ] |
| 86 | + default_bits = 2048 |
| 87 | + prompt = no |
| 88 | + default_md = sha256 |
| 89 | + req_extensions = req_ext |
| 90 | + distinguished_name = dn |
| 91 | + |
| 92 | + [ dn ] |
| 93 | + C = <country> |
| 94 | + ST = <state> |
| 95 | + L = <city> |
| 96 | + O = <organization> |
| 97 | + OU = <organization unit> |
| 98 | + CN = <MASTER_IP> |
| 99 | + |
| 100 | + [ req_ext ] |
| 101 | + subjectAltName = @alt_names |
| 102 | + |
| 103 | + [ alt_names ] |
| 104 | + DNS.1 = kubernetes |
| 105 | + DNS.2 = kubernetes.default |
| 106 | + DNS.3 = kubernetes.default.svc |
| 107 | + DNS.4 = kubernetes.default.svc.cluster |
| 108 | + DNS.5 = kubernetes.default.svc.cluster.local |
| 109 | + IP.1 = <MASTER_IP> |
| 110 | + IP.2 = <MASTER_CLUSTER_IP> |
| 111 | + |
| 112 | + [ v3_ext ] |
| 113 | + authorityKeyIdentifier=keyid,issuer:always |
| 114 | + basicConstraints=CA:FALSE |
| 115 | + keyUsage=keyEncipherment,dataEncipherment |
| 116 | + extendedKeyUsage=serverAuth,clientAuth |
| 117 | + subjectAltName=@alt_names |
| 118 | + ``` |
| 119 | + |
| 120 | +1. Сгенерируйте запрос на подписание сертификата, используя файл конфигурации: |
| 121 | + |
| 122 | + ```shell |
| 123 | + openssl req -new -key server.key -out server.csr -config csr.conf |
| 124 | + ``` |
| 125 | + |
| 126 | +1. С помощью ca.key, ca.crt и server.csr сгенерируйте сертификат сервера: |
| 127 | + |
| 128 | + ```shell |
| 129 | + openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ |
| 130 | + -CAcreateserial -out server.crt -days 10000 \ |
| 131 | + -extensions v3_ext -extfile csr.conf |
| 132 | + ``` |
| 133 | + |
| 134 | +1. Используйте следующую команду, чтобы просмотреть запрос на подписание сертификата: |
| 135 | + |
| 136 | + ```shell |
| 137 | + openssl req -noout -text -in ./server.csr |
| 138 | + ``` |
| 139 | + |
| 140 | +1. Используйте следующую команду, чтобы просмотреть сертификат: |
| 141 | + |
| 142 | + ```shell |
| 143 | + openssl x509 -noout -text -in ./server.crt |
| 144 | + ``` |
| 145 | + |
| 146 | +Наконец, добавьте эти параметры в конфигурацию запуска сервера API. |
| 147 | + |
| 148 | +### cfssl |
| 149 | + |
| 150 | +**cfssl** – еще один инструмент для генерации сертификатов. |
| 151 | + |
| 152 | +1. Скачайте, распакуйте и подготовьте пакеты, как показано ниже. |
| 153 | + |
| 154 | + Обратите внимание, что команды необходимо адаптировать под архитектуру и используемую версию cfssl. |
| 155 | + |
| 156 | + ```shell |
| 157 | + curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 -o cfssl |
| 158 | + chmod +x cfssl |
| 159 | + curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 -o cfssljson |
| 160 | + chmod +x cfssljson |
| 161 | + curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 -o cfssl-certinfo |
| 162 | + chmod +x cfssl-certinfo |
| 163 | + ``` |
| 164 | + |
| 165 | +1. Создайте директорию для хранения артефактов и инициализируйте cfssl: |
| 166 | + |
| 167 | + ```shell |
| 168 | + mkdir cert |
| 169 | + cd cert |
| 170 | + ../cfssl print-defaults config > config.json |
| 171 | + ../cfssl print-defaults csr > csr.json |
| 172 | + ``` |
| 173 | + |
| 174 | +1. Создайте JSON-конфиг для генерации файла CA (например, `ca-config.json`): |
| 175 | + |
| 176 | + ```json |
| 177 | + { |
| 178 | + "signing": { |
| 179 | + "default": { |
| 180 | + "expiry": "8760h" |
| 181 | + }, |
| 182 | + "profiles": { |
| 183 | + "kubernetes": { |
| 184 | + "usages": [ |
| 185 | + "signing", |
| 186 | + "key encipherment", |
| 187 | + "server auth", |
| 188 | + "client auth" |
| 189 | + ], |
| 190 | + "expiry": "8760h" |
| 191 | + } |
| 192 | + } |
| 193 | + } |
| 194 | + } |
| 195 | + ``` |
| 196 | + |
| 197 | +1. Создайте JSON-конфиг для запроса на подписание сертификата (CSR) (например, |
| 198 | + `ca-csr.json`). Замените значения, помеченные угловыми скобками, на нужные. |
| 199 | + |
| 200 | + ```json |
| 201 | + { |
| 202 | + "CN": "kubernetes", |
| 203 | + "key": { |
| 204 | + "algo": "rsa", |
| 205 | + "size": 2048 |
| 206 | + }, |
| 207 | + "names":[{ |
| 208 | + "C": "<country>", |
| 209 | + "ST": "<state>", |
| 210 | + "L": "<city>", |
| 211 | + "O": "<organization>", |
| 212 | + "OU": "<organization unit>" |
| 213 | + }] |
| 214 | + } |
| 215 | + ``` |
| 216 | + |
| 217 | +1. Сгенерируйте ключ CA (`ca-key.pem`) и сертификат (`ca.pem`): |
| 218 | + |
| 219 | + ```shell |
| 220 | + ../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca |
| 221 | + ``` |
| 222 | + |
| 223 | +1. Создайте конфигурационный JSON-файл для генерации ключей и сертификатов для сервера API (например, `server-csr.json`). Замените значения, помеченные угловыми скобками, на нужные. `MASTER_CLUSTER_IP` – это cluster IP сервиса для сервера API, как описано в предыдущем подразделе. В приведенном ниже примере предполагается, что `cluster.local` используется в качестве доменного имени по умолчанию. |
| 224 | + |
| 225 | + ```json |
| 226 | + { |
| 227 | + "CN": "kubernetes", |
| 228 | + "hosts": [ |
| 229 | + "127.0.0.1", |
| 230 | + "<MASTER_IP>", |
| 231 | + "<MASTER_CLUSTER_IP>", |
| 232 | + "kubernetes", |
| 233 | + "kubernetes.default", |
| 234 | + "kubernetes.default.svc", |
| 235 | + "kubernetes.default.svc.cluster", |
| 236 | + "kubernetes.default.svc.cluster.local" |
| 237 | + ], |
| 238 | + "key": { |
| 239 | + "algo": "rsa", |
| 240 | + "size": 2048 |
| 241 | + }, |
| 242 | + "names": [{ |
| 243 | + "C": "<country>", |
| 244 | + "ST": "<state>", |
| 245 | + "L": "<city>", |
| 246 | + "O": "<organization>", |
| 247 | + "OU": "<organization unit>" |
| 248 | + }] |
| 249 | + } |
| 250 | + ``` |
| 251 | + |
| 252 | +1. Сгенерируйте ключ и сертификат для сервера API (по умолчанию они сохраняются в файлах `server-key.pem` и `server.pem` соответственно): |
| 253 | + |
| 254 | + ```shell |
| 255 | + ../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \ |
| 256 | + --config=ca-config.json -profile=kubernetes \ |
| 257 | + server-csr.json | ../cfssljson -bare server |
| 258 | + ``` |
| 259 | + |
| 260 | +## Распространение самоподписанного сертификата CA |
| 261 | + |
| 262 | +Клиентский узел может отказаться признавать самоподписанный сертификат CA действительным. В случае его использования не в production или в инсталляциях, защищенных межсетевым экраном, самоподписанный сертификат CA можно распространить среди всех клиентов и обновить локальный список действительных сертификатов. |
| 263 | + |
| 264 | +Для этого на каждом клиенте выполните следующие операции: |
| 265 | + |
| 266 | +```shell |
| 267 | +sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt |
| 268 | +sudo update-ca-certificates |
| 269 | +``` |
| 270 | + |
| 271 | +```none |
| 272 | +Updating certificates in /etc/ssl/certs... |
| 273 | +1 added, 0 removed; done. |
| 274 | +Running hooks in /etc/ca-certificates/update.d.... |
| 275 | +done. |
| 276 | +``` |
| 277 | + |
| 278 | +## API для сертификатов |
| 279 | + |
| 280 | +Для создания сертификатов x509, которые будут использоваться для аутентификации, можно воспользоваться API `certificates.k8s.io`. Для дополнительной информации см. [Управление TLS-сертификатами в кластере](/docs/tasks/tls/managing-tls-in-a-cluster). |
0 commit comments