У меня есть (частная) настройка хранилища 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 на веб-страницах, и я даже не смог найти исходный код.
У кого-нибудь есть идеи?
После некоторого поиска у меня есть лучшее представление о том, что происходит (но пока нет решения).
Я нашел исходный код для 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 [ 114])
Проблема с паролем, связанным с этим ключом. Я удалил пароль из ключа, используя:
$ 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 , и он будет работать.