Meta: nu un răspuns, cel puțin nu încă, dar câteva informații și sfaturi.
Bine, cazul ușor nu se aplică. După cum ai întâlnit, răsuci
nu oferă informații foarte utile atunci când primește o eroare de verificare de certificare din stiva de bază SSL/TLS, cel puțin atunci când se utilizează GnuTLS așa cum o face versiunea Ubuntu. Cu toate acestea, OpenSSL (care ar trebui să fie prezent pentru că curl îl are ca dependență, deși nu văd de ce) oferă un program de linie de comandă numit simplu openssl
acesta este în mare parte un instrument de testare și este mult mai pronunțat, precum și mai tolerant la erori. De exemplu, pe un site intenționat rău, într-o versiune docker a Ubuntu 16.04:
# curl -v https://untrusted-root.badssl.com/
* Se încearcă 104.154.89.105...
* Conectat la untrusted-root.badssl.com (104.154.89.105) portul 443 (#0)
* au găsit 129 de certificate în /etc/ssl/certs/ca-certificates.crt
* au găsit 516 certificate în /etc/ssl/certs
* ALPN, oferind http/1.1
* Conexiune SSL folosind TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256
* Verificarea certificatului de server a eșuat. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: niciunul
* Închiderea conexiunii 0
curl: (60) verificarea certificatului de server a eșuat. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: niciunul
Mai multe detalii aici: http://curl.haxx.se/docs/sslcerts.html
[decupați textul conservat -- la fel ca al dvs.]
# openssl s_client -connect untrusted-root.badssl.com:443 -servername untrusted-root.badssl.com
CONECTAT(00000003)
adâncime=1 C = SUA, ST = California, L = San Francisco, O = BadSSL, CN = BadSSL Autoritate de certificare rădăcină neîncrezătoare
Verificați error:num=19:certificat autosemnat în lanțul de certificate
---
Lanț de certificate
0 s:/C=US/ST=California/L=San Francisco/O=BadSSL/CN=*.badssl.com
i:/C=US/ST=California/L=San Francisco/O=BadSSL/CN=BadSSL Autoritate de certificare rădăcină neîncrezătoare
1 s:/C=US/ST=California/L=San Francisco/O=BadSSL/CN=BadSSL Autoritate de certificare rădăcină neîncrezătoare
i:/C=US/ST=California/L=San Francisco/O=BadSSL/CN=BadSSL Autoritate de certificare rădăcină neîncrezătoare
---
Certificat de server
-----ÎNCEPE CERTIFICAT-----
MIIEmTCCAoGgAwIBAgIJAMJ1vCpOBAlkMA0GCSqGSIb3DQEBCwUAMIGBMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5j
aXNjbzEPMA0GA1UECgwGQmFkU1NMMTQwMgYDVQQDDCtCYWRTU0wgVW50cnVzdGVk
IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTIxMTIwNDAwMDgxOVoXDTIz
MTIwNDAwMDgxOVowYjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx
FjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDzANBgNVBAoMBkJhZFNTTDEVMBMGA1UE
AwwMKi5iYWRzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
wgTs+IzuBMKz2FDVcFjMkxjrXKhoSbAitfmVnrErLHY+bMBLYExM6rK0wA+AtrD5
csmGAvlcQV0TK39xxEu86ZQuUDemZxxhjPZBQsVG0xaHJ5906wqdEVImIXNshEx5
VeTRA+gGPUgVUq2zKNuq/27/YJVKd2s58STRMbbdTcDE/FO5bUKttXz+rvUV0jNI
5yJxx8IUemwo6jdK3+pstXK0flqiFtxpsVdE2woSq97DD0d0XEEi4Zr5G5PmrSIG
KS6xukkcDCeeo/ul90ByAKySCNmMV4RTgQXL5v5rVJhAJ4XHELtzcO9pGEEHRVV8
+WQ/PSzDqXzrkxpMhtHKhQIDAQABozIwMDAJBgNVHRMEAjAAMCMGA1UdEQQcMBqC
DCouYmFkc3NsLmNvbYIKYmFkc3NsLmNvbTANBgkqhkiG9w0BAQsFAAOCAgEADVgB
Ias+fb/Ckdnw5iSYsfRICfhnTBNgvroorUQe09Psx0tAbjlIYqOCtloNhvCbJYa7
tQQOO65s7RKArpAA1qoapWfDti2aHuMNvGwImwX538RiLf4Rm4MEF6vuF6MZMH/u
Ts1iugB3+d7oSWl/K+RvA4NMRNrlxOLelBJwaTsExsQ5QalpPamongnyWXHZ2Sna
dsw9hBku9ZmlRqYOCE/TajsydqCIhCc2QC5xdd3fxXlcfq5h7G0oOuCYvW7BscTk
AQZYkwS+y3mTHF9wSlxJB4iEGC0NovdM5GsVgfvZ5+jtXGuDlsphAIFLxpIJi1bR
+NsAkEthHoQZDNttvtVJPFPp83PdRDmL6IwrbbXvAwZWWgYmS6HpbF5bxR09JIOA
KttGK1wnd6bh2d9Xy6kfoxZ1gz6i2y5OpxbMoi6z8o1Y2hSOv2kgnD2fxtR9X4OO
wrwWZWnhwsiq7pnZbZiA9GFR4tKZVcJ5ny5aul/MZ0wb5MST7wHW/7qhydfBpOy6
hZ5BSbwfmBao+CJ7NxNJb5c03W5+/Vf1uxXZhodpag6Z5p0rru0v7ea9nMk5dNUm
qR+2XGwzDk9n8jCWwfvSKCa77rf2HqKi8ZaQN/NRp7uVqfY++JVI+h3CLyMk8wTL
FifbLPKbSCW7PAFEfM3wh76VQg1CHpHOPVp/wno=
-----CERTIFICAT FINAL-----
subiect=/C=US/ST=California/L=San Francisco/O=BadSSL/CN=*.badssl.com
emitent=/C=US/ST=California/L=San Francisco/O=BadSSL/CN=BadSSL Autoritate de certificare rădăcină neîncrezătoare
---
Nu s-au trimis nume de CA de certificat de client
Rezumat peer signing: SHA512
Cheie Temp Server: ECDH, P-256, 256 biți
---
SSL handshake a citit 3561 de octeți și a scris 425 de octeți
---
Nou, TLSv1/SSLv3, Cipher este ECDHE-RSA-AES128-GCM-SHA256
Cheia publică a serverului este de 2048 biți
Este acceptată renegocierea sigură
Compresie: NIMIC
Extindere: NIMIC
Nu s-a negociat ALPN
Sesiune SSL:
Protocol: TLSv1.2
Cifr: ECDHE-RSA-AES128-GCM-SHA256
ID sesiune: AC5EB655FAEA1C1A320CA930E6A087FBFE020D3D9C451A72DD7CE77A8080AF0D
ID-ul sesiunii-ctx:
Cheie principală: 419065F69901D74454A224DD22F9D459FA85E6EB4D6F043C649C8FDFA2E5E1FD9C168AC270087B88511B0939927F9A0A
Key-Arg: Niciuna
Identitate PSK: Niciuna
Sugestie de identitate PSK: Niciuna
Nume de utilizator SRP: niciunul
Sugestie pentru durata de viață a biletului de sesiune TLS: 300 (secunde)
Tichet sesiune TLS:
0000 - cc 91 34 52 b1 ce c6 7c-8a 97 27 b0 b4 50 d6 9d ..4R...|..'..P..
0010 - 27 b8 87 13 0b 70 92 e7-23 be 57 5c 00 31 f7 90 '....p..#.W\.1..
0020 - 65 e3 08 d5 63 14 e9 cd-cc 50 59 3f 2a 98 31 d1 e...c....PY?*.1.
0030 - ab f8 ca a8 09 aa 66 bf-7c ff b6 66 42 10 8b 6e ......f.|..fB..n
0040 - c7 e8 7b f3 2b 35 b3 76-8c 95 b3 b5 37 85 09 42 ..{.+5.v....7..B
0050 - 83 a9 c3 f7 54 f4 c5 f5-b2 0d d5 fa c6 24 a6 e2 ....T........$..
0060 - fb 03 cf 35 9c 0d cc 48-e0 bc fc 43 11 3c 19 51 ...5...H...C.<.Q
0070 - 0a 23 7d b2 6c ff 9b e2-bc 64 1d 74 34 cb 13 7b .#}.l....d.t4..{
0080 - c8 55 47 95 71 9d 94 00-33 a0 a0 87 d4 4a fb 81 .UG.q...3....J...
0090 - 34 36 28 2e ac d7 22 36-36 5f 9c cb 3f 0d e7 00 46(..."66_...?...
00a0 - e2 b7 d0 35 48 81 2f c7-9d a1 8a f6 52 a3 11 17 ...5H./.....R...
00b0 - 67 89 94 d3 66 2b 5c c4-73 c5 72 1e 84 46 57 a5 g...f+\.s.r..FW.
00c0 - 77 05 bc 49 a3 1a fe e6-da a8 0f 40 e2 17 f0 40 w..I.......@...@
Ora de începere: 1644060097
Timeout: 300 (sec)
Verificați codul de returnare: 19 (certificat autosemnat în lanțul de certificate)
---
Q
TERMINAT
Observați că prima ieșire după CONECTAT
linia: depth=1 ... / verificare eroare:num=19:....
indică faptul că verificarea certificatului a eșuat; in orice caz openssl
ignoră această eroare și finalizează strângerea de mână, rezultând ultima secțiune a rezultatelor: Sesiune SSL: / Protocol: (valid) / Cifrare: (valid) / ... / Verificați codul de returnare:...
după care trebuie să tastați Q
și reveniți sau control-D (singur) pentru a ieși din program sau control-C pentru a ucide, cu excepția cazului în care adăugați </dev/null
pe linia de comandă care are același efect ca și tastarea automată control-D. Deocamdată nu trebuie să înțelegeți valorile specifice ale Protocolului și Cifrului, doar că NU sunt ceva de genul „niciun” sau „eroare” sau „lipsă”.
Dar fiți avertizat că textul mesajului OpenSSL pentru verify=19 este incomplet până la punctul de a fi confuz; este perfect normal, în general, ca lanțul de certificate de la un server SSL/TLS să includă certificatul rădăcină care este autosemnat și dacă acea rădăcină se află în magazinul de încredere local OpenSSL acceptă (și curl/GnuTLS cu siguranță ar trebui) un astfel de lanț. Numai dacă rădăcina este în lanț ȘI NU este de încredere local, obțineți acest cod de verificare. Alte coduri de verificare, cum ar fi „expirat”, au în mare parte mesaje mai clare.
De asemenea, rețineți că am folosit -numele serverului
cu numele gazdei; aceasta invocă SNI=ServerNameIndication care astăzi multe servere SSL/TLS, inclusiv badssl.com
, nevoie pentru a transmite certificatul(ele) corect(e). Cu toate acestea, versiunea curl din Ubuntu16.04 NU trimite SNI; fără cercetare, nu știu dacă acest lucru se datorează versiunii puțin (dar nu foarte) mai vechi de curl, utilizării lui GnuTLS sau doar unei greșeli în construcție. Dar oricum ca o încercare de probă cel openssl s_client
comanda împotriva serverului dvs. atât cu cât și fără -servername host
parte și salvați rezultatul (cu redirecționare sau tee, de preferință incluzând stderr cu &>
sau |& tee
sau echivalent) deoarece este posibil să avem nevoie de ele. Dacă versiunea cu SNI funcționează și versiunea fără SNI primește o eroare de verificare, aceasta este problema ta -- lipsa SNI. (Poate fi dificil de reparat, dar cel puțin știi ce este.)
În caz contrar, uitați-vă la ieșirea pentru fără SNI. Dacă OpenSSL raportează o eroare de verificare (de acord cu curl/GnuTLS), uitați-vă la mesajul aferent -- ar trebui să indice cel puțin în direcția problemei, dacă nu chiar spre ea. Dacă OpenSSL nu raportează nicio eroare de verificare (unde o face curl/GnuTLS, ambele folosind același truststore furnizat de sistem în /etc/ssl) va fi mai complicat, așa că voi lăsa asta pentru moment și voi adăuga mai târziu, dacă este necesar.