web-dev-qa-db-fra.com

difficulté à mettre apt-se mettre au travail avec https

J'ai une installation de référentiel apt (privé) sur un serveur. J'autorise uniquement l'accès à ce référentiel via SSL et uniquement avec un certificat client. J'ai testé la connexion en utilisant 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

Le contenu est téléchargé comme prévu.

J'ai créé un fichier dans /etc/apt/apt.conf.d/45example-com avec

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";
};

J'ai ajouté un fichier dans /etc/apt/sources.list.d/example.com.list avec:

deb https://example.com/ lucid main

Il semble y avoir un problème avec le certificat CA. Lorsque j'essaie une mise à jour, le message suivant s'affiche:

# 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

Les journaux du serveur sur exemple.com montrent qu'aucune demande n'y est parvenue, donc je suppose qu'apt-get échoue avant d'essayer d'envoyer la demande (ce qui correspond à ce que dit le journal).

J'ai eu du mal à trouver de la documentation sur apt-get avec SSL sur les sites Web, et je n'ai même pas été capable de trouver le code source.

Quelqu'un a-t-il une idée?

3
AEE

Après quelques recherches, j'ai une meilleure idée de ce qui se passe (mais pas encore de solution).

J'ai trouvé le code source d'apt à https://code.launchpad.net/~ubuntu-branches/ubuntu/lucid/apt/lucid . Il utilise libcurl pour ssl, qui à son tour utilise gntls.

Le message d'erreur provient de libcurl, qui se plaint de la clé/du mot de passe et non du certificat de l'autorité de certification. La ligne:

* found 1 certificates in /opt/CA.crt

dit que CA.crt a été correctement chargé. Le message d'erreur provient de ce qui suit:

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;
}

(De gtls.c dans http://alpha.gnu.org/gnu/gnutls/libtasn1-0.2.10.tar.gz )

Le problème concerne le mot de passe associé à cette clé. J'ai enlevé le mot de passe de la clé en utilisant:

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

Ce n'est pas idéal, mais cela semble fonctionner.

2
AEE

Un problème que j'ai rencontré en essayant d'obtenir apt-get pour exécuter https était que pour l'option SslCert, vous ne pouvez pas utiliser un fichier . Pem car apt-get échouera. reconnaissez qu'il s'agit d'un format valide pour la connexion à votre référentiel. J'ai un fichier .pem auto-signé que j'utilise pour me connecter à mon serveur Web et il est au format .pem, c'est pourquoi j'ai tenté de l'utiliser.

La solution consistait simplement à diviser le fichier .pem en fichiers corrects, un fichier .crt et un fichier .key et apt-get correctement connectés.

TLDR: divisez votre fichier . Pem en un . Crt et un . Clé et cela fonctionnera.

0
ihatecache