CA в "школьном" AltLinux'е

В рамках совместного с AlAn'ом проекта по созданию "школьной образовательной среды", как он это называет, наткнулся на интересные грабли в настройке альтовского сервера. Возможно, кому-то пригодится и сэкономит пару выходных.

Общие описание найденных граблей

В прошлые выходные столкнулся с граблями при настройке альтовского сервера.

Зачем это понадобилось: стоит этакий "контроллер домена" на альте, на нем стоит ldap с альтератором, рядом стоит файлсервер с самбой, где хранится большая часть файлá в сети. Возникает логический вопрос - "а не сделать ли нам авторизацию самбы через альтовский ldap?". А поскольку гонять информацию plaintext'ом между серверами мягко говоря небезопасно, нужно шифрование.

Переношу корневой сертификат на файлсервер, добавляю в бандл с корневыми (см ниже). Прописываю все нужные опции в ldap.conf, libnss_ldap.conf (см ёще ниже). Пытаюсь настроить - хрен, дебиан ни в какую не хочет доверять альтовским сертификатам. WTF?

openssl s_client -connect ldap.school80.lan:636 \
  -CAfile /etc/ssl/certs/ca-certificates.crt
gnutls-cli -p 389 --print-cert --x509certfile \
  /etc/ssl/certs/ca-certificates.crt ldap.school80.lan

Обе команды ругаются на самоподписанный сертификат, причем вторая показывает на причину - слабый алгоритм подписи md5WithRSAEncryption.

Ага, значит косяк в альтовском сервере. ЧСХ - используемый релиз дебиана вышел этим летом и с тех пор мной не обновлялся, а вот альт, хоть и вышел уже достаточно давно, но обновлен он по самые помидоры - декабрьскими репами.

Пляшем с бубном для того, чтобы заставить альт использовать sha1 и увеличить длину ключа1, регенерируем сертификаты. Проверяем ещё раз - работает.

Описание плясок с бубном

Лезем в админку альта и видим что опции сертификатов нихрена не настраиваются. Готовим напильник, лезем в консоль и начинаем озираться в поисках настроек. Правим openssl.cnf - перегенерируем сертификаты - хрен там, опять килобайтный ключ и md5 вместо подписи. 2 Материмся, ищем по ФС, где у нас лежат сертификаты:

# find / -name *.crt
/usr/share/ca-certificates/ca-bundle.crt
/etc/httpd2/conf/ssl.crt
/etc/httpd2/conf/ssl.crt/server.crt
/var/lib/ldap/usr/share/ca-certificates/ca-bundle.crt

ГДЕ?! Бандлы вижу, причем в 2х экземплярах (как оказалось, они слинкованы между собой.) Материмся, идем опять в админку, внимательно смотрим на ссылку "скачать сертификат". Формат "pem"3. Блжад. Поиск по ФС, дубль 2:

# find / -name *.pem
/var/srv/public/ca-root.pem (1)
/var/lib/ssl/certs/postfix.pem (2)
...
/var/lib/alterator-ca/CA/cacert.pem (3)
...
/var/lib/ldap/var/lib/ssl/certs/postfix.pem (4)
...

Поскипаны файлы в одинаковых директориях. Нихрена не понятно, что, откуда и куда кладется. Экспериментально получено, что 3 директория - это то, что нам нужно, на её основе генерируется всё остальное. Причем (2) - это сами сертификаты демонов, (4) - их дубли в чруте для лдапа (нахрен они все там нужны?), а (1) - это отдельно положенный корневой сертификат в пределах досягаемости вебсервера. (2) и (4) слинкованы между собой на уровне файлов.

Поскольку если просто "в лоб" поменять сертификаты на правильно сгенерированные - не выйдет - после нажатия кнопки в админке всё вернется "взад", то будем разбираться, откуда же берутся параметры.

В общем, в конечном счете - нашел. 2 файла в /usr/bin: ca-sh-functions, cert-sh-functions и 1 файл в /usr/share/alterator-ca4: CA.cnf . В первых 2х жестко прописаны размеры ключей - 1024 байта, во втором - так же жестко задан их алгоритм - md5. 5

Меняем на нужное, перегенерируем корневой сертификат, ключи и остальные сертификаты.

Проблема в том, что после обновления эта хрень опять сломается. В ca-sh-functions есть параметр, отвечающий за местоположение конфига, но если верить grep'у он больше нигде не упомянут, поэтому задать его "извне" не получится.

Размеры ключей вообще прописаны без всяких переменных, тупо числом. Претензия, собственно, у меня только одна - "какого хрена не используется системный конфиг openssl?".

Настройка Debian'а

Добавление корневого сертификата там производится через помещение его в /usr/local/share/ca-certificates/ и запуска либо update-ca-certificates (неинтерактивно) либо dpkg-reconfigure (интерактивно), после этого, наш сертификат будет добавлен в основной бандл /etc/ssl/certs/ca-cerificates.crt, используемый всеми, кому не попадя.

Настройка libnss и pam_ldap - через сначала dpkg-reconfigure, потом правим руками опции для tls: ssl start_tls, tls_cacertfile 6, uri. Конфиги лежат в /etc: libnss_ldap.conf и pam_ldap.conf. В первый рекомендую дописать "debug ", где - уровень отладки. -1 выдаст что-то, по размеру напоминающее "Войну и мир".

Также нужно поправить /etc/ldap/ldap.conf: URI и BASE - чтобы не указывать их каждый раз, дописать "TLS_CACERT /etc/ssl/certs/ca-cerificates.crt" - чтобы использовало корневые сертификаты и "TLS_REQCERT hard", чтобы даже не думало лезть в каталог без шифрования.


  1. второе не обязательно, но раз уж взялись, то заодно и это поправим ↩

  2. вот это один из примеров "нескучности" альта и причин такой ненависти к нему ↩

  3. если посмотреть на него повнимательнее, то это тоже особый, альтовский "pem" - вместо сертификата с ключом в этом файле содержится текстовая информация о сертификате, сам сертификат ...и всё ↩

  4. основной конфиг в /usr, поразительно и ...нескучно ↩

  5. не "default", не "md5, sha1", как в дебиане, нет, "md5 с маленьким ключом хватит всем" ↩

  6. осторожно, грабли - tls_cacertdir не реализован и работать не будет ↩