# Как создать цепочку сертификатов?

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

Одна из часто возникающих проблем - это установленная на сервер неполная цепочка сертификатов, что приводит к ошибке:

> x509: certificate signed by unknown authority or server certificate verification failed

При этом браузер, при обращении к сайту по HTTPS протоколу, может не показывать ошибку, т.к. браузеры умеют автоматически дополнять цепочку сертификатов (из своего встроенного хранилища сертификатов или из хранилища операционной системы).

### Делаем правильную цепочку сертификатов
Если у вас есть промежуточные сертификаты, то нужно убедится, что при ответе на запрос браузера или другого http-клиента, сервер, отправляет полную цепочку сертификатов. **Цепочка должна содержать сертификат домена и все промежуточные сертификаты, при этом сертификат домена должен идти первым, как на картинке:**
![В файле цепочки, сертификата домена стоит на первом месте, а затем идет промежуточный сертификат](https://cdn.hashnode.com/res/hashnode/image/upload/v1645699917253/CPJfQvwDw.png)

Сначала давайте убедимся что у нас есть все необходимые файлы:
- **корневой сертификат** (CA certificate, обычно файл называется ca.pem или cacerts.pem)
- **промежуточный сертификат** (Intermediate certificate, его может не быть совсем или их может быть несколько)
- **сам сертификат домена**

Далее в примерах мы будем использовать следующие имена файлов:
- **корневой сертификат**: `ca.pem`
- **промежуточный сертификат**: `intermediate.pem`
- **сертификат домена**: `cert.pem`

Теперь, когда у нас есть все необходимое, перейдем в папку с файлами и объединим сертификат домена и промежуточный сертификат в один файл следующей командой (не забудьте заменить имена файлов из примера на соответствующие имена ваших файлов):

```
$ cat cert.pem intermediate.pem > chain.pem
``` 

Проверить правильность порядка следования сертификатов в цепочке мы можем так, выполняем команду:

```
$ openssl crl2pkcs7 -nocrl -certfile chain.pem | openssl pkcs7 -print_certs -noout
``` 
вывод будет примерно такой:
```
subject=/C=Countrycode/ST=State/O=Organization/CN=FQDN
issuer=/C=Countrycode/ST=State/O=Organization/CN=the name of the intermediate CA

subject=/C=Countrycode/ST=State/O=Organization/CN=the name of the intermediate CA
issuer=/C=Countrycode/ST=State/O=Organization/CN=the name of the CA
```
в поле CN  мы должны увидеть:
- subject: домен, на который выдан сертификат
- issuer: имя промежуточного сертификата
- subject: имя промежуточного сертификата, которое **должно совпадать со значение в поле `issuer` предидущего сертификата**
- issuer: имя корневого сертификата

Если описанные выше условия выполняются, то цепочка сертификатов сделана правильно!

Промежуточных сертификатов может быть больше одного, в этом случае в файл должны быть добавлены все промежуточные сертификаты, по тому же принципу:
**поле `subject` каждого следующего сертификата должно соответствовать полю `issuer` предидущего сертификата**. Получить поле `issuer` можно следующей командой:
```
openssl x509 -in cert.pem -noout -issuer
```
*Статья написана на основе материалов из поста [Get your certificate chain right](https://medium.com/@superseb/get-your-certificate-chain-right-4b117a9c0fce)*
