Я створив авторизований сертифікат root для декількох внутрішніх служб в нашій компанії, який я налаштував сам (в основному обслуговувався через HTTPS). Тоді я створив сертифікати для цих служб, підписані з цією ЦА.
Тепер я хочу додати розширення x509 (точку розподілу CRL) до кореневого CA без недійсності існуючих сертифікатів сервера, виданих з цього CA. Чи можливо це?
Моє відчуття кишечника "так", тому що, як я розумію, доступ до відповідного приватного ключа необхідний і достатній для "повного повноваження" щодо посвідчення сертифікату. Тобто, якщо в сертифікаті під час генерування (ймовірно) не включено якесь поняття разом із відкритим ключем.
Я все ще досить новачок в управлінні сертифікатами SSL, але я (думаю, що я) розумію основи стандартного ланцюга довіри. Мені також подобається базове використання інших криптовалют PKI: я керую ключами SSH та використовую GPG для підписання та шифрування. Я вивчав комп’ютерні науки, хоч я лише криміналіст-самоучка.
Я ніколи не робив КСВ для оригінального IIRC (я думаю, це був прямий вихід openssl req -new -x509
). Я, звичайно, зберігаю оригінальний приватний ключ CA, і, використовуючи його, я зміг "повернути" початковий сертифікат до запиту підпису сертифіката:
openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key
Я сподівався, що це ефективно "витягне" згадуваний вище поняття, і дозволить мені відтворити сертифікат, але на цей раз з crlDistributionPoints
полем, і, отже, всі сертифікати, підписані з оригінальним сертифікатом, все ще підтверджують цей новий КА, за винятком що клієнти отримають мій (наразі порожній) файл CRL з URL-адреси HTTP, зазначеної в полі.
Тому я зробив конфігураційний файл розширення ext.conf
:
[ cert_ext ]
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl
І я створив нову версію кореневого CA з CSR:
openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem
Тепер, коли я переглядаю сертифікат с openssl x509 -text -in MyNewCA.pem | less
Я бачу частину розширення CRL:
X509v3 extensions:
X509v3 Subject Key Identifier:
82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
X509v3 CRL Distribution Points:
Full Name:
URI:http://security.mycompany.co.za/root.crl`
Але на жаль! Мої раніше підписані сертифікати більше не підтверджують цей:
openssl verify -verbose -CAfile MyCA.pem git.pem
git.pem: OK
openssl verify -verbose -CAfile MyNewCA.pem git.pem
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate
Переважно я шукаю більше розуміння того, як працюють сертифікати та чому. Але я також вітаю вирішення проблеми, що призводить до цієї проблеми, тому тут також є деяка довідкова інформація.
Як я потрапив у цей безлад: HTTPS для внутрішніх служб чудово спрацьовує, коли мій ЦП встановлений через RMB Explorer → Встановити інтерфейс інтерфейсу сертифікатів у Windows, а /usr/local/share/ca-certificates
потім update-ca-certificates
на Debian та Ubuntu. Але я нещодавно зіткнувся з винятком: Git в Windows, зокрема, якщо він встановлений, щоб використовувати захищений канал Windows як резервний SSL. Що, мабуть, за замовчуванням наполягає на тому, що у сертифікатах SSL повинно бути поле CRL.
Тож я гадаю, що це справді проблема із захищеним каналом Windows, оскільки повідомлення про помилку, до якого я продовжую працювати, видається цілком специфічним для Microsoft: fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.
Якщо я встановлю Git за допомогою OpenSSL і вручну з'єднаю мій КА на файл, на який вказує git.http.sslcainfo, він працює, але я побоююся, що мої користувачі будуть схильні ні до чого не перевіряти SSL, якщо вони вважають, що цей процес докладе більше зусиль, ніж натиснувши "простий" графічний інтерфейс для встановлення сертифікатів Windows.
-x509toreq
відновить всю унікальну інформацію з існуючого кореневого центру, але це не так, або з моїм процесом звідти щось не так.
req -new -x509
і x509 -req -signkey
обидва за замовчуванням послідовність самопідписаного cert до випадкового числа (хоча це може бути відмінено) фактично не має значення. Якщо ваш дочірний сертифікат (або будь-який з них) містить AuthorityKeyIdentifier, що використовує опцію "видавець + серійний" (замість або на додаток до опції "keyid"), що буде у випадку, якщо ви використовували ca
конфігураційний файл за замовчуванням за версією, потрібно створити новий корінь з таким же послідовним, як і старий; використання -set_serial
. ...