Почему сертификат не признан доверенным?

В процессе разработки мне необходимо выполнять локальные HTTPS-запросы (ниже приведен упрощенный пример). Я сгенерировал обычный самоподписанный сертификат, добавил его в <code>/etc/pki/ca-trust/source/anchors/</code> и выполнил <code>sudo update-ca-trust extract</code>. Однако код выдает ошибку, указывая на то, что сертификат является самоподписанным. Я работаю на системе Fedora 41. 

Вот пример кода для сервера: 
<pre><code class="javascript">'use strict';

const path = require('node:path');
const fsp = require('node:fs/promises');
const http2 = require('node:http2');

const keypath = path.join(__dirname, 'key.pem');
const certpath = path.join(__dirname, 'cert.pem');

const tlsOptions = async (keypath, certpath) =&gt; ({
  key: await fsp.readFile(keypath),
  cert: await fsp.readFile(certpath),
});

const main = async () =&gt; {
  const options = await tlsOptions(keypath, certpath);
  const server = http2.createSecureServer(options);
  server.on('stream', (stream) =&gt; {
    stream.respond({ ':status': 200 });
    stream.end('success');
  });
  server.listen(8000);
};

main();</code></pre> 

Код для клиента: 
<pre><code class="javascript">'use strict';

fetch('https://localhost:8000/').then(console.log);</code></pre> 

Что можно сделать, чтобы устранить проблему с ошибкой о самоподписанном сертификате?
  • 22 ноября 2024 г. 13:33
Ответы на вопрос 1
Ошибка, связанная с самоподписанным сертификатом, возникает из-за того, что клиент (в вашем случае код, выполняемый в браузере или Node.js) не может проверить подлинность сертификата, так как он не был выдан доверенным центром сертификации (ЦС). Самоподписанные сертификаты не могут быть автоматически распознаны как доверенные, даже если вы добавляете их в систему.

Вот несколько шагов, которые вы можете выполнить для устранения этой проблемы:

### 1. Убедитесь, что сертификат установлен правильно

Если вы добавили сертификат в `/etc/pki/ca-trust/source/anchors/` и выполнили `sudo update-ca-trust extract`, убедитесь, что вы используете корректный сертификат. Возможно, стоит проверить, что сертификат добавлен в зарезервированные доверенные сертификаты.

### 2. Настройка HTTPS запросов в Node.js 

Если ваш клиент выполняется в Node.js, вы можете настроить request так, чтобы он игнорировал ошибки связанных с самоподписанными сертификатами. Вы можете использовать `NODE_TLS_REJECT_UNAUTHORIZED` переменную окружения для этого.

```bash
NODE_TLS_REJECT_UNAUTHORIZED=0 node your_client_script.js
```

> **Предупреждение:** Игнорирование проверки сертификатов может быть опасным в продуктивной среде, так как это может подвергнуть вас атакам «человек посередине».

### 3. Другие способы игнорирования сертификатов (для клиентского кода)

Помимо использования переменной окружения, если вы хотите игнорировать самоподписанные сертификаты только для данного HTTP запроса в Node.js, вы можете использовать библиотеку `https` вместо `fetch` с настройками для игнорирования ошибок:

```javascript
const https = require('node:https');
const fetch = require('node-fetch');

const agent = new https.Agent({  
  rejectUnauthorized: false
});

fetch('https://localhost:8000/', { agent })
  .then(response => response.text())
  .then(console.log)
  .catch(console.error);
```

### 4. Импорт сертификата на клиенте (если вы работаете в браузере)

Если вы работаете с браузером, то вам может понадобиться вручную установить самоподписанный сертификат в доверенные корневые сертификаты вашей операционной системы или браузера. Для этого:

- В Firefox, например, вы можете зайти в настройки безопасности, перейти в раздел управления сертификатами и импортировать ваш самоподписанный сертификат.
- В Chrome этапы аналогичные, но вам может потребоваться перезапустить браузер.

### 5. Рассмотрите возможность использования доверенного сертификата

Если это возможно, рассмотрите вариант получения сертификата от доверенного центра сертификации (например, Let's Encrypt, который предоставляет бесплатные сертификаты). Это упростит задачу проверки подлинности и обеспечит безопасность.

В результате, самоподписанные сертификаты могут быть полезны в разработке, но важно осознавать риски и использовать их с осторожностью.
Похожие вопросы