Puncte:0

Cum să depanați 400 Solicitare greșită „clientul a trimis o metodă nevalidă în timp ce citește linia de solicitare a clientului”

drapel cn

Am configurat nginx pentru a termina o conexiune SSL și a redirecționa solicitările către un backend http. Clientul face o serie de solicitări de fundal, dintre care una eșuează 400 Cerere proastă ori de câte ori încearcă să negocieze conexiunea SSL. Dacă nu trebuie să negocieze conexiunea - de ex. dacă o altă solicitare de fundal tocmai a fost postată cu succes, cererea reușește. Examinarea filei de rețea Chrome nu arată nicio diferență relevantă între o solicitare reușită și o solicitare nereușită. Călătoria mea este postată aici în acest raport de eroare, dar iată ce am putut distila până acum:

Conexiunea SSL

Când solicitarea problemei reușește, pot spune că nu trebuie să negocieze conexiunea SSL, vizualizând fila Timing a solicitării de rețea (în Chrome): Timing - cerere reușită

Pe de altă parte, ori de câte ori cererea eșuează, văd că a încercat să negocieze conexiunea SSL, așa cum se vede în această imagine: Timing - cerere eșuată

Manipularea Nginx

Prin verificarea jurnalelor de acces la aplicație, am stabilit că nginx este cel care returnează fișierul 400 Solicitare greșită eroare, și nu aplicația HTTP.Când cererea eșuează, toate jurnalele nginx sunt corpul POST Decat metoda HTTP și adresa URL în mod obișnuit (nu am personalizat formatul de jurnal nginx).

Am activat depanarea în jurnalul de erori nginx (cu linia error_log /var/log/nginx/error.log depanare;). Acest lucru îmi permite să văd ce se întâmplă în timpul negocierii SSL (deși nu înțeleg).

După cum am menționat pe scurt mai sus, există și alte solicitări de fundal care reușesc, deși rulează mai rar. După ce orice cerere reușește, toate solicitările vor avea succes pentru o perioadă de timp (până când trebuie să negocieze conexiunea SSL).

În plus, dacă folosesc Copiați ca cURL funcționalitatea din Chrome și rulați cererea ca cerere cURL, reușește întotdeauna. Singura dată când am observat că eșuează este atunci când browserul face cererea.

Jurnalele de depanare Nginx

Iată bitul relevant dintr-o solicitare SSL reușită în jurnale:

22/10/2021 20:37:59 [depanare] 1858722#1858722: *441 gratuit: 0000562A9F69F340
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 Solicitare http în amonte: „/api/method/frappe.core.doctype.log_settings.log_settings.has_unseen_error_log?”
2021/10/22 20:37:59 [depanare] 1858722#1858722: *438 http antet proces în amonte
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 malloc: 0000562A9F712CB0:131072
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 recv: eof:0, avail:-1
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 recv: fd:9 678 din 131072
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 stare proxy http 200 „200 OK”
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 Antet proxy http: „Server: gunicorn”
... mai multe anteturi proxy http...
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 antet proxy http terminat
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 antet filtru xslt
22/10/2021 20:37:59 [depanare] 1858722#1858722: *438 HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
... răspuns HTTP

Iată negocierea eșuată:

22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 gratuit: 0000562A9F69F340
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 http handler de solicitare așteptare
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 malloc: 0000562A9F69F340:1024
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 SSL_read: 812
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 SSL_read: -1
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 SSL_get_error: 2
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 conexiune reutilizabilă: 0
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 posix_memalign: 0000562A9F70CEB0:4096 @16
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 http linie de solicitare a procesului
2021/10/22 20:39:00 [informații] 1858722#1858722: *446 client a trimis o metodă nevalidă în timp ce citește linia de solicitare a clientului, client: 107.185.20.83, server: atlas-dev.ebs.llc, cerere: "doctype= Eroare+Log&fields=%5B%22%60tabError+Log%60.%60name%60%22%2C%22%60tabError+Log%60.%60owner%60%22%2C%22%60tabError+Log%60.% 60creation%60%22%2C%22%60tabError+Log%60.%60modified%60%22%2C%22%60tabError+Log%60.%60modified_by%60%22%2C%22%60tabError+Log%60. %60_user_tags%60%22%2C%22%60tabError+Log%60.%60_comments%60%22%2C%22%60tabError+Log%60.%60_assign%60%22%2C%22%60tabError+Log%60 .%60_liked_by%60%22%2C%22%60tabError+Log%60.%60docstatus%60%22%2C%22%60tabError+Log%60.%60parent%60%22%2C%22%60tabError+Log% 60.%60parenttype%60%22%2C%22%60tabError+Log%60.%60parentfield%60%22%2C%22%60tabError+Log%60.%60idx%60%22%2C%22%60tabError+Log %60.%60method%60%22%2C%22%60tabError+Log%60.%60seen%60%22%5D&filters=%5B%5D&order_by=%60tabError+Log%60.%60modified%60+desc&start=0&page_start 20&view=List&with_comment_count=true"
2021/10/22 20:39:00 [depanare] 1858722#1858722: *446 http cerere de finalizare: 400, "?" a:1, c:1
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 cronometru evenimente del: 9: 337737968
2021/10/22 20:39:00 [depanare] 1858722#1858722: *446 http răspuns special: 400, "?"
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 http set eliminarea corpului
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 antet filtru xslt
22/10/2021 20:39:00 [depanare] 1858722#1858722: *446 HTTP/1.1 400 Solicitare greșită
Server: nginx/1.18.0 (Ubuntu)
Data: vineri, 22 octombrie 2021 20:39:00 GMT
Tip de conținut: text/html
Lungimea conținutului: 166
Conexiune: aproape

Pe baza a câte puține știu despre jurnalul de depanare nginx (adică, nimic), mi se pare că nginx schimbă metoda HTTP și adresa URL pentru corp în timpul negocierii. Când caută metoda HTTP, aceasta nu mai este prezentă și se sufocă.

Configurare Nginx SSL

Informații despre versiune: nginx/1.18.0 (Ubuntu), Ubuntu 20.04 LTS Folosesc implicit nginx.conf. Porțiunea SSL a conf. server arată astfel:

asculta 443 ssl;

nume_server [HOST];

root /opt/erpnext/bench/sites;

dimensiunea_buffer_proxy 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

ssl_certificate /etc/letsencrypt/live/[HOST]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[HOST]/privkey.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_capsare activată;
ssl_stapling_verify on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers activat;

Există o redirecționare SSL în partea de jos a fișierului, iar nginx este configurat pentru a server un server web HTTP bazat pe fișiere plate pe portul 8080 dintr-o altă configurație.

Cum pot determina ce cauzează problema? Știu că cererea este formată corect, pentru că cererile identice reușesc... până când trebuie să negocieze conexiunea SSL. Ajutor?

dave_thompson_085 avatar
drapel jp
{voice='CrocodileDundee'} nu este o renegociere. În TLS 1.2 și versiunile anterioare, renegocierea este în mod specific o nouă strângere de mână pentru a modifica parametrii de securitate pe o conexiune _existentă_. Nu cred că vreun browser îl inițiază vreodată, deși alte tipuri de clienți pot sau cel puțin ar putea; în urma mai multor vulnerabilități (care au dus la interzicerea sau blocarea multor sisteme) și patch-uri (vezi rfc5746) în renegocierea TLS1.3 a fost eliminată în întregime. ...
dave_thompson_085 avatar
drapel jp
... Ceea ce aveți este OT1H (re)utilizarea unei conexiuni (și sesiuni) existente sau OTOH crearea unei noi conexiuni, care utilizează întotdeauna o strângere de mână/negociere inițială în 1.2 sau doar o strângere de mână (nu trebuie să fie distinsă ca initial) in 1.3; această strângere de mână poate și pentru un browser aproape sigur că folosește **reluarea** a _sesiunii_ anterioare (în 1.3, de fapt, un PSK derivat din sesiunea anterioară, pentru secretul înainte). Cu toate acestea, corectarea numelui nu ajută la problema dvs., îmi pare rău.
jobu1342 avatar
drapel cn
Deci spui că negociază o nouă conexiune, nu renegociază una veche? Îmi pare rău că nu am folosit termenii tehnici pentru asta - așa cum ați ghicit, sunt în afara profunzimii mele aici. Desigur, de aceea caut ajutor!
dave_thompson_085 avatar
drapel jp
Exact! Nu este atât de mult eșecul în a folosi termeni tehnici, ci _utilizarea greșită_ accidentală a unuia într-un mod care ar putea direcționa greșit exact genul de oameni pe care doriți să îi ajutați.
jobu1342 avatar
drapel cn
Am actualizat întrebarea - mulțumesc pentru clarificare!
jobu1342 avatar
drapel cn
Tocmai am efectuat niște teste între browsere și chiar între mașini. nu toate browserele nu reușesc, deși nu am detectat niciun model: FAIL: Google Chrome (Win10), Edge (Win10), Opera (Win10, fresh install). Succes: FireFox, Brave, Vivaldi, Google Chrome (Kubuntu 21.10), Google Chrome (Win10). Este de remarcat faptul că Google Chrome funcționează sau nu în funcție de computer. Testele mele nu au fost exhaustive, dar sugerează o eroare legată de instalarea locală. Voi reinstala Chrome pe computerul țintă pentru a vedea dacă începe să funcționeze.
jobu1342 avatar
drapel cn
Deci... se dovedește că antivirusul meu făcea un om sub normal la mijloc. Când opresc AV, nu întâmpin deloc această problemă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.