Nginx mit Client-Zertifikat funktioniert nicht wie erwartet

Anfänger1

New Member
Guten Morgen alle zusammen,

bisher hatte ich eine Seite mit Passwort-Authentifizierung geschützt, was auch wie gewünscht funktioniert.

Jetzt möchte ich die Seite auf Client-Zertifikat-Authentifizierung umstellen.
Das Zertifikat habe ich nach Anleitung aus dem Internet erstellt und in /etc/nginx/sites-available/default anstelle der Passwort-Authentifizierung eingetragen.

Code:
location /xyz {
        if ($ssl_client_verify != "SUCCESS") {
            return 403;
            break;
        }
        location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }
    }


/var/www/xyz/ enthält natürlich eine index.php.

Wenn ich aus dem Browser https://url.de/xyz aufrufe, wird nach dem Zertifikat gefragt, wenn ich es akzeptiere, wird die index.php abgearbeitet, lehne ich es ab, zeigt nginx wie erwartet "403 Forbidden" an.

Rufe ich dagegen https://url.de/xyz/index.php auf, ist es völlig egal ob ich das Zertifikat ablehne oder annehme, die index.php wird trotzdem abgearbeitet.

Ich benutze nginx 1.18.0

Ich bitte um Hilfe, was mache ich falsch????

Vielen Dank!

Gruß
Jörg
 
Vielen Dank für die schnelle Antwort.
Jetzt kenne ich wenigstens die Ursache (da wäre ich nie drauf gekommen) und kann darüber nachdenken, wie ich es umgehe.

Vorerst werde ich da wohl erst einmal noch die Passwort-Authentifizierung einsetzen bis ich das Problem gelöst habe.

Gruß
Jörg
 
Mit nginx und
Code:
location /irgendwas { 
if ($ssl_client_verify != "SUCCESS") {
            return 403;
        }
        location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }
 }
habe ich es nicht geschafft, das Problem zu lösen.

Nach tagelangem Probieren und mit Hilfe Eurer Hinweise habe ich eine andere Lösung gefunden:

In /etc/nginx/fastcgi.conf habe ich eingefügt
Code:
fastcgi_param TLS_SUCCESS $ssl_client_verify;

Damit wird die nginx-Variable $ssl_client_verify auf $_SERVER['TLS_SUCCESS'] übergeben und kann im Script abgefragt werden.

Im zu schützenden php-Script teste ich dann ganz am Anfang:
Code:
$SERVER = filter_input_array(INPUT_SERVER);
if (!isset($SERVER['TLS_SUCCESS']) || $SERVER['TLS_SUCCESS'] != 'SUCCESS') {
  http_response_code(403);
  die();
}

Das hat den Vorteil, dass die nginx Konfiguration in /etc/nginx/sites-available/default sich vereinfacht weil alle location ... { ... } Blöcke für Seiten mit überwachten php-Scripten entfallen können. Man muss also nicht mehr in der nginx-Konfiguration editieren wenn ein anderes php-Script dazukommt oder entfällt.

Ich teste diese Methode jetzt, bisher funktioniert es, ich habe hoffentlich nichts übersehen.

...etwas Besseres fällt mir nicht ein.
Über andere Ideen oder Lösungen würde ich mich weiterhin freuen.

Danke für Eure Hilfe!
Gruß
Jörg
 
Ich kenne die Lösung hier auch nicht. Anhand des "if is evil" - Beitrages würde ich vielleicht so etwas versuchen:

Code:
location /irgendwas {
   if ($ssl_client_verify != "SUCCESS") { return 403; }
   location ~ \.php$ {
      if ($ssl_client_verify != "SUCCESS") { return 403; }
      include fastcgi.conf;
      fastcgi_pass unix:/run/php/php7.4-fpm.sock;
      }
}

So wie ich das verstanden habe, und so wie es d4f schrieb, hat "location" im Vergleich zu "if" eine höhere Priorität.
 
Last edited:
Gute Idee, habe ich gleich ausprobiert...

Das funktioniert auch nicht.
nginx -t gibt dann die verwirrende Fehlermeldung aus:
Code:
nginx: [emerg] "fastcgi_param" directive is not allowed here in /etc/nginx/fastcgi.conf:2
nginx: configuration file /etc/nginx/nginx.conf test failed
Mein fastcgi_param
Code:
TLS_SUCCESS $ssl_client_verify;
hatte ich natürlich vorher aus der fastcgi.conf wieder entfernt.
Außerdem steht in fastcgi.conf in Zeile 2 der erste fastcgi_param, der per default schon vorhanden war.
 
Mir fehlt da irgendwie die logische Trennung, aka das ist viel zu unübersichtlich...

Code:
location /irgendwas { 
    if ($ssl_client_verify != "SUCCESS") {
        return 403;
    }
}
location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
 
Ich habe Bullshit geschrieben und kann meinen Bullshit-Beitrag mangels Berechtigung nicht mehr löschen.
 
Last edited:
Die Lösung, mit der es funktioniert sieht so aus (etwas abgewandelt von @greystone) :
Code:
location /irgendwas {
   location ~ \.php$ {
      if ($ssl_client_verify != "SUCCESS") { return 403; }
      include fastcgi.conf;
      fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}
 
Und alle !=PHP Elemente werden weiterhin ungesichert ausgeliefert, das ist nicht wirklich sinnvoll...
 
Back
Top