Как можно создать самоподписанные сертификаты для etcd?

Я планирую установить ETCD кластер с TLS шифрованием, используя самоподписанные сертификаты. Я следую этой <a href="https://medium.com/nirman-tech-blog/setting-up-etcd-cluster-with-tls-authentication-enabled-49c44e4151bb" rel="nofollow">инструкции</a>, однако у меня нет внешних IP-адресов. В процессе я столкнулся с проблемой: ETCD выдает ошибки, связанные с сертификатом. 

В логах мастера отображается следующее сообщение:  
<pre><code class="lua">Sep 06 14:47:45 node01 bash[79742]: {"level":"warn","ts":"2024-09-06T14:47:45.640975+0500","caller":"etcdserver/cluster_util.go:158","msg":"failed to get version", "remote-member-id":"7344371060bbebd0","error":"Get \"https://192.168.50.152:2380/version\": tls: failed to verify certificate: x509: certificate specifies an incompatible key usage"}</code></pre> 

Во второй ноде лог выглядит следующим образом:  
<pre><code class="lua">Sep 06 14:44:46 node02 bash[21065]: {"level":"warn","ts":"2024-09-06T14:44:46.006582+0500","caller":"embed/config_logging.go:170","msg":"rejected connection on peer endpoint","remote-addr":"192.168.50.151:53494","server-name":"","error":"remote error: tls: bad certificate"}</code></pre> 

При этом проверка сертификатов проходит успешно:  
<pre><code># openssl verify -CAfile ca.pem server.pem
server.pem: OK
# openssl verify -CAfile ca.pem node1.pem
node1.pem: OK</code></pre> 

Я также пробовал использовать другую <a href="https://postgrespro.ru/docs/shardman/14/etcd-https" rel="nofollow">инструкцию</a>, но безрезультатно. Подскажите, пожалуйста, где может быть ошибка, или порекомендуйте другую инструкцию, по которой удалось поднять рабочий кластер ETCD.
  • 6 сентября 2024 г. 12:03
Ответы на вопрос 2
Создание самоподписанных сертификатов для etcd с TLS шифрованием — это довольно распространённая задача, но она может быть подвержена множеству нюансов. Давайте рассмотрим шаги, необходимые для создания сертификатов, а также основные проблемы, с которыми вы столкнулись.

### Шаги для создания самоподписанных сертификатов

1. **Создание CA (Центра Сертификации)**:
   Начните с создания вашего корневого сертификата (CA):

   ```bash
   openssl genrsa -out ca.key 2048
   openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.pem -subj "/CN=etcd-ca"
   ```

2. **Создание ключа и сертификата для каждого сервера**:
   Создайте ключи и сертификаты для каждого узла. Например, для `node1`:

   ```bash
   openssl genrsa -out node1.key 2048
   openssl req -new -key node1.key -out node1.csr -subj "/CN=node1"
   openssl x509 -req -in node1.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out node1.pem -days 365 -sha256
   ```

   Повторите эту процедуру для `node2`, изменяя CN на `node2`.

3. **Создание ключа и сертификата для клиента**:
   Аналогично, если требуется клиентский сертификат, выполните:

   ```bash
   openssl genrsa -out client.key 2048
   openssl req -new -key client.key -out client.csr -subj "/CN=client"
   openssl x509 -req -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem -days 365 -sha256
   ```

### Причины возникновения ошибок

#### Ошибка о несовместимом использовании ключа

Ошибка `x509: certificate specifies an incompatible key usage` указывает на то, что в сертификате указаны некорректные параметры использования ключа. Для etcd сертификаты должны поддерживать `Key Usage` и `Extended Key Usage`. Убедитесь, что ваши сертификаты имеют следующие расширения:

- Для серверного сертификата (например, node1.pem):

```text
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
```

- Для клиентского сертификата (если используется):

```text
keyUsage = critical, digitalSignature
extendedKeyUsage = clientAuth
```

#### Ошибка "bad certificate"

Ошибка `remote error: tls: bad certificate` может указывать на то, что сертификат, предоставленный узлом, не был правильно подписан или не соответствует CN. Также проверьте, что `CN` в сертификатах узлов соответствует их имени в конфигурации etcd.

### Проверка сертификатов

Используйте команду `openssl x509 -text -noout -in your_cert.pem` для проверки вашего сертификата на наличие нужных расширений и параметров.

### Итог

Составьте ваши сертификаты с нужными параметрами и убедитесь, что все узлы в конфигурации etcd знают о сертификатах друг друга. Проверьте конфигурацию кластеров и параметры сети, чтобы узлы могли соединяться по указанным адресам.

Если необходимо больше помощи, могу предложить примеры конфигурационных файлов для etcd с TLS.
Поищи книжку под названием "Построение защищенных корпоративных сетей". Там довольно много про создание своего CA, выпуск сертфиикатов и все такое. 
Похоже у тебя EKU в сертификате не подходящее.
Похожие вопросы