Проблема с получением apt-get для работы с https

У меня есть (частная) настройка хранилища apt на сервере. Я разрешаю доступ к этому хранилищу только через SSL и только с клиентским сертификатом. Я проверил соединение с помощью curl:

$ curl --cacert /opt/CA.crt --cert /opt/user.crt --key /opt/user.key --pass 1234 https://example.com/dists/lucid/main/binary-amd64/Packages.gz

Контент загружается как положено.

Я создал файл в /etc/apt/apt.conf.d/45example-com с

Debug::Acquire::https "true";

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

    CaInfo "/opt/CA.crt";

    SslCert "/opt/user.crt";
    SslKey  "/opt/user.key";
};

Я добавил файл в /etc/apt/sources.list.d/example.com.list с:

deb https://example.com/ lucid main

Кажется, есть проблема с сертификатом CA, когда я пытаюсь обновить, я получаю следующее:

# apt-get update
* Connected to example.com (8.0.0.8) port 443 (#0)
* found 1 certificates in /opt/CA.crt
* error reading X.509 key or certificate file
* Closing connection #0

Журналы сервера на example.com показывают, что ни одного запроса туда не поступило, поэтому я предполагаю, что apt-get завершается неудачей, прежде чем пытаться отправить запрос (что соответствует тому, что говорит журнал).

Мне было трудно найти какую-либо документацию по apt-get с помощью ssl на веб-сайтах, и я даже не смог найти исходный код.

У кого-нибудь есть какие-либо идеи?

3 ответа

Решение

После некоторых поисков у меня есть лучшее представление о том, что происходит (но пока нет решения).

Я нашел исходный код для apt по адресу https://code.launchpad.net/~ubuntu-branches/ubuntu/lucid/apt/lucid. Он использует libcurl для ssl, который в свою очередь использует gntls.

Сообщение об ошибке исходит от libcurl, и оно жалуется на ключ / пароль, а не сертификат CA. Линия:

* found 1 certificates in /opt/CA.crt

говорит, что CA.crt был правильно загружен. Сообщение об ошибке исходит из следующего:

if(gnutls_certificate_set_x509_key_file(
     conn->ssl[sockindex].cred,
     data->set.str[STRING_CERT],
     data->set.str[STRING_KEY] ?
     data->set.str[STRING_KEY] : data->set.str[STRING_CERT],
     do_file_type(data->set.str[STRING_CERT_TYPE]) ) !=
   GNUTLS_E_SUCCESS) {
  failf(data, "error reading X.509 key or certificate file");
  return CURLE_SSL_CONNECT_ERROR;
}

(Из gtls.c в http://alpha.gnu.org/gnu/gnutls/libtasn1-0.2.10.tar.gz)

Проблема с паролем, связанным с этим ключом. Я удалил пароль из ключа, используя:

$ openssl rsa -in user.key -out user-nopasswd.key

Это не идеально, но, похоже, работает.

Одна проблема, с которой я столкнулся при попытке заставить apt-get работать по протоколу https, заключалась в том, что для опции SslCert нельзя использовать файл .pem, так как apt-get не сможет распознать его как допустимый формат для подключения к вашему репозиторию. У меня есть самоподписанный.pem, который я использую для подключения к своему веб-серверу, и он имеет формат.pem, поэтому я попытался его использовать.

Решением было просто разделить.pem на правильные файлы.crt и.key и apt-get успешно подключиться.

TLDR: разделите ваш файл .pem на .crt и .key, и он будет работать.

На самом деле вам не нужно разделять их, как заявил @ihatecache, вы можете установить и сертификат, и ключ как один pem:

      Acquire::https {
            SslCert "/opt/user.pem";
            SslKey  "/opt/user.pem";
        };
Другие вопросы по тегам