Создание самоподписанных сертификатов для 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.