Compatibility: OpenSSL, Cisco, Red Hat, Siemens, Nokia, IBM.
Вступ
Ця стаття могла би називати «Як написати CMP сервер за 30 хвилин»,
але на відміну від попередньої статті про LDAP, ця вже покриває
більше ніж тузінь ASN.1 файлів, добре шо ми вже познайомилися
з CMS та LDAP бібіліотеками та їх ASN.1 файлами. В цій статті про CMP
нас в основному цікавитимуть PKIXCMP-2009, PKIXCRMF-2009 та
EnrollmentMessageSyntax-2009 для CMC.
CSR
Отже починається написання CMP серверу з найголовнішої його функції:
видачі сертифікату по PCKS-10 CSR реквесту. Схема наступна:
Клієнт генерує приватний ключ, конвертує його в PEM файл, відсилає як
P10CR повідомлення у складі payload PKIMessage, отримує відповідь
CP, після чого клієнт шле ще одне повідомлення CERTCONF, після
якого CMP сервер повинен відповисти PKICONF повідомленням.
RFC2510
Перед початком роботи CMP сервера повинен бути згенерований рутовий CA
сертифікат з приватним ключем, ці два файла ми зберігаємо на диск,
і у всіх подальших операціях користуємося ними. Для генерації файлів
використовуємо функцію CA.CSR.ca.
Для одноразовоїї генерації серверних сертифікатів які
обсуговують клієнтські TLS сесії можна використати наступний код.
CMS
Детально сімейство протоколів і CMS кодування описано в
окремій статті присвяченій CMS Compliance.
CMS кодування використовується тільки для CMC сервера, тому
ми це поки висвітлювати не будемо.
CMP/CSR/TCP
RFC 6712, 4210. Для початку напишемо простий PKIMessage сервер.
PKIMessage.protection
Розберемося з полем PKIMessage.protection, в якому
зберігається результат PBKDF2 алгоритма. Майте на увазі
шо OpenSSL за замовчування використовує 20-байтні ключі
та HMAC/SHA-1 у якості MAC функції, хоча OWF в 500 ітераціях
обчислюється за допомогою OWF функції SHA-256.
ANSWER
Оскільки CMP сервер повинен працювати по HTTP/1.0
згідно стандартів додаємо необхідні HTTP заголовки.
P10CR/CP
Запускаємо сервер та генеруємо сертифікати CA та CSR користувача:
Запускаємо клієнтський запит за допомогою OpenSSL:
Пишему функцію видачі сертифікату:
CERTCONF/PKICONF
В результаті в консолі повинні спостерігати:
GENM/GENP
Далі можете написати інші функції:
IR/IP
CR/CP
CMC/CMS/TCP
RFC 5272--5274, 2797, 6402.
EST/CMS/TLS
RFC 7030
Висновки
Ну PasswordBasedMac в нас є, тепер треба DHMac, але shared secret
можна і в PBM засунути. Є ше Proof Of Posession (POP) — там зразу
ECDSA verify. Я до речі думаю в CA тримати ключі для всіх кривих,
і коли я виставлятиму сервіс то я буду виставляти його на N портах
і N ключах, щоб будь який клієнтський TLS сертифікат приймався як рідний!
Chat 💬 X.509 дає можливість вибирати TLS сертифікати автоматично по
обраних кривих. Ви вибираєте під якими ключами сьогодні заходити.
LDAP, MQTT, NS, CA — в кожного сервісу свої N портів і N серверних
TLS сертифікатів. Передбачається що перший сертифікат видається DH
по TCP а потім зразу всьо переходить в TLS режим і всі наступні
сертифікати вже видаються всередині клієнтського TLS. При реєстрації
користувач зразу доступний в LDAP якшо захотів зробити себе відкритим
для пошуку. Після реєстрації пошук в директорії і френдування (обмін
ключами) і поїхали чат в обгортках CAdES, CMS, ECDSA/AES — лейби біля
повідомлень ПІДПИС/ШИФР.