Déchiffrer le fichier binary OpenSSL via NGINX lors de sa réception (à la volée)

J’ai un petit périphérique Linux intégré qui dispose d’un stockage flash de 128 Mo disponible sous forme de bloc-notes. Cet appareil exécute un serveur Web NGINX. Pour effectuer une mise à jour du microprogramme, le système reçoit un fichier binary chiffré sous forme de POST HTTPS via NGINX sur le bloc-notes. Le système déchiffre ensuite le fichier et fait clignoter un autre périphérique flash QSPI afin de terminer la mise à jour.

Le binary du micrologiciel est crypté en dehors de l’appareil comme ceci:

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem 

Le binary du micrologiciel est déchiffré, après avoir été reçu via NGINX, sur l’appareil comme ceci:

 openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password 

Je voudrais vraiment déchiffrer le binary tel qu’il est reçu (à la volée) via NGINX, de sorte qu’il apparaisse sur le bloc-notes flash sous sa forme déchiffrée.

J’ai été incapable de trouver des modules NGINX existants sur Google qui le feraient. Comment pourrais-je accomplir cela? Merci.

Tout d’abord, vous devez comprendre une chose. Alors que nginx décryptera le fichier – toute autre demande sera bloquée. C’est pourquoi nginx ne supporte pas CGI, seulement FastCGI.

Si cela vous convient (par exemple, nginx utilisé uniquement à des fins de mise à jour), vous pouvez utiliser l’extension perl ou lua: http://nginx.org/en/docs/http/ngx_http_perl_module.html , https://github.com / openresty / lua-nginx-module

En utilisant ces modules, vous pouvez exécuter un shell. Pour l’access, le fichier téléchargé doit définir la directive client_body_in_file_onlyhttps://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only

Exemple pour le module perl (non testé):

 location /upload { client_body_in_file_only clean; perl 'sub { my $r = shift; if ($r->request_body_file) { system("openssl smime -decrypt -binary -in ".$r->request_body_file." -inform DER -out /tmp/decrypted.zip -inkey private.key -passin pass:your_password"); } }'; } 

Mais mieux vaut utiliser fastcgi. Vous pouvez utiliser le wrapper fastcgi léger pour cela, par exemple, fcgiwrap https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/

Il existe une attaque très répandue contre les serveurs non basés sur des événements, tels que Apache, appelée Slowloris , où le client lance un certain nombre de requêtes HTTP sans les envoyer intégralement (chaque requête étant envoyée en partie pendant un intervalle une opération très bon marché, à la fois pour envoyer et recevoir, pour une architecture événementielle comme celle de nginx, mais en même temps très coûteuse pour certains autres serveurs).

En tant que serveur proxy, nginx protège ses backends d’une telle attaque. En effet, la protection peut avoir un coût dans certaines circonstances et peut être désactivée avec les directives …_request_buffering :

Ce que vous feriez, c’est désactiver la mise en mémoire tampon des requêtes, puis pipe le fichier entrant directement vers openssl fur et à mesure de sa réception.

Notez que vous pouvez toujours utiliser /dev/fd/0 à la place du nom de fichier pour spécifier stdin (selon l’outil, utiliser - à la place du nom de fichier peut également être une option).