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,
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.
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.
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
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
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.