Давайте сегодня поговорим о моей любимой ошибке «Подключение не защищено». Если в Internet мы обычно используем Let’s encrypt или приобретенный у хостера сертификат, то в Intranet нам необходимо использовать удостоверяющий центр.
Получение сертификата
Вариант с отсутствующим корневым сертификатом
Например в случае FreeIPA корневой сертификат центра сертификации распространяется на рабочие станции автоматически, но что делать если у нас нет корневого сертификата и мы имеем дело с самоподписанным сертификатом.

Например в этом случае кому выдан и кем выдан это один и тот же сервер. И следовательно нам необходимо получить сертификат сервера и поместить его в хранилище доверенных сертификатов.
Мы можем сохранить сертификат на вкладке «Подробнее», кнопка «Экспорт». Это применительно к браузерам от Google, но в принципе для других браузеров подход не отличается.

Посмотрим информацию о полученном сертификате.
# openssl x509 -in ./ovirt01-nux.sngp.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 4100 (0x1004)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=sngp.com, CN=ovirt01-nux.sngp.com.11650
Validity
Not Before: Feb 26 05:05:32 2026 GMT
Not After : Apr 1 05:05:32 2027 GMT
Subject: C=US, O=sngp.com, CN=ovirt01-nux.sngp.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d3:9c:59:95:ac:33:5d:b8:cd:f3:03:47:74:03:
d7:0e:7c:27:d4:b3:d9:e3:c1:3d:67:74:02:32:9b:
a8:f8:12:48:1e:a1:fa:69:a7:4a:d3:f6:1e:14:00:
9d:3c:61:e1:bb:8c:ab:1f:20:83:4e:8b:c4:33:6c:
84:26:cb:a3:65:cc:e9:61:8c:c2:5a:09:32:63:fc:
23:8f:76:10:6a:4a:d8:04:f8:ee:db:79:52:cb:62:
cf:34:0b:3a:dc:03:55:eb:c0:c4:13:f1:50:a8:f6:
24:69:1b:4e:c5:0e:ac:15:3c:4a:a3:02:27:3b:cc:
e7:94:16:5f:2c:60:d1:4e:f6:4f:2c:a3:01:56:f0:
70:50:7a:a7:57:cf:09:e3:2c:05:cd:26:e7:e2:b7:
b0:4c:87:dc:b0:f5:7d:74:99:52:35:48:c6:47:5b:
79:3c:2a:f3:b5:4a:8d:2f:8e:b9:8e:0f:16:d6:92:
58:a6:ec:a9:5d:ce:9b:c5:57:d7:4e:44:26:35:66:
a4:dd:4e:9f:52:bc:c0:63:ed:eb:a3:04:7a:cb:f0:
c2:f0:1b:85:dd:e1:72:2a:99:c1:b5:90:3b:b8:e5:
c2:f0:47:86:c2:76:9f:b3:98:a3:2f:41:8c:24:9f:
43:80:ef:2b:1a:c2:4a:a6:26:cd:9f:cd:68:5c:79:
b0:e9
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
4F:5B:8C:91:37:90:4F:F6:15:D7:6E:32:41:42:44:E3:7B:EE:46:B9
Authority Information Access:
CA Issuers - URI:http://ovirt01-nux.sngp.com:80/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA
X509v3 Authority Key Identifier:
keyid:FA:51:B5:35:D5:31:46:EC:17:A3:EA:C6:8A:4C:41:D6:A6:33:0E:AF
DirName:/C=US/O=sngp.com/CN=ovirt01-nux.sngp.com.11650
serial:10:00
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage: critical
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Subject Alternative Name:
DNS:ovirt01-nux.sngp.com
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
2c:e9:b4:85:27:8c:7b:c9:c9:91:eb:21:a7:9d:80:aa:84:59:
0f:20:60:73:40:56:c4:e8:b1:6b:ad:ac:6c:ac:48:f3:95:9c:
fd:68:a8:23:a7:3e:d5:a8:2b:81:ea:bf:6b:60:45:4e:1e:71:
d0:74:c6:32:05:48:95:34:38:7a:11:24:9d:20:63:f2:2d:8e:
2f:70:08:15:5c:7d:2e:d0:60:d0:2e:6e:e3:49:1f:72:b3:c3:
69:fd:e4:d9:89:02:00:38:19:84:8c:f6:0f:fc:de:19:65:e8:
2f:eb:da:88:1f:6f:04:ce:83:4c:ce:a6:98:02:ae:ed:38:9b:
c8:57:e9:a8:3e:d4:e1:86:c9:6b:64:d8:b2:4d:4a:74:d6:b2:
66:d9:f3:0e:4a:bb:f8:6f:e9:81:0d:49:f5:b6:0a:9e:65:34:
15:ff:e0:78:3e:45:5c:1e:0c:29:82:f8:9f:63:f8:ef:4a:d1:
7c:85:8e:23:84:bd:35:2e:6c:8b:a4:f9:34:14:61:9d:f8:4e:
a1:a8:1a:51:06:55:2d:49:0e:f9:7c:5e:67:22:df:cd:29:33:
77:a8:c6:36:59:8f:83:ec:16:84:59:e4:5f:db:68:88:a0:62:
82:b6:89:2f:11:f3:59:4c:de:9c:32:23:24:ee:97:45:3f:b7:
0a:90:ac:9c
Аналогично сертификат мы можем получить и средствами утилиты openssl.
# openssl s_client -connect ovirt01-nux.sngp.com:443 -showcerts </dev/null > test_cert.pem
Запрашивем информацию и сверяем.
# openssl x509 -in ./test_cert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 4100 (0x1004)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=sngp.com, CN=ovirt01-nux.sngp.com.11650
Validity
Not Before: Feb 26 05:05:32 2026 GMT
Not After : Apr 1 05:05:32 2027 GMT
Subject: C=US, O=sngp.com, CN=ovirt01-nux.sngp.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d3:9c:59:95:ac:33:5d:b8:cd:f3:03:47:74:03:
d7:0e:7c:27:d4:b3:d9:e3:c1:3d:67:74:02:32:9b:
a8:f8:12:48:1e:a1:fa:69:a7:4a:d3:f6:1e:14:00:
9d:3c:61:e1:bb:8c:ab:1f:20:83:4e:8b:c4:33:6c:
84:26:cb:a3:65:cc:e9:61:8c:c2:5a:09:32:63:fc:
23:8f:76:10:6a:4a:d8:04:f8:ee:db:79:52:cb:62:
cf:34:0b:3a:dc:03:55:eb:c0:c4:13:f1:50:a8:f6:
24:69:1b:4e:c5:0e:ac:15:3c:4a:a3:02:27:3b:cc:
e7:94:16:5f:2c:60:d1:4e:f6:4f:2c:a3:01:56:f0:
70:50:7a:a7:57:cf:09:e3:2c:05:cd:26:e7:e2:b7:
b0:4c:87:dc:b0:f5:7d:74:99:52:35:48:c6:47:5b:
79:3c:2a:f3:b5:4a:8d:2f:8e:b9:8e:0f:16:d6:92:
58:a6:ec:a9:5d:ce:9b:c5:57:d7:4e:44:26:35:66:
a4:dd:4e:9f:52:bc:c0:63:ed:eb:a3:04:7a:cb:f0:
c2:f0:1b:85:dd:e1:72:2a:99:c1:b5:90:3b:b8:e5:
c2:f0:47:86:c2:76:9f:b3:98:a3:2f:41:8c:24:9f:
43:80:ef:2b:1a:c2:4a:a6:26:cd:9f:cd:68:5c:79:
b0:e9
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
4F:5B:8C:91:37:90:4F:F6:15:D7:6E:32:41:42:44:E3:7B:EE:46:B9
Authority Information Access:
CA Issuers - URI:http://ovirt01-nux.sngp.com:80/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA
X509v3 Authority Key Identifier:
keyid:FA:51:B5:35:D5:31:46:EC:17:A3:EA:C6:8A:4C:41:D6:A6:33:0E:AF
DirName:/C=US/O=sngp.com/CN=ovirt01-nux.sngp.com.11650
serial:10:00
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage: critical
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Subject Alternative Name:
DNS:ovirt01-nux.sngp.com
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
2c:e9:b4:85:27:8c:7b:c9:c9:91:eb:21:a7:9d:80:aa:84:59:
0f:20:60:73:40:56:c4:e8:b1:6b:ad:ac:6c:ac:48:f3:95:9c:
fd:68:a8:23:a7:3e:d5:a8:2b:81:ea:bf:6b:60:45:4e:1e:71:
d0:74:c6:32:05:48:95:34:38:7a:11:24:9d:20:63:f2:2d:8e:
2f:70:08:15:5c:7d:2e:d0:60:d0:2e:6e:e3:49:1f:72:b3:c3:
69:fd:e4:d9:89:02:00:38:19:84:8c:f6:0f:fc:de:19:65:e8:
2f:eb:da:88:1f:6f:04:ce:83:4c:ce:a6:98:02:ae:ed:38:9b:
c8:57:e9:a8:3e:d4:e1:86:c9:6b:64:d8:b2:4d:4a:74:d6:b2:
66:d9:f3:0e:4a:bb:f8:6f:e9:81:0d:49:f5:b6:0a:9e:65:34:
15:ff:e0:78:3e:45:5c:1e:0c:29:82:f8:9f:63:f8:ef:4a:d1:
7c:85:8e:23:84:bd:35:2e:6c:8b:a4:f9:34:14:61:9d:f8:4e:
a1:a8:1a:51:06:55:2d:49:0e:f9:7c:5e:67:22:df:cd:29:33:
77:a8:c6:36:59:8f:83:ec:16:84:59:e4:5f:db:68:88:a0:62:
82:b6:89:2f:11:f3:59:4c:de:9c:32:23:24:ee:97:45:3f:b7:
0a:90:ac:9c
Все совпадает и openssl можно использовать для более сложных случаев например для Secure LDAP.
Преобразуем в PEM формат подходящий для импорта.
# openssl x509 -in ./test_cert.pem -out ./server_cert.pem -outform PEM
Установка доверенного сертификата
Напрямую в браузер
В Chrome переходим по адресу chrome://certificate-manager/localcerts/usercerts.

Импортируем полученный сертификат как доверенный.

Проверяем что страница теперь открывается без ошибок.

Таким образом мы импортировали сертификат на уровне браузера пользователя. Но все же хотелось бы импортировать сертификат чтобы он был доступен на уровне хоста для всех приложений и пользователей.
Для Ubuntu это будет выглядеть следующим образом.
# cp ./ovirt01-nux.sngp.com.pem /usr/local/share/ca-certificates/ovirt01-nux.sngp.com.crt
# update-ca-certificates
Обратите внимание, что сертификат импортируем с расширением .crt и проверим, что сертификат доступен в доверенных.
$ openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt ./ovirt01-nux.sngp.com.pem
Полный список установленных локально сертификатов.
$ awk -v cmd='openssl x509 -noout -subject -enddate 2>/dev/null | tr "\n" " " ; echo' '/BEGIN/{cert=""};{cert=sprintf("%s\n%s",cert,$0)};/END/{print cert |
cmd ;close(cmd)}' /etc/ssl/certs/ca-certificates.crt | sed 's/subject=//' | sort
Так-же, что интересно браузер Chrome как и другие игнорируют сертификаты добавленные в /etc/ssl/certs/ca-certificates.crt и у нас получается два хранилища сертификатов.
- Для системных приложений — /etc/ssl/certs/ca-certificates.crt
- Для пользовательских libnss3
Сертификаты пользователя хранятся в двух местах.
- Центральное общее хранилище — /etc/pki/nssdb
- Хранилище пользователя — ~/.pki/nssdb
Следовательно нам требуется дополнительно добавлять сертификаты еще и в /etc/pki/nssdb.
Для управления nssdb служит утилита libnss3-tools. Установим утилиту и добавим сертификат в хранилище, но обратите внимание, что в Ubuntu нет хранилища по умолчанию, а только пользовательские и общее хранилище сначала надо создать.
# mkdir -p /etc/pki/nssdb
# certutil -N -d /etc/pki/nssdb
# chmod -R 755 /etc/pki/nssdb
Пароль для системного хранилища не задаем и для добавления сертификата используем команду.
# certutil -d sql:/etc/pki/nssdb -A -t "CT,," -n "CA ovirt01-nux.sngp.com" -i ./ovirt01-nux.sngp.com.pem




