Перейти к содержанию

Расширения X.509: SAN, KeyUsage и профили сертификатов

ГОСТ-сертификат должен быть не только корректно подписан, но и соответствовать задаче: TLS-сервер, VPN-клиент, сервисная подпись, промежуточный или корневой УЦ. Профиль задаётся расширениями X.509.

Шпаргалка по назначению

Поле Пример Значение
basicConstraints CA:FALSE Конечный сертификат, не УЦ
basicConstraints CA:TRUE,pathlen:0 УЦ, запрещены подчинённые УЦ
keyUsage digitalSignature Использование для подписей
keyUsage keyCertSign,cRLSign Полномочия УЦ
extendedKeyUsage serverAuth TLS-сервер
extendedKeyUsage clientAuth TLS-клиент
subjectAltName DNS:app.example Имя сервера, проверяемое клиентом
authorityKeyIdentifier keyid,issuer Ссылка на ключ издателя
subjectKeyIdentifier hash Идентификатор ключа субъекта

Серверный профиль

basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
extendedKeyUsage=serverAuth
subjectAltName=DNS:server.example,DNS:api.server.example
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

Для действующего домена замените .example своими DNS-именами. Современный TLS-клиент проверяет прежде всего SAN, а не только CN.

Клиентский профиль

basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
extendedKeyUsage=clientAuth

Профиль корневого УЦ

basicConstraints=critical,CA:TRUE,pathlen:0
keyUsage=critical,keyCertSign,cRLSign
subjectKeyIdentifier=hash

Нельзя выставлять CA:TRUE у конечного сертификата только ради устранения ошибки валидации цепочки.

Посмотреть расширения в выпущенном сертификате

openssl x509 -in server.crt -noout -text \
  | sed -n '/X509v3 extensions:/,/Signature Algorithm/p'

Проверить сертификат относительно задачи

openssl verify -purpose sslserver -CAfile root.crt server.crt
openssl verify -purpose sslclient -CAfile root.crt client.crt

Параметр -purpose помогает обнаружить неподходящее использование ключа. Итоговая совместимость зависит также от криптопрофиля TLS, выбранного сервером.

Как подготовить CSR с SAN

cat > server-req.cnf <<'EOF'
[ req ]
prompt = no
distinguished_name = subject
req_extensions = ext
[ subject ]
C=RU
O=NiceSoft
CN=server.example
[ ext ]
subjectAltName=DNS:server.example,DNS:api.server.example
EOF

openssl req -new -key server.key \
  -config server-req.cnf -out server.csr
openssl req -in server.csr -noout -text

Наличие SAN в CSR не гарантирует, что УЦ автоматически перенесёт его в сертификат: выдающий УЦ применяет свою политику.

Продолжение: создание УЦ, TLS.