LINUX.ORG.RU
решено ФорумAdmin

Nix и кастомные TLS-сертификаты

 , ,


0

2

Раз мне приходится на рабочей тачке пользоваться Centos 7, то решил я попробовать заюзать nix чтобы ставить свежий софт без гемороя. Все бы ничего, да юзает моя контора MitM для слежки за сотрудниками, да ещё и самоподписанные сертификаты на внутренних ресурсах. И тут всплыла проблема с nix:

Каким-то хером он не всегда подхватывает сертификаты с хост системы, хотя я вроде настроил это везде где можно (NIX_SSL_CERT_FILE и т.д.)

nix --extra-experimental-features nix-command show-config | grep ssl :
ssl-cert-file = /etc/pki/tls/cert.pem

в .config/home-manager/home.nix тоже добавил

let
  myCert = "/nix/store/gcsmigzhz2vlcviic2vmbclqa0xd0fwa-tls-ca-bundle.pem"; # use nix-store --add-fixed sha256 <path> to update if needed
in
{
 ...
 home.sessionVariables = {
    SSL_CERT_FILE = "${myCert}";
    NIX_SSL_CERT_FILE = "${myCert}";
    # EDITOR = "emacs";
  };
}

но при выполнении nix-shell '<home-manager>' -A install всё равно лезут ошибки:

Creating initial Home Manager generation...

warning: error: unable to download 'https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz': SSL peer certificate or SSH remote key was not OK (60); retrying in 312 ms
warning: error: unable to download 'https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz': SSL peer certificate or SSH remote key was not OK (60); retrying in 506 ms
warning: error: unable to download 'https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz': SSL peer certificate or SSH remote key was not OK (60); retrying in 1064 ms
warning: error: unable to download 'https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz': SSL peer certificate or SSH remote key was not OK (60); retrying in 2328 ms
error:
       … while calling the 'derivationStrict' builtin

         at /builtin/derivation.nix:9:12: (source not available)

       … while evaluating derivation 'home-manager-generation'
         whose name attribute is located at /nix/store/q300rswsxpr2kkng9azzsbfi9m8fdg50-nixpkgs/nixpkgs/pkgs/stdenv/generic/make-derivation.nix:303:7

       … while evaluating attribute 'buildCommand' of derivation 'home-manager-generation'

         at /nix/store/q300rswsxpr2kkng9azzsbfi9m8fdg50-nixpkgs/nixpkgs/pkgs/build-support/trivial-builders/default.nix:87:14:

           86|       enableParallelBuilding = true;
           87|       inherit buildCommand name;
             |              ^
           88|       passAsFile = [ "buildCommand" ]

       (stack trace truncated; use '--show-trace' to show the full trace)

       error: unable to download 'https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz': SSL peer certificate or SSH remote key was not OK (60)
Uh oh, the installation failed! Please create an issue at

    https://github.com/nix-community/home-manager/issues

nix установлен в single-user mode.

Как эту хрень заставить уважать SSL_CERT_FILE?

Перемещено hobbit из general

★★★★☆

Последнее исправление: cocucka (всего исправлений: 1)

Ответ на: комментарий от cocucka

Но трюк с добавлением CertificateBundle в openssl.cnf не канает. Ни с дефолтным системным путём, ни с путём из nix-store.

cocucka ★★★★☆
() автор топика
Последнее исправление: cocucka (всего исправлений: 1)
Ответ на: комментарий от cocucka

nix-guru

И @t184256. Он даже ‘обещал’ (шутка) статью забахать, чтобы раскрыть все тайны NixOS для неофитов, интересующихся и хейтеров. :)

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от t184256

Работает, конечно. Системные утилиты и менеджеры пакетов (pip, cargo и прочие) спокойно ходят что в интернет, что в локальные зеркала.

Если нет, как ты делал этот bundle?

Его не я делал, я просто поставил rpm пакет с нашими CA, которые везде используются.

cocucka ★★★★☆
() автор топика
Ответ на: комментарий от t184256

Ну я и не надеялся, что оно поможет, но попробовать всё равно попробовал. Тут вопрос почему nix игнорирует явно указанный сертификат бандл и если его можно как-то ещё подпихнуть (например заоверрайдить cacert как-нибудь)

cocucka ★★★★☆
() автор топика
Ответ на: комментарий от cocucka

почему nix игнорирует явно указанный сертификат бандл

Хороший вопрос, не знаю.

nix установлен в single-user mode.

С демоном или без демона? Если с демоном, перезапустить его. Если без, попробуй задать через переменные окружения, посмотреть что он открывает через strace…

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)

Single-user, SSL_CERT_FILE, кто ж вам с такими раскладами поможет )

А вне home-manager все работает? Если, например, nix develop https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz сказать, то что будет?

(возможно, установочный скрипт home-manager по дороге теряет NIX_SSL_CERT_FILE?)

А если nix shell nixpkgs#hello, то работает?

akho
()
Последнее исправление: akho (всего исправлений: 1)
Ответ на: комментарий от akho

Видимо какой-то «фетчер» не поддерживает переопределение сертификатов, как тут заметили: Nix и кастомные TLS-сертификаты (комментарий)

Будет время сегодня – поковыряю

cocucka ★★★★☆
() автор топика
Ответ на: комментарий от cocucka

Как временное решение - можешь попробовать что-то вроде такого:

wget https://git.sr.ht/~rycee/nmd/archive/abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz
nix-store --add-fixed sha256 abb15317ebd17e5a0a7dd105e2ce52f2700185a8.tar.gz
Tsukasa
()
Ответ на: комментарий от cocucka

Наверное. Оба косяка с fetchurl. Он в принципе не должен проверять сертификат (потому что sha все равно проверяется). В fetchurl.cc строка 40.

            request.verifyTLS = false;

Дальше в filetransfer.cc имеем

            if (request.verifyTLS) {
                if (settings.caFile != "")
                    curl_easy_setopt(req, CURLOPT_CAINFO, settings.caFile.get().c_str());
            } else {
                curl_easy_setopt(req, CURLOPT_SSL_VERIFYPEER, 0);
                curl_easy_setopt(req, CURLOPT_SSL_VERIFYHOST, 0);
            }

то есть caFile он и правда не увидит; но вроде как и не надо?

Дальше моих познаний в С++ и libcurl не хватит. Наверное, помогло бы CURLOPT_CAINFO ставить в любом случае, но источник проблемы мне неясен и тестировать это я не готов.

akho
()
Последнее исправление: akho (всего исправлений: 1)
Ответ на: комментарий от akho

Фишка в том, что libcurl должен сам подхватывать сертификаты, если они указаны в переменных окружения, но если nix запускает установку home-manager в изолированном окружении, то походу эти сертификаты там недоступны и не видны для libcurl. В то же время, openssl.cnf там виден и применяется, что очень странно.

cocucka ★★★★☆
() автор топика
Ответ на: комментарий от cocucka

Странно, что VERIFYPEER для fetchurl выключен, но ломается. С бинарными кешами сертификат должен проверяться, насколько я понимаю, и успешно подвязывается и проверяется.

akho
()
Ответ на: комментарий от akho

(там даже в каментах уже пишут, спортлото не отвечает; что характерно, коммит из 2015, комменты из 2019. Видимо, раз в четыре года кого-то беспокоит этот вопрос)

akho
()
Ответ на: комментарий от cocucka

Я подумал еще раз! там же fetchurl не из nix, а из nixpkgs.

Впрочем, все то же самое: если ему дан хеш, похожий на настоящий, то curl должен запускаться с флагом --insecure.

Фетчеры не нужно изолировать от хост системы, потому что у них фиксированный результат — если хеш сошелся, то и неважно, какие конфиги он читал.

akho
()
Ответ на: комментарий от akho

Короче, я нашёл где затык это fetchTarball, который не ставит verifyTLS = false, а home-manager именно его использует: https://github.com/nix-community/home-manager/blob/b9046172a580a648045e7c2f7077cc143936ad8f/docs/default.nix#L10

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

cocucka ★★★★☆
() автор топика
Ответ на: комментарий от cocucka

Нет, это я говно, точнее тот, кто ставил систему и поставил не ту версию сертификатов. А ещё curl на хосте говно ибо хавал просроченный CA и не возбухал. После установки свежего пакета с сертификатами всё заработало.

cocucka ★★★★☆
() автор топика
Ответ на: комментарий от theNamelessOne

Я так понял, что:

  • сертификаты были неправильные;
  • большинство фетчеров при наличии хеша не проверяют tls; это может быть проблемой само по себе; зато работало с неправильными сертификатами;
  • fetchTarball молодец, и проверяет; он корректно ломался;
  • почему ломалась установка vs code, где pkgs.fetchurl и вроде не должно быть проверки — неизвестно;
  • в документации по фетчерам ничего не пишут, и ведут они себя как придется.
akho
()
Ответ на: комментарий от akho

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

cocucka ★★★★☆
() автор топика