Я добавляю поддержку HTTPS на встроенное устройство Linux. Я попытался создать самозаверяющий сертификат с помощью этих шагов:
openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
Это работает, но я получаю некоторые ошибки, например, с Google Chrome:
Вероятно, это не тот сайт, который вы ищете!
Сертификат безопасности сайта не является доверенным!
Я что-то пропустил? Это правильный способ создания самозаверяющего сертификата?
ssl
openssl
certificate
ssl-certificate
x509certificate
michelemarcon
источник
источник
alternate_names
разделом и передать его с-config
опцией. Кроме того, размещение DNS-имени в Common Name (CN) не рекомендуется (но не запрещено) как IETF, так и CA / Browser Forums. Любое DNS-имя в CN также должно присутствовать в SAN. Нет способа избежать использования SAN. Смотрите ответ ниже.Ответы:
Вы можете сделать это одной командой:
Вы также можете добавить
-nodes
(сокращениеno DES
), если вы не хотите защищать свой закрытый ключ парольной фразой. В противном случае вам будет предложено ввести пароль как минимум из 4 символов.days
Параметр (365) можно заменить любое число , чтобы повлиять на дату истечения срока действия. Затем вам будет предложено указать такие вещи, как «Название страны», но вы можете просто нажать Enterи принять значения по умолчанию.Добавьте
-subj '/CN=localhost'
для подавления вопросов о содержании сертификата (заменитеlocalhost
на нужный домен).Самозаверяющие сертификаты не проверяются третьими лицами, если вы ранее не импортировали их в браузеры. Если вам нужна дополнительная безопасность, вы должны использовать сертификат, подписанный центром сертификации (CA).
источник
-subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=www.example.com"
-sha256
для генерации сертификата на основе SHA-256.Создать самозаверяющий сертификат легко. Вы просто используете
openssl req
команду. Это может быть сложно создать тот, который будет использоваться самым большим выбором клиентов, таких как браузеры и инструменты командной строки.Это сложно, потому что браузеры предъявляют свои собственные требования, и они более строгие, чем IETF . Требования, используемые браузерами, задокументированы на форумах CA / Browser (см. Ссылки ниже). Ограничения возникают в двух ключевых областях: (1) доверительные якоря и (2) DNS-имена.
Современные браузеры (например, Warez, который мы используем в 2014/2015 гг.) Хотят получить сертификат, привязанный к доверенному якору, и хотят, чтобы DNS-имена были представлены в сертификате особым образом. И браузеры активно движутся против самозаверяющих серверных сертификатов.
Некоторые браузеры не позволяют легко импортировать самозаверяющий сертификат сервера. На самом деле, вы не можете с некоторыми браузерами, такими как браузер Android. Таким образом, полное решение - стать вашим собственным авторитетом.
Если вы не обладаете собственными полномочиями, вы должны правильно присвоить DNS-имена, чтобы сертификат имел наибольшие шансы на успех. Но я бы посоветовал вам стать вашим собственным авторитетом. Легко стать вашим собственным авторитетом, и он обойдет все вопросы доверия (кому лучше доверять, чем вам?).
Это связано с тем, что браузеры используют предопределенный список якорей доверия для проверки сертификатов сервера. Самозаверяющий сертификат не связывается с доверенным якорем.
Лучший способ избежать этого:
Шаг 1 - Создать свой собственный авторитет - значит создать самозаверяющий сертификат с
CA: true
правильным использованием ключа. Это означает, что Субъект и Эмитент - это одна и та же сущность, CA имеет значение true в Базовых ограничениях (это также должно быть помечено как критическое), использование ключа -keyCertSign
иcrlSign
(если вы используете CRL), а Идентификатор ключа субъекта (SKI) - такой же как идентификатор ключа авторизации (AKI).Чтобы стать вашим собственным центром сертификации, см. * Как подписать запрос на подпись сертификата в вашем центре сертификации? Переполнение стека. Затем импортируйте свой CA в Trust Store, используемый браузером.
Шаги 2 - 4 примерно то , что вы делаете сейчас для публики перед сервером , когда вы заручиться услугами ЦС как Startcom или CAcert . Шаги 1 и 5 позволяют вам избежать сторонних полномочий и действовать как свои собственные полномочия (кому лучше доверять, чем себе?).
Следующий лучший способ избежать предупреждения браузера - это доверять сертификату сервера. Но некоторые браузеры, такие как браузер Android по умолчанию, не позволяют вам сделать это. Так что это никогда не будет работать на платформе.
Проблема браузеров (и других подобных пользовательских агентов), не доверяющих самозаверяющим сертификатам, станет большой проблемой в Интернете вещей (IoT). Например, что произойдет, когда вы подключитесь к своему термостату или холодильнику, чтобы запрограммировать его? Ответ: ничего хорошего в отношении пользовательского опыта.
Рабочая группа W3C WebAppSec начинает изучать проблему. См., Например, Предложение: Пометка HTTP как незащищенного .
Приведенные ниже команды и файл конфигурации создают самозаверяющий сертификат (он также показывает, как создать запрос на подпись). Они отличаются от других ответов в одном отношении: имена DNS, используемые для самозаверяющего сертификата, находятся в дополнительном имени субъекта (SAN) , а не в общем имени (CN) .
Имена DNS помещаются в SAN через файл конфигурации со строкой
subjectAltName = @alternate_names
(это невозможно сделать через командную строку). Тогда естьalternate_names
раздел в файле конфигурации (вы должны настроить его на свой вкус):Важно ввести 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
опции):Создайте запрос на подпись (обратите внимание на отсутствие
-x509
опции):Распечатать самоподписанный сертификат :
Распечатать запрос на подпись :
Файл конфигурации (передается через
-config
опцию)Возможно, вам придется сделать следующее для Chrome. В противном случае Chrome может пожаловаться на неправильное общее имя (
ERR_CERT_COMMON_NAME_INVALID
) . Я не уверен, какова связь между IP-адресом в SAN и CN в этом случае.Существуют и другие правила обработки имен DNS в сертификатах X.509 / PKIX. Обратитесь к этим документам для правил:
RFC 6797 и RFC 7469 перечислены, потому что они более строгие, чем другие документы RFC и CA / B. RFC 6797 и 7469 также не разрешают использование IP-адреса.
источник
alternate_names
разделе? Особенно суб-субдомены. У меня есть вопрос, ссылающийся на этот ответ здесь: serverfault.com/questions/711596/…Вот варианты, описанные в ответе @ diegows , более подробно описанном в документации :
Документация на самом деле более подробная, чем выше; Я просто резюмировал это здесь.
источник
XXX
В исходной команде должно быть заменено на "количество дней , чтобы удостоверять сертификат. По умолчанию 30 дней. Например,-days XXX
становится,-days 365
если вы хотите, чтобы ваш сертификат действовал в течение 365 дней. Смотрите документы для получения дополнительной информации .Начиная с 2020 года, следующая команда обслуживает все ваши потребности, включая SAN:
В OpenSSL ≥ 1.1.1 это можно сократить до:
Это создает сертификат, который
example.com
иexample.net
(SAN),10.0.0.1
(SAN),3650
дней (~ 10 лет).Создает следующие файлы:
example.key
example.crt
Вся информация предоставляется в командной строке. Там нет интерактивного ввода, который раздражает вас. Там нет конфигурационных файлов, с которыми вы должны возиться. Все необходимые шаги выполняются одним вызовом OpenSSL : от генерации закрытого ключа до самозаверяющего сертификата.
Замечание № 1: параметры шифрования
Поскольку сертификат самоподписан и должен приниматься пользователями вручную, нет смысла использовать короткий срок действия или слабую криптографию.
В будущем, возможно, вы захотите использовать больше чем
4096
биты для ключа RSA и более сильный алгоритм хэшированияsha256
, но с 2020 года это нормальные значения. Они достаточно сильны, хотя поддерживаются всеми современными браузерами.Замечание № 2: параметр "
-nodes
"Теоретически вы можете опустить
-nodes
параметр (что означает «без шифрования DES»), в этом случаеexample.key
будет зашифрован с помощью пароля. Тем не менее, это почти никогда не полезно для установки на сервере, поскольку вам придется либо хранить пароль на сервере, либо вводить его вручную при каждой перезагрузке.Замечание № 3: Смотрите также
источник
//CN=localhost
вместо этого создается сертификат/CN=localhost
? Поможет ли здесь правильный побег? Например, решает ли замена/CN=localhost
с"/CN=localhost"
чистой проблемой?Я не могу комментировать, поэтому я поставлю это как отдельный ответ. Я нашел несколько вопросов с принятым однострочным ответом:
Вот упрощенная версия, которая удаляет ключевую фразу, повышает безопасность для подавления предупреждений и включает предложение в комментариях для передачи в -subj для удаления полного списка вопросов:
Замените localhost на любой домен, который вам требуется. Вам нужно будет выполнить первые две команды одну за другой, поскольку OpenSSL предложит ввести ключевую фразу.
Чтобы объединить их в файл .pem:
источник
cat server.crt server.key >foo-cert.pem
. Работает с примером вopenssl-1.0.2d/demos/ssl/
FreeBSD 10
OpenLDAP 2.4
сTLS
Современные браузеры теперь выдают ошибку безопасности для правильно сформированных самозаверяющих сертификатов, если им не хватает SAN (Subject Alternate Name). OpenSSL не предоставляет способ командной строки указать это , поэтому многие учебные пособия и закладки для разработчиков неожиданно устарели.
Самый быстрый способ возобновить работу - это короткий автономный файл конфигурации:
Создайте файл конфигурации OpenSSL (пример:
req.cnf
)Создайте сертификат, ссылающийся на этот файл конфигурации
Пример конфигурации из https://support.citrix.com/article/CTX135602
источник
-sha256
.-extension 'subjectAltName = DNS:dom.ain, DNS:oth.er'
см. Github.com/openssl/openssl/pull/4986-addext
сейчас.Я бы порекомендовал добавить параметр -sha256 , чтобы использовать алгоритм хеширования SHA-2, поскольку основные браузеры рассматривают возможность отображения «сертификатов SHA-1» как небезопасных.
Та же самая командная строка из принятого ответа - @diegows с добавленным -sha256
Больше информации в блоге безопасности Google .
Обновление май 2018. Как отмечалось в комментариях, многие из них не используют никакой безопасности для самозаверяющего сертификата. Но я все же рекомендую использовать его как хорошую привычку не использовать устаревшие / небезопасные криптографические хеш-функции. Полное объяснение доступно в разделе Почему для сертификатов выше сертификата конечного объекта можно использовать SHA-1? ,
источник
Это сценарий, который я использую на локальных компьютерах для установки SAN (subjectAltName) в самозаверяющих сертификатах.
Этот сценарий берет имя домена (example.com) и создает SAN для * .example.com и example.com в одном сертификате. Разделы ниже комментируются. Назовите сценарий (например,
generate-ssl.sh
) и дайте ему права на выполнение. Файлы будут записаны в тот же каталог, что и скрипт.Chrome 58 и более поздних версий требует, чтобы SAN был установлен в самозаверяющих сертификатах.
Этот сценарий также записывает информационный файл, поэтому вы можете проверить новый сертификат и убедиться, что SAN настроен правильно.
Если вы используете Apache, вы можете сослаться на вышеуказанный сертификат в файле конфигурации следующим образом:
Не забудьте перезапустить сервер Apache (или Nginx, или IIS), чтобы новый сертификат вступил в силу.
источник
localhost
или127.0.0.1:port#
что будет соответствоватьCN
для чего-то вроде этого.2017 однострочный:
Это также работает в Chrome 57, так как он предоставляет SAN, не имея другого файла конфигурации. Это было взято из ответа здесь .
Это создает один файл .pem, который содержит как закрытый ключ, так и сертификат. Вы можете переместить их в отдельные файлы .pem, если это необходимо.
источник
/etc/ssl/openssl.conf
работаетЯ не могу комментировать, поэтому я добавляю отдельный ответ. Я попытался создать самозаверяющий сертификат для NGINX, и это было легко, но когда я захотел добавить его в белый список Chrome, у меня возникла проблема. И я решил создать корневой сертификат и подписать им дочерний сертификат.
Итак, шаг за шагом. Создать файл config_ssl_ca.cnf. Обратите внимание, что в файле конфигурации есть опция basicConstraints = CA: true, которая означает, что этот сертификат должен быть корневым.
Следующий файл конфигурации для вашего дочернего сертификата.
Первый шаг - создание корневого ключа и сертификата
На втором этапе создается дочерний ключ и файл CSR - запрос на подпись сертификата. Потому что идея заключается в том, чтобы подписать дочерний сертификат root и получить правильный сертификат
Откройте терминал Linux и выполните эту команду echo 0
ca.srl текстовый файл , содержащий следующий серийный номер для использования в шестнадцатеричном формате. Обязательное. Этот файл должен присутствовать и содержать действительный серийный номер.
Последний шаг, создайте еще один файл конфигурации и назовите его config_ca.cnf
Вы можете спросить, почему так сложно, почему мы должны создать еще один конфиг для подписи дочернего сертификата root. Ответ прост, потому что дочерний сертификат должен иметь блок SAN - Subject Alternative Names. Если мы подписываем дочерний сертификат утилитой openssl x509, корневой сертификат удалит поле SAN в дочернем сертификате. Поэтому мы используем «openssl ca» вместо «openssl x509», чтобы избежать удаления поля SAN. Мы создаем новый конфигурационный файл и сообщаем ему, чтобы он копировал все расширенные поля copy_extensions = copy .
Программа задает вам 2 вопроса: 1. Подписать сертификат? Скажите «Y» 2. 1 из 1 запросов на сертификат сертифицирован, зафиксировать? Скажи "Y"
В терминале вы можете увидеть предложение со словом «База данных», это означает файл index.txt, который вы создаете командой «touch». Он будет содержать всю информацию по всем сертификатам, которые вы создаете с помощью утилиты "openssl ca". Для проверки правильности использования сертификата:
Если вы хотите увидеть, что внутри в CRT:
Если вы хотите увидеть, что внутри в CSR:
источник
У вас правильная общая процедура. Синтаксис команды приведен ниже.
Тем не менее, предупреждения отображаются, потому что браузер не смог проверить идентификацию путем проверки сертификата с помощью известного центра сертификации (CA).
Так как это самозаверяющий сертификат, нет CA, и вы можете спокойно проигнорировать предупреждение и продолжить. Если вы хотите получить настоящий сертификат, который будет узнаваем кем-либо в общедоступном Интернете, то процедура ниже.
У меня есть более подробная информация об этом в посте « Защита соединения: создание сертификата безопасности с OpenSSL».
источник
Один лайнер FTW. Мне нравится быть простым. Почему бы не использовать одну команду, которая содержит ВСЕ необходимые аргументы? Вот как мне это нравится - это создает сертификат x509 и его ключ PEM:
Эта единственная команда содержит все ответы, которые вы обычно предоставляете для деталей сертификата. Таким образом, вы можете установить параметры и запустить команду, получить выходные данные - затем пойти на кофе.
>> Подробнее здесь <<
источник
Однострочная версия 2017:
CentOS:
Ubuntu:
Редактировать: добавлен предшествующий слеш в 'subj' для Ubuntu.
источник
На моей установке сервер Ubuntu вошел в систему:
/var/log/mysql/error.log
Последующие заметки:
SSL error: Unable to get certificate from '...'
MySQL может быть отказано в доступе на чтение к вашему файлу сертификата, если он не находится в конфигурации apparmors . Как упоминалось в предыдущих шагах ^, сохраните все наши сертификаты в виде
.pem
файлов в/etc/mysql/
каталоге, который по умолчанию утвержден apparmor (или измените ваш apparmor / SELinux, чтобы разрешить доступ к ним, где бы вы ни хранили их).SSL error: Unable to get private key
Ваша версия сервера MySQL может не поддерживать
rsa:2048
формат по умолчаниюПреобразовать сгенерированный
rsa:2048
в обычныйrsa
с:Проверьте, поддерживает ли локальный сервер SSL :
Проверка соединения с базой данных защищена SSL :
Требовать ssl для подключения конкретного пользователя ('require ssl'):
Альтернативная ссылка: подробное руководство по безопасным PHP-соединениям с MySQL по SSL .
источник
Как подробно обсуждалось, самоподписанные сертификаты не являются доверенными для Интернета . Вы можете добавить свой самозаверяющий сертификат во многие, но не во все браузеры . В качестве альтернативы вы можете стать вашим собственным центром сертификации .
Основная причина, по которой человек не хочет получать подписанный сертификат от центра сертификации, - это стоимость - Symantec взимает от 995 до 1999 долларов в год за сертификаты - только за сертификат, предназначенный для внутренней сети, Symantec взимает 399 долларов в год. . Эту стоимость легко оправдать, если вы обрабатываете платежи по кредитным картам или работаете в центре прибыли высокодоходной компании. Это больше, чем многие могут себе позволить для личного проекта, который каждый создает в Интернете, или для некоммерческой организации, работающей с минимальным бюджетом, или если вы работаете в центре затрат организации - центры затрат всегда пытаются сделать больше менее.
Альтернативой является использование certbot (см. О certbot ). Certbot - это простой в использовании автоматический клиент, который выбирает и развертывает сертификаты SSL / TLS для вашего веб-сервера.
Если вы настроили certbot, вы можете разрешить ему создавать и поддерживать для вас сертификат, выданный центром сертификации Let's Encrypt .
Я сделал это на выходных для своей организации. Я установил необходимые пакеты для certbot на своем сервере (Ubuntu 16.04) и затем выполнил команду, необходимую для настройки и включения certbot. Вероятно, для certbot нужен плагин DNS - в настоящее время мы используем DigitalOcean, хотя, возможно, скоро перейдем на другой сервис.
Обратите внимание, что некоторые инструкции были не совсем верными и заняли время, чтобы разобраться с Google. В первый раз это заняло довольно много времени, но теперь я думаю, что смогу сделать это за считанные минуты.
Что касается DigitalOcean, я столкнулся с трудностями, когда мне предложили ввести путь к INI-файлу учетных данных DigitalOcean. Сценарий ссылается на страницу Приложения и API и вкладку Токены / Ключ на этой странице. Вам необходимо иметь или сгенерировать личный токен доступа (чтение и запись) для API DigitalOcean - это шестнадцатеричная строка из 65 символов. Затем эту строку необходимо поместить в файл на веб-сервере, с которого вы запускаете certbot. Этот файл может содержать комментарий в качестве первой строки (комментарии начинаются с #). Вторая строка:
Как только я понял, как настроить токен чтения и записи для API DigitalOcean, было довольно легко использовать certbot для установки сертификата с подстановочными знаками . Обратите внимание, что не нужно настраивать подстановочный сертификат, вместо этого можно указать каждый домен и поддомен, к которому требуется применить сертификат. Это был подстановочный сертификат, который требовал INI-файл учетных данных, содержащий личный токен доступа от DigitalOcean.
Обратите внимание, что сертификаты открытого ключа (также известные как сертификаты идентификации или сертификаты SSL) истекают и требуют обновления. Таким образом, вам необходимо будет обновлять свой сертификат на периодической (повторяющейся) основе. Документация certbot покрывает продление сертификатов .
Мой план состоит в том, чтобы написать скрипт, который будет использовать команду openssl, чтобы получить дату истечения срока действия моего сертификата и инициировать продление по истечении 30 дней или менее до его истечения. Затем я добавлю этот скрипт в cron и буду запускать его один раз в день.
Вот команда для чтения даты истечения срока действия вашего сертификата:
источник