Я что-то пропустил? Это правильный способ создания самозаверяющего сертификата?
Создать самозаверяющий сертификат легко. Вы просто используете openssl req
команду. Это может быть сложно создать тот, который будет использоваться самым большим выбором клиентов, таких как браузеры и инструменты командной строки.
Это сложно, потому что браузеры предъявляют свои собственные требования, и они более строгие, чем IETF . Требования, используемые браузерами, задокументированы на форумах CA / Browser (см. Ссылки ниже). Ограничения возникают в двух ключевых областях: (1) доверительные якоря и (2) DNS-имена.
Современные браузеры (например, Warez, который мы используем в 2014/2015 гг.) Хотят получить сертификат, привязанный к доверенному якору, и хотят, чтобы DNS-имена были представлены в сертификате особым образом. И браузеры активно движутся против самозаверяющих серверных сертификатов.
Некоторые браузеры не позволяют легко импортировать самозаверяющий сертификат сервера. На самом деле, вы не можете с некоторыми браузерами, такими как браузер Android. Таким образом, полное решение - стать вашим собственным авторитетом.
Если вы не обладаете собственными полномочиями, вы должны правильно присвоить DNS-имена, чтобы сертификат имел наибольшие шансы на успех. Но я бы посоветовал вам стать вашим собственным авторитетом. Легко стать вашим собственным авторитетом, и он обойдет все вопросы доверия (кому лучше доверять, чем вам?).
Вероятно, это не тот сайт, который вы ищете!
Сертификат безопасности сайта не является доверенным!
Это связано с тем, что браузеры используют предопределенный список якорей доверия для проверки сертификатов сервера. Самозаверяющий сертификат не связывается с доверенным якорем.
Лучший способ избежать этого:
- Создайте свой собственный авторитет (например, станьте CA )
- Создайте запрос подписи сертификата (CSR) для сервера
- Подпишите CSR сервера с вашим ключом CA
- Установите сертификат сервера на сервере
- Установите сертификат CA на клиенте
Шаг 1 - Создать свой собственный авторитет - значит создать самозаверяющий сертификат с CA: true
правильным использованием ключа. Это означает, что Субъект и Эмитент - это одна и та же сущность, CA имеет значение true в Базовых ограничениях (это также должно быть помечено как критическое), использование ключа - keyCertSign
и crlSign
(если вы используете CRL), а Идентификатор ключа субъекта (SKI) - такой же как идентификатор ключа авторизации (AKI).
Чтобы стать вашим собственным центром сертификации, см. * Как подписать запрос на подпись сертификата в вашем центре сертификации? Переполнение стека. Затем импортируйте свой CA в Trust Store, используемый браузером.
Шаги 2 - 4 примерно то , что вы делаете сейчас для публики перед сервером , когда вы заручиться услугами ЦС как Startcom или CAcert . Шаги 1 и 5 позволяют вам избежать сторонних полномочий и действовать как свои собственные полномочия (кому лучше доверять, чем себе?).
Следующий лучший способ избежать предупреждения браузера - это доверять сертификату сервера. Но некоторые браузеры, такие как браузер Android по умолчанию, не позволяют вам сделать это. Так что это никогда не будет работать на платформе.
Проблема браузеров (и других подобных пользовательских агентов), не доверяющих самозаверяющим сертификатам, станет большой проблемой в Интернете вещей (IoT). Например, что произойдет, когда вы подключитесь к своему термостату или холодильнику, чтобы запрограммировать его? Ответ: ничего хорошего в отношении пользовательского опыта.
Рабочая группа W3C WebAppSec начинает изучать проблему. См., Например, Предложение: Пометка HTTP как незащищенного .
Как создать самозаверяющий сертификат с OpenSSL
Приведенные ниже команды и файл конфигурации создают самозаверяющий сертификат (он также показывает, как создать запрос на подпись). Они отличаются от других ответов в одном отношении: имена DNS, используемые для самозаверяющего сертификата, находятся в дополнительном имени субъекта (SAN) , а не в общем имени (CN) .
Имена DNS помещаются в SAN через файл конфигурации со строкой subjectAltName = @alternate_names
(это невозможно сделать через командную строку). Тогда есть alternate_names
раздел в файле конфигурации (вы должны настроить его на свой вкус):
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# IP.1 = 127.0.0.1
# IP.2 = ::1
Важно ввести DNS-имя в SAN, а не CN, потому что и IETF, и форумы CA / Browser определяют практику. Они также указывают, что DNS-имена в CN устарели (но не запрещены). Если вы поместите DNS-имя в CN, оно должно быть включено в SAN в соответствии с политиками CA / B. Таким образом, вы не можете избежать использования альтернативного имени субъекта.
Если вы не введете DNS-имена в SAN, сертификат не будет проверен в браузере и других пользовательских агентах, которые следуют рекомендациям CA / Browser Forum.
Связано: браузеры следуют политикам CA / Browser Forum; а не политики IETF. Это одна из причин, по которой сертификат, созданный с помощью OpenSSL (который обычно соответствует IETF), иногда не проверяется в браузере (браузеры следуют CA / B). Это разные стандарты, разные политики выдачи и разные требования к валидации.
Создайте самозаверяющий сертификат (обратите внимание на добавление -x509
опции):
openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.cert.pem
Создайте запрос на подпись (обратите внимание на отсутствие -x509
опции):
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
Распечатать самоподписанный сертификат :
openssl x509 -in example-com.cert.pem -text -noout
Распечатать запрос на подпись :
openssl req -in example-com.req.pem -text -noout
Файл конфигурации (передается через -config
опцию)
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
# Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
# IPv6 localhost
# DNS.8 = ::1
Возможно, вам придется сделать следующее для Chrome. В противном случае Chrome может пожаловаться на неправильное общее имя ( ERR_CERT_COMMON_NAME_INVALID
) . Я не уверен, какова связь между IP-адресом в SAN и CN в этом случае.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
Существуют и другие правила обработки имен DNS в сертификатах X.509 / PKIX. Обратитесь к этим документам для правил:
RFC 6797 и RFC 7469 перечислены, потому что они более строгие, чем другие документы RFC и CA / B. RFC 6797 и 7469 также не разрешают использование IP-адреса.