Чи можна обмежити використання кореневого сертифіката доменом


28

Мій клієнт використовує самопідписаний сертифікат для роботи програми. Щоб мати можливість працювати, я повинен встановити кореневий сертифікат, який вони використовували для підписання сертифіката.

Чи можна налаштувати кореневий сертифікат, щоб він перевіряв лише один домен?


Це може бути просто я, але мені незрозуміло, що ви насправді просите. Який кінцевий стан ви намагаєтеся досягти? Якщо ви імпортуєте їх кореневий сертифікат у довіру контролерів домену, то просто системи під цим доменом зможуть перевірити його ...
Gravy

Це здається, що ви плутаєте самопідписані сертифікати з використанням кореневого ЦС, який не є публічно довіреним. Програма, налаштована на використання самопідписаного сертифіката, дуже погана, оскільки програму потрібно було б налаштувати на ігнорування помилок перевірки сертифікатів. Використання кореневого ЦС, якому публічно не довіряють, насправді є досить поширеним явищем.
Грег Аскеу

у вас внутрішній сервер CA?
Crypt32

1
CA може обмежитися певними доменами з обмеженнями імен , але застосувати обмеження заднім числом до чужого ЦС - справа інша.
Метт Нордхофф

3
різниці немає. Ви можете застосувати обмеження імен і до сторонніх ЦА. Ви просто підписуєте сторонній сертифікат кореневого сертифіката з використанням приватного сертифікату та публікуєте створений крос-сертифікат. У цьому випадку іноземний ланцюг перейде до вашої приватної мережі через обмежений крос-сертифікат.
Crypt32

Відповіді:


24

Як правило:

Ні , мається на увазі довіра до сертифіката CA клієнта - це довіра до кожного сертифіката, підписаного цим КА.

Я не знаю жодних додатків / бібліотек, які мають простий варіант, який дозволяє кінцевому користувачеві вибрати, що ви будете довіряти своїм клієнтам або будь-якому іншому сертифікату CA лише для певних (суб) доменів, тобто лише для *. example.com та * .example.org та більше нічого.

Mozilla має аналогічну стурбованість щодо довірених урядових організацій, які спонсоруються зараз, як точки зору уваги, і, наприклад, у Chrome вбудовані додаткові перевірки для доступу до сайтів Google. Це стало тим, як розвідка * .google.com сертифікат і компроміс CA Diginotar стали публічними. .

Але навіть якщо ви не довіряєте CA, ви все одно можете імпортувати / довіряти певний серверний сертифікат, підписаний цим CA, що запобігає попередженням SSL для імен хостів у цьому сертифікаті. Це повинно змусити вашу програму працювати без помилок чи скарг.

Винятки:

Дуже мало використовуваним параметром стандарту X.509v3 PKI є розширення Name Constraints , яке дозволяє сертифікату CA містити білі та чорні списки шаблонів доменних імен, на які він має право видавати сертифікати.

Можливо, вам пощастить, і ваш клієнт стримував себе, коли він створив свою інфраструктуру PKI і включив це обмеження до імені у свій сертифікат CA Тоді ви можете імпортувати їх сертифікат CA безпосередньо та знати, що він може підтвердити лише обмежений діапазон доменних імен.


2
@CryptoGuy: Внутрішній СА може також видавати сертифікати для зовнішніх доменів. Після довіри до внутрішнього сертифікату немає обмежень, таких що лише сертифікати для вашого власного домену (Active Directory або DNS) example.comчи *.ad.example.com дійсні. Ваш внутрішній офіс може також видавати сертифікати на те, *.example.bankщо дозволяють приємно атакувати людину та переносити ваші облікові дані в Інтернет-банку.
HBruijn

1
Ну "все" не зовсім точно. Є такі речі, як списки відкликання сертифікатів. Але це не змінює суть.
Ben Voigt

1
вибачте, ви знову невірні. Ви можете обмежити сторонній КА довіреними сертифікатами (від цього КА), виданими списком імен, який бажаєте. Щодо вашого власного внутрішнього офіційного центру, я вважаю, що довіра не викликає сумнівів. Якщо ви не довіряєте власному ЦА, то з вашими ІТ щось не так. Хочу сказати, що, маючи приватний ЦО, ОП може встановити часткову довіру до третьої сторони ЦО (обмеживши імена, яким вони довіряють).
Crypt32

3
До вашої відредагованої публікації: навіть якщо сторонні офіційні організації не мають розширення з обмеженнями імен, їх можна застосувати за допомогою власного внутрішнього сервера ЦС за допомогою перехресної сертифікації. У цьому випадку ланцюг cert буде таким: листя SSL cert -> перехресний сертифікат -> ваш сертифікат CA -> ваш внутрішній кореневий сертифікат. Хитрість полягає в тому, що ви підписуєте сторонній сертифікат, використовуючи свій внутрішній сертифікат. І крос-сертифікат матиме всі необхідні обмеження.
Crypt32

1
CryptoGuy каже, що це можливо, але знайти деталі реалізації складне. Як щодо відповіді, що описує, як це можна досягти? І, можливо, обговорення того, які платформи підтримують nameConstraints.
jorfus

17

@CryptoGuy мав тут досить гарну відповідь, але я хотів розширити її.

Перефразовуючи:

Ви можете обмежити сторонній КА довіреними сертифікатами (від цього КА), виданими списком імен, який бажаєте. Навіть якщо сторонні CA не мають розширення з обмеженнями імен, можливо застосувати їх, використовуючи власний внутрішній сервер CA через перехресну сертифікацію. Хитрість полягає в тому, що ви підписуєте сторонній сертифікат, використовуючи свій внутрішній сертифікат.

листя SSL cert -> перехресний сертифікат -> ваш сертифікат CA -> ваш внутрішній кореневий сертифікат.

Ось як ви це зробите (використовуючи командний рядок OpenSSL CA)

Створіть простий СА

openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -out root-ca.crt -keyout root-ca.key -subj "/CN=My Root CA"

Ви можете пропустити створення проміжного СА

Створіть проміжний запит CA із обмеженнями на ім'я.

openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg

З цим у ossl_domain_com.cfgфайлі:

[ req ]
prompt=no
distinguished_name=req_distinguished_name
req_extensions=domain_ca

[ req_distinguished_name ]
CN=somedomain.com trust CA

[ domain_ca ]
basicConstraints=critical,CA:true,pathlen:1
nameConstraints=critical,permitted;DNS:.somedomain.com

Потім підпишіть цей проміжний домен CA з вашим CA.

openssl x509 -req -in domain-ca.req -CA root-ca.crt -CAkey root-ca.key -sha256 -set_serial 1 -out domain-ca.crt -extensions domain_ca -extfile ossl_domain_com.cfg

Якщо ви пропустили створення проміжного, використовуйте свій кореневий CA для підписання

Тепер перепідпишіть сертифікат оригіналу домену під вашими повноваженнями, використовуючи їх сертифікат. Тут можна додати розширення CA.

openssl x509 -in third_party_ca.crt -CA domain-ca.crt -CAkey domain-ca.key -set_serial 47 -sha256 -extensions domain_ca -extfile ossl_domain_com.cfg -out domain-cross-ca.crt

Вам може знадобитися використовувати -x509-to-reqаргумент для створення запиту, який ви підпишете точно так само, як проміжний вище.

Тепер додайте кореневий CA, проміжний CA та домен-cross-ca до бази даних довіри вашого браузера.


2
MacOS не підтримує nameConstraints. Просто FIY для тих, хто працює над внутрішнім CA. security.stackexchange.com/questions/95600/… archive.is/6Clgb
jorfus

Питання: який статус цього рішення? У яких системах він працює сьогодні (2018 р.)? // Я хотів цього робити кожен раз, коли мене змушують встановити ще одну компанію, яка підписала себе; і кожного разу, коли я замислююся про Гонконгське поштове відділення чи Symantec. // Я думаю, що мені може бути байдуже, якщо еверон не реалізує описане звуження, доки вони випадково не реалізують розширення.
Krazy Glew

@KrazyGlew У мене є пакетний файл, який я використовую для цього, і я його все ще регулярно використовую. Іноді мені доводиться перевидавати проміжні серти, коли вони закінчуються чи обертаються, тому це трохи більше посібника, але це не було проблемою. Я періодично наїжджаю на сайти, якими керуються повноваження, яким мій браузер не довіряє через використання іншого проміжного органу або додане додаткове доменне ім’я, яке моє не вірить.
davenpcj

2
Я тільки що успішно його використовую, дякую. Він чудово працює без проміжного сертифіката, чи є якась перевага у використанні одного? Крім того, basicConstraintsздається , що рядок у файлі конфігурації спричиняє розширення обмежень у сертифікат двічі, що призводить до того, що Firefox відхиляє сертифікат із повідомленням про криптичну помилку. Я думаю, це можна сміливо зняти.
wrtlprnft

Я отримую повідомлення про помилку на останній крок: error with certificate to be certified - should be self signed. Що це означає і як це вирішити? pastebin.ubuntu.com/p/QHhpQh2N6J
mymedia
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.