web-dev-qa-db-fra.com

commande curl - Impossible de charger le certificat client -8018

J'essaie de me connecter à un service Web sécurisé via un proxy à l'aide de la commande curl, mais j'obtiens l'erreur suivante:

Impossible de charger le certificat client -8018.

Journal complet:

[e-ballo@myserver]#   curl  -v -x proxy01.net:8080 https://endPointURL.com/SOAP --key ./cert.crt --cert ./cert.crt -capath=/etc/pki/tls/certs
* About to connect() to proxy proxy01.net port 8080 (#0)
*   Trying 10.0.3.64... connected
* Connected to proxy01.net (10.0.3.64) port 8080 (#0)
* Establish HTTP proxy tunnel to endPointURL.com:443
> CONNECT endPointURL.com:443 HTTP/1.1
> Host: endPointURL.com:443
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.3.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Proxy-Connection: Keep-Alive
>
< HTTP/1.0 200 Connection established
<
* Proxy replied OK to CONNECT request
* Initializing NSS with certpath: sql:/home/e-ballo/
* Unable to initialize NSS database
* Initializing NSS with certpath: none
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* Unable to load client cert -8018.
* NSS error -8018
* Closing connection #0
curl: (58) Unable to load client cert -8018.

Une idée de ce que signifie cette erreur? et comment puis-je y remédier?

Merci d'avance,

18
eballo

J'ai déjà résolu ce problème, je vais donc publier la solution. Peut-être peut aider quelqu'un.

Ma version de curl a été compilée avec les bibliothèques Netscape Security System (NSS) au lieu des bibliothèques openSSL. Les versions de curl compilées avec ces deux bibliothèques utilisent différentes méthodes d'accès aux certificats. J'appelais un fichier plat, qui est la méthode openSSL. Une autre solution consistera à installer NSS (déjà présent sur la plupart des dérivés de Red Hat) et à créer un fichier cert9.db, à importer votre certificat et votre clé (après la conversion en P12 avec openssl-n'oubliez pas d'ajouter un "freindlyName" ou surnom) dans cette base de données en utilisant pk12util. Ensuite, vous appelez le cert par son surnom et donnez le mot de passe pour la base de données.

L'autre option est d'obtenir ou de compiler une version de curl en utilisant les bibliothèques openssl. Les versions de RedHat 5, ubuntu ou windows de curl sont souvent déjà compilées de cette façon. Red Hat 6 est livré avec curl compilé pour NSS.

6
eballo

J'ai également rencontré ce problème sur RHEL 6. curl a été compilé avec NSS, que vous pouvez voir en vérifiant la version:

$ curl -V
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.3.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

La solution consiste à fournir à curl une référence à la base de données NSS qui stocke le certificat client que vous souhaitez utiliser.

Créer le certificat

Je partais d'un magasin de clés Java, qui a été créé avec cette commande (la valeur d'alias sera utilisée pour référencer le certificat plus tard):

keytool -genkeypair -alias myclient -keyalg RSA -keystore client_keystore.jks

Maintenant, ce fichier de clés JKS doit être converti au format pkcs12:

keytool -importkeystore -srckeystore client_keystore.jks \
    -destkeystore client_keystore.p12 -srcstoretype jks \
    -deststoretype pkcs12

Importez le certificat dans une base de données NSS

Ensuite, créez une base de données NSS dans un répertoire de votre choix:

mkdir /home/user/nss
certutil -N -d /home/user/nss

Cette commande certutil crée 3 fichiers .db, dont cert8.db. Il s'agit de l '"ancien" format db, mais il devrait toujours fonctionner. Consultez la documentation certutil si vous devez créer un fichier cert9.db à la place.

Utilisez pk12util pour importer client_keystore.p12 dans la base de données NSS

pk12util -i client_keystore.p12 -d /home/user/nss

Facultativement, affichez le certificat stocké dans la base de données:

certutil -L -d /home/user/nss -n myclient

Utilisez le certificat de curl

Le certificat est maintenant prêt à être utilisé par curl, mais nous devons indiquer à curl où le trouver. Comme spécifié dans le manuel curl, créez une variable d'environnement SSL_DIR:

export SSL_DIR=/home/user/nss

Enfin, la commande curl:

curl -vk --cert myclient https://localhost:8443/my/url

Remarque: l'option -k est spécifiée ici car le serveur utilise un certificat auto-signé. Voir le manuel curl pour savoir comment spécifier un cacert.

N'oubliez pas d'ajouter le certificat client au magasin de clés de confiance du serveur si nécessaire.

Référence

18
bparry