Как создать ЦС с помощью openssl *с минимальными затратами*

Уже есть ответы о создании самоподписанного сертификата с помощью openssl, например this< /а>. Однако мне нужен сертификат, который может только аутентифицировать и шифровать трафик на предопределенные веб-сайты.

Сертификат, сгенерированный следующей командой

 openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365

имеет базовое ограничение / центр сертификации, установленное на YES, что означает, что его можно использовать для подписи других сертификатов. Предположим, что мой домен mystackoverflow.com, злоумышленник, который украл мой закрытый ключ, сможет не только MITM подключиться к mystackoverflow.com, но также и к facebook.com или google.com, потому что он может подписывать поддельные сертификаты с указанным закрытым ключом и получить доверие моей системы.

Итак, вопрос в том, как мне свести к минимуму силу этого сертификата, чтобы он не мог подписывать дополнительные ключи, подписывать коды, шифровать электронные письма или делать что-либо, кроме защиты https-соединения с определенным веб-сайтом?


person Siyuan Ren    schedule 21.02.2015    source источник
comment
Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, Суперпользователь или обмен стеками информационной безопасности будет лучше спросить.   -  person jww    schedule 22.02.2015
comment
Извините за закрытое голосование. Я подумал, что это хороший вопрос, и вы получили мой голос.   -  person jww    schedule 22.02.2015
comment
@jww: я тоже думал о том, чтобы опубликовать информацию о суперпользователе или о безопасности. Но я нашел множество подобных вопросов на SO, поэтому разместил его здесь.   -  person Siyuan Ren    schedule 22.02.2015
comment
Я бы не слишком беспокоился об этом. Я, как правило, немного более жестко отношусь к теме и не к теме, поэтому я закрываю все, что не имеет прямого отношения к программированию или разработке. Вопросы и ответы по программированию и разработке являются основной целью SO, поэтому все вопросы должны пройти этот тест для меня. Сообщество более терпимо и обычно с радостью принимает такие вопросы как этот.   -  person jww    schedule 22.02.2015


Ответы (2)


Мне нужен сертификат, который не может ничего делать, кроме как аутентифицировать и шифровать трафик на предопределенные веб-сайты... Итак, вопрос в том, как мне минимизировать силу этого сертификата, чтобы он не мог подписывать дополнительные ключи, подписывать коды, шифровать электронные письма или делать что-нибудь, кроме защиты https-соединения с определенным веб-сайтом?

В этом вопросе три части.

Во-первых, как «аутентифицировать и шифровать [вещи]». Это обрабатывается использованием ключа и расширенным использованием ключа. В частности, такие биты, как digitalSignature (обмен ключами подписи, например Диффи-Хеллмана), keyEncipherment (передача ключей, например RSA), serverAuth и т. д.

Во-вторых, как не чеканить сертификаты. Для сертификатов конечного объекта (т. е. сертификатов сервера) вы удаляете базовое ограничение CA=true и удаляете биты keyCertSign. Вам по-прежнему потребуется промежуточный ЦС с возможностью подписывать сертификаты конечных объектов, потому что именно здесь применяется политика «этот ЦС может выдавать только эти имена».

В-третьих, как применить политику типа «этот ЦС может выдавать только эти имена». Согласно правилам IETF для PKIX в RFC 5280, вы можете сделать это в сертификате ЦС с помощью расширение ограничений имен. Подробнее см. в разделе 4.2.1.10.

Вы можете сделать это в соответствии с правилами CA/Browser Forum, потому что у них есть объекты политики. Но я не знаю, как это сделать под CA/B (это может быть то же самое, что и IETF).

Вы должны быть осторожны с оборудованием IETF. У них есть расширения, но нет правил. Поэтому вам нужно убедиться, что вы работаете в рамках существующего расширения, а не создаете новую политику. См. OID для сертификатов, выпущенных в соответствии с политикой IETF? на Список рассылки PKIX для получения более подробной информации.

Форум CA/B важен, потому что браузеры следуют правилам форума CA/B, а не IETF. У CA/B Forum и IETF разные требования в нескольких ключевых областях. Вот почему сертификат, созданный с помощью OpenSSL (который следует рекомендациям IETF), не проходит проверку в браузерах (которые следуют рекомендациям форума CA/B).


Сертификат, сгенерированный следующей командой: openssl req ...

Это раньше было способом сделать это, но не как это сделать сегодня. Сегодня он создает неверный сертификат (который может вызвать или не вызвать проблемы, в зависимости от вашего пользовательского агента). На указанный вами вопрос один ответ, в частности, говорит вам, почему это неправильно и как это сделать.

person jww    schedule 21.02.2015
comment
Я перечитал вопрос, который цитирую, и все ответы предполагают использование openssl req. Что я пропустил? - person Siyuan Ren; 22.02.2015
comment
@Siyuan - openssl req поместит имя в CN, что неверно. Вам нужен этот ответ на указанный вами вопрос. Он говорит вам не помещать имя в CN; скорее поместите его в SAN. Чтобы использовать SAN для имен, вы должны использовать файл OpenSSL CONFIG, поскольку в инструментах командной строки эта функция отсутствует. Отсутствие файла CONFIG было для меня красным флажком. Он сказал мне, что вы делаете что-то неправильно. (Вы все еще можете делать что-то неправильно с файлом CONFIG, но это другая проблема для другого дня;) - person jww; 22.02.2015
comment
Я принял ваш ответ, и он может быть полезен для будущих читателей. Но вместо этого я решил прибегнуть к ssh-туннелированию, чтобы обезопасить свое соединение. SSH намного проще настроить, и почти невозможно открыть дыры в безопасности, в отличие от пользовательских сертификатов. - person Siyuan Ren; 23.02.2015
comment
@Siyuan - я думаю, вы, вероятно, сделали правильный выбор. - person jww; 24.02.2015

.. злоумышленник, который крадет мой закрытый ключ ..

Итак, вопрос в том, как свести к минимуму силу этого сертификата, чтобы он не мог подписывать дополнительные ключи, подписывать коды, шифровать электронные письма или делать что-либо, кроме как защищать https-соединение с определенным веб-сайтом?

Если вы опасаетесь, что злоумышленник может украсть ключ к сертификату, а затем подписать им другие вещи, вам не следует создавать самозаверяющий сертификат. Вместо этого создайте сначала свой собственный ЦС. Затем создайте листовой сертификат, который нельзя использовать для подписи сертификатов, и подпишите его собственным ЦС. Как только это будет сделано, поместите закрытый ключ ЦС подальше (в автономном режиме или даже уничтожьте его, если он вам не нужен для подписи дополнительных сертификатов).

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

person Steffen Ullrich    schedule 21.02.2015
comment
Эх, не могли бы вы привести краткий пример того, какие команды я выполняю, чтобы создать свой собственный CA, листовой сертификат и подписать последний первым? Я пытался читать руководство по openssl, но это очень запутанно. - person Siyuan Ren; 22.02.2015
comment
Это было задокументировано уже много. Используйте google. - person Steffen Ullrich; 22.02.2015
comment
Я тоже думал о подписании листовых сертификатов и погуглил, прежде чем задать этот вопрос. Но различные методы в Интернете, похоже, не согласуются друг с другом. Некоторые используют команды req, некоторые утверждают, что openssl req устарели; некоторые говорят, что мне нужно отредактировать какой-то файл конфигурации перед выполнением команд. И некоторые из них используют sha1 , 1024-битные ключи RSA или другие небезопасные параметры. Вот почему я обращаюсь к stackoverflow за более определенным ответом, отвечающим современным стандартам безопасности. - person Siyuan Ren; 22.02.2015
comment
В основном учебники, которые я нахожу в Интернете, почти всегда содержат некоторые слабые алгоритмы в современном мире, и я не знаю, сколько еще недостатков в этих учебниках. Это проблема с безопасностью; непрофессионал не в состоянии отличить хороший совет от плохого. Я не могу просто скопировать и вставить команды и убедиться, что они работают; это работает только до того, как слабость будет фактически использована. - person Siyuan Ren; 22.02.2015
comment
Первое, что я получаю, это jamielinux.com/articles. /2013/08/ и он выглядит безопасным, т.е. использует SHA-256 и RSA 4096. Он обширен и хорошо написан, намного лучше, чем я сделал бы здесь. - person Steffen Ullrich; 22.02.2015