2015-07-08 4 views
7

Locken-Befehl:Mit Client-Zertifikat in Locken-Befehl

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

Ich versuche, ein Client-Zertifikat mit Curl-Befehl oben angegeben zu senden. Ich versuche, die Folgendes zu wissen:

  1. Was ist die HTTP-Request-Header, die ich auf der Serverseite suchen sollte das Client-Zertifikat von der HTTP-Anforderung zu ziehen.

  2. Kann ich das Clientzertifikat auf der Serverseite nicht aus der HTTP-Anforderung herausziehen, kann ich einen benutzerdefinierten Anforderungsheader in der HTTP-Anforderung hinzufügen und das Clientzertifikat als Wert dieses benutzerdefinierten Headers senden. Es wäre großartig, wenn mir jemand ein Beispiel für diesen Ansatz geben könnte.

Antwort

11

TLS-Clientzertifikate werden nicht in HTTP-Headern gesendet. Sie werden vom Client als Teil des TLS Handshakes übertragen, und der Server überprüft normalerweise auch die Gültigkeit des Zertifikats während des Handshakes.

Wenn das Zertifikat akzeptiert wird, können die meisten Webserver so konfiguriert werden, dass sie Header zur Übertragung des Zertifikats oder der Informationen auf dem Zertifikat zur Anwendung hinzufügen. Umgebungsvariablen werden mit Zertifikatsinformationen in Apache und Nginx aufgefüllt, die in anderen Direktiven zum Setzen von Kopfzeilen verwendet werden können.

Als Beispiel für diesen Ansatz validiert das folgende Nginx-Konfigurations-Snippet ein Clientzertifikat und setzt dann den Header SSL_CLIENT_CERT, um das gesamte Zertifikat an die Anwendung zu übergeben. Dies wird nur gesetzt werden, wenn dann das Zertifikat erfolgreich validiert wurde, so kann die Anwendung dann das Zertifikat analysieren und sich auf die Informationen verlassen, die es trägt.

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

Awesome, macht Sinn für mich. Vielen Dank! – sunsin1985

7

Dies ist, wie ich es tat:

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