Использование самозаверяющего сертификата SSL для внутреннего хранилища APT на основе HTTPS

10

Я настроил репозиторий Debian (на самом деле Ubuntu) для внутреннего использования с некоторыми частными пакетами, и теперь хочу сделать его доступным через Интернет для некоторых конкретных серверов. Я хотел бы, чтобы apt-get / aptitude подключался к нему по протоколу HTTPS, а поскольку я не хочу тратить деньги, я использую самозаверяющий сертификат.

Я попытался на странице руководства apt.conf указать apt-get, чтобы использовать мой собственный сертификат корневого CA для проверки хоста, но, похоже, он не работает.

Мой файл apt.conf выглядит так:

#Acquire::https::repo.mydomain.com::Verify-Peer "false";
Acquire::https::repo.mydomain.com::CaInfo      "/etc/apt/certs/my-cacert.pem";
Acquire::https::repo.mydomain.com::SslCert     "/etc/apt/certs/my-cert.pem";
Acquire::https::repo.mydomain.com::SslKey      "/etc/apt/certs/my-key.pem";

Я также использую сертификат клиента, но, похоже, это не проблема, потому что, когда я устанавливаю Verify-Peer в «false» (прокомментировано выше), все работает.

Используя тот же сертификат CA, клиентский сертификат и ключ хорошо работают с curl.

Я включил apt debugging (Debug :: Acquire :: https "true"), но он предлагает очень мало информации.

Любые предложения о том, как поступить?

Шеврон
источник

Ответы:

5

Я не использую аутентификацию клиента, только HTTPS, но я только заставил его работать с этим:

Acquire::https {
        Verify-Peer "false";
        Verify-Host "false";
}

Я положил это в файл под /etc/apt/apt.conf.d.

CoreDump
источник
1
Это именно то, чего я не хочу - я хочу проверить сервер, используя мой собственный сертификат CA. Отключение проверки работает, но я не хочу делать это в долгосрочной перспективе.
Шеврон
5

Недавно я столкнулся с подобной проблемой. Я решил это, добавив SslForceVersionопцию.

Мой конфиг похож на:

Acquire::https::test.com {
    Verify-Peer "true";
    Verify-Host "true";

    CaInfo "/tmp/ca.crt";

    SslCert "/tmp/client.crt";
    SslKey  "/tmp/client.key";
    SslForceVersion "SSLv3";
};
onemouth
источник
2
Будьте осторожны с этим. Веб-сайты начинают отключать SSLv3 по различным причинам безопасности; в будущем будет работать только TLSv1 и выше, а позже только TLSv1.2 +
Майкл Хэмптон
3

В askubuntu я обнаружил несколько более простую версию этого решения и ту, которая ограничивала выбор одним хостом.

Acquire::https::mirror.ufs.ac.za::Verify-Peer "false";

Это сработало для меня.

Спрашивающий здесь, однако, хотел сохранить аутентификацию; Я попробовал несколько вещей в соответствии с вышеизложенным, но не смог заставить его работать. С другой стороны, поскольку мой репозиторий подписан, и я установил ключ подписи, аутентификация SSL не является критичной для безопасности.

Тед
источник
опять же , не то , что я хочу - сделать проверку необходимости сверстников. Тем не менее, лично у меня есть рабочая установка (см. Мой обходной путь с Stunnel). Это все еще может помочь другим.
Шеврон
3

Я решил это по-другому, установив CA-сертификат.

  1. Скопируйте ваш *.crtфайл в `/ usr / local / share / ca-сертификаты /
  2. пробег sudo update-ca-certificates

Это решение работает как минимум с Ubuntu 14.04.

ortang
источник
1
Это также работает с прокси, выполняющими перехват / дешифрование SSL. Простое добавление сертификата в / etc / ssl / certs не позволяет. Спасибо тебе за это!
Джордан Андерсон
1
Он не работает, потому что установленный мной сертификат является самозаверяющим сертификатом нашего брандмауэра. У меня нет другого сертификата.
Пол
1

Надеюсь, это поможет другим - я не смог решить это напрямую.

В качестве обходного пути я теперь использую stunnel4 для создания туннеля к моему HTTPS-репозиторию. Самоподписанные сертификаты и сертификат клиента у меня очень хорошо работают с stunnel4.

Я настроил stunnel для прослушивания на локальном хосте: 8888 входящих соединений и перенаправления их в мое хранилище (repo.mydomain.com:443). Я настроил поискать свой репозиторий по адресу http: // localhost: 8888 / .

Пока это работает хорошо, хотя кажется, что это ненужный взлом.

Шеврон
источник
-1

GnuTLS или apt, кажется, глючит. Если имя хоста из моего apt sources.list не соответствует Apache ServerName из моего веб-сервера репозитория, я получаю следующую ошибку при использовании TLSv1:

W: Не удалось получить https: //repo.example/debian/dists/unstable/non-free/binary-amd64/Packages : gnutls_handshake () не удалось: получено предупреждение о предупреждении TLS.

С использованием SSLv3 все работает нормально.

Примечание. Это не имеет ничего общего с сертификатом SSL. Недопустимый сертификат приведет к следующей ошибке:

Err https: //repo1.example нестабильное / несвободные i386 пакеты SSL: субъект сертификата имя (repo.example) не соответствует целевому имени хоста «repo1.example»

Йорг Людвиг
источник
На самом деле, это правильно - Apache поддерживает SNI и предупреждает, когда имя хоста, которое он получает от клиента, не соответствует настроенному имени хоста сервера. Было бы неплохо, если бы apt напечатал детали оповещения, но все делает правильно. Возвращаться к SSLv3 в наши дни очень неразумно, и «работает» только потому, что вы отключаете функции, которые вам действительно следует использовать.
djmitche