web-dev-qa-db-fra.com

Utilisation du certificat client dans la commande Curl

Commande Curl:

curl -k -vvvv --request POST --header "Content-Type: application/json" --cert client.pem:password --key key.pem "https://test.com:8443/testing"

J'essaie d'envoyer un certificat client à l'aide de la commande Curl spécifiée ci-dessus. J'essaie de savoir ce qui suit:

  1. Quel est l'en-tête de la requête HTTP que je devrais consulter côté serveur pour extraire le certificat client de la requête HTTP.

  2. Si je ne parviens pas à extraire le certificat client côté serveur de la requête HTTP, puis-je ajouter un en-tête de requête personnalisé dans la requête HTTP et envoyer le certificat client en tant que valeur de cet en-tête personnalisé? Ce serait formidable si quelqu'un pouvait me fournir un exemple de cette approche.

34
sunsin1985

Les certificats client TLS ne sont pas envoyés dans les en-têtes HTTP. Ils sont transmis par le client dans le cadre de la poignée de main TLS et le serveur vérifie généralement la validité du certificat lors de la poignée de main.

Si le certificat est accepté, la plupart des serveurs Web peuvent être configurés pour ajouter des en-têtes permettant de transmettre le certificat ou les informations contenues dans le certificat à l'application. Les variables d'environnement sont renseignées avec les informations de certificat dans Apache et Nginx , qui peuvent être utilisées dans d'autres directives pour définir des en-têtes.

À titre d'exemple de cette approche, l'extrait de configuration Nginx suivant va valider un certificat client, puis définir le SSL_CLIENT_CERT en-tête pour transmettre l’intégralité du certificat à l’application. Cela ( seulement ) sera défini lorsque le certificat aura été validé avec succès, afin que l'application puisse ensuite analyser le certificat et s'appuyer sur les informations qu'il contient.

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/chainedcert.pem;  # server certificate
    ssl_certificate_key /path/to/key;          # server key

    ssl_client_certificate /path/to/ca.pem;    # client CA
    ssl_verify_client on;
    proxy_set_header SSL_CLIENT_CERT $ssl_client_cert;

    location / {
        proxy_pass http://localhost:3000;
    }
}
25
frasertweedale

Voici comment je l'ai fait:

curl -v \
  --cacert ./ca.pem \
  --key ./admin-key.pem \
  --cert ./admin.pem \
  https://xxxx/api/v1/
91
reachlin