Ik “probeer te werken met OpenSSL C API, ik” ben nog relatief nieuw in dit alles, en ik vind daar veel gemengde informatie, dus ik denk dat het verstandig is om ideeën / meningen / verduidelijking te vragen.
Hoe dan ook, het clientprogramma vereist dat een certificaat of directory wordt geladen die een “TrustStore” bevat. Is dit gewoon een andere betekenis voor de het CA-certificaat van de server zelf in het geval dat ik mijn eigen SSL-certificaten voor die server maak?
En zo ja, zal de tussenliggende CA voor dit doel werken ter vervanging van de root-CA?
Ik denk dat ik op de goede weg ben. Ik wilde echter alleen wat verduidelijking om te voorkomen dat ik een echte dwaze fout zou maken, aangezien ik hierover tegenstrijdige informatie heb gehoord. Sommigen zeggen dat de client de root-CA zelf nodig heeft; andere bronnen zeggen dat ze alleen een tussenliggende CA installeren voor veiligheidsredenen, wat logisch lijkt.
Ik ben echter over het algemeen een beetje in de war over hoe de vertrouwensketen werkt met betrekking tot een clientverbinding. Ik hoefde eigenlijk alleen maar een CSR te genereren en een certificaat op de webserver te installeren, dus de client-side dingen zijn een beetje nieuw voor mij.
Deze vraag werd oorspronkelijk gesteld hier op Stack Overflow, werd voorgesteld dat ik het aan de info-sec-gemeenschap zou vragen.
Reacties
- Ik denk dat je de verkeerde zin gebruikt: een zelfondertekend certificaat is een certificaat waarvan het uitgevercertificaat het certificaat zelf is. Waarschijnlijk betekent een certificaat dat is ondertekend door uw eigen CA. In dit geval: de root-CA wordt meestal in de trust store geplaatst en het tussencertificaat ondertekend door de root-CA en het leaf-certificaat ondertekend door het tussencertificaat worden verzonden tijdens de TLS-handshake .
- Mogelijk duplicaat van Hoe werkt SSL / TLS PKI?
Antwoord
tl; dr Als het cert een variatie van CA:TRUE
bevat, is het logisch om het te verspreiden, als dat niet het geval is, dan heeft het geen voordeel om het te distribueren.
De vertrouwensketen zelf kan worden verklaard in termen van de certificaatstructuur.
Als we beginnen met het certificaat van uw server (dwz het certificaat dat u normaal gesproken zou gebruiken voor apache):
- uw servercertificaat wordt gegenereerd door een certificeringsinstantie, op basis van een CSR die u verstrekt. Die CSR bevat uw openbare sleutel en enige andere informatie die de CA al dan niet wil gebruiken.
- de CA ontvangt uw CSR en maakt (doorgaans) een ondertekend certificaat met behulp van een tussenliggende CA. Uw certificaat heeft twee openbare sleutels: een voor het onderwerp (dit is de openbare sleutel die uit uw CSR is gehaald) en een voor de uitgevende partij, het tussenliggende certificaat van de CA.
- de CA ” s tussencertificaat is zelf een ondertekend certificaat (met enkele speciale opties), waarbij de onderwerpsleutel de openbare sleutel van de tussenliggende CA is (dit is dezelfde openbare sleutel als in de openbare sleutel van de uitgever van uw servercertificaat). de ondertekende (of uitgevende) sleutel zal het rootcertificaat van de CA zijn (of het zal een ander tussenproduct zijn).
- Het rootcertificaat van de CA is (over het algemeen) een zelfondertekend certificaat. In de praktijk betekent dit dat de uitgever en de onderwerpssleutel dezelfde openbare sleutel zijn.
U kunt dit zien door certificaten in het wild te controleren, bijv .:
$ openssl s_client -connect google.com:443 < /dev/null CONNECTED(00000003) depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA verify return:1 depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2 verify return:1 depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com verify return:1 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com i:/C=US/O=Google Inc/CN=Google Internet Authority G2 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
De vertrouwensketen die dit opbouwt kan worden samengevat als (ik begin met de ” bottom “- het Equifax-certificaat):
- de root-CA (Equifax) delegeert dagelijkse activiteiten aan een tussenliggende CA (GeoTrust) en ondertekent een certificaat dat dit feit vertegenwoordigt (dwz het instellen van CA: TRUE, KeyUsage: keyCertSign). Met andere woorden, de root-CA “vertrouwt” de tussenpersoon om namens hem certificaten uit te geven (hopelijk na het voltooien van een reeks verplichte validatiestappen).
- in deze keten, de tussenpersoon (Geotrust) heeft verder gedelegeerd aan een Google CA (CN = Google Internet Authority G2).
- De gedelegeerde (ook bekend als de tussenliggende Google-CA) ondertekent vervolgens een CSR, wat in feite een document is waarin staat dat voor een bepaalde set namen (t e CN, en mogelijk Subject Alternative Names), is een privé / openbaar sleutelpaar geldig / vertrouwd (het vertrouwen komt hier voort uit het feit dat ze de claim hebben gevalideerd om voor een bepaalde naam te spreken – in dit geval heeft de Google CA een certificaat voor * .google.com).
Merk op dat (root) CAs over het algemeen zelfondertekend zijn – een CA wordt over het algemeen vertrouwd omdat deze zich houdt aan een reeks processen en procedures die worden gevoeld om ervoor te zorgen dat ze geen certificaten aan mensen afgeeft wie zou ze niet moeten hebben. Daarom kan ik niet uitgaan om een certificaat te halen waarin staat dat ik Google ben.Dit is daarom een soort conventie (zij het ondersteund door formele mechanismen), en als u uw eigen CA start, bereikt het distribueren van de root- (en tussenliggende) certificaten precies hetzelfde als het distribueren van de certificaten van andere CAs: het zorgt ervoor dat certificaten worden uitgegeven door die CA worden aanvaard als geldig (dwz betrouwbaar) door het systeem.
In meer praktische termen, de trust store (voor openSSL) bestaat eigenlijk uit een hoop bestanden met een specifieke naamgevingsconventie. Zie https://www.openssl.org/docs/faq.html#USER5 :
Wanneer een certificaat is geverifieerd, de root-CA moet “vertrouwd” zijn door OpenSSL. Dit betekent doorgaans dat het CA-certificaat in een map of bestand moet worden geplaatst en dat het relevante programma moet worden geconfigureerd om het te lezen
Die map is / etc / ssl / certs (er zijn andere, zoals / etc / pki op RH-likes).
https://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu#719047 geeft wat verder overzicht van hoe men een certificaat aan de winkel toevoegt, zoals doet https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate ,
De korte versie is dat update-ca-certificaten automatiseert het proces, en is de meest gebruikte tool.
De iets langere versie is dat certificaten moeten worden opgeslagen met een hash (bijvoorbeeld in bestanden met namen op de uitvoer van openssl x509 -hash -in cert.pem
), zodat openSSL efficiënt ketens kan valideren.
Zie https://www.openssl.org/docs/man1.0.2/apps/c_rehash.html voor wat extra achtergrondinformatie.
heeft bijgewerkt om te reageren op de vragen in opmerkingen:
Het servercertificaat wordt in deze discussie gedefinieerd als vertrouwd of niet op basis van de vertrouwensketen. Als je nadenkt over hoe (bijv.) curl https://google.com
werkt, is het een beetje gemakkelijker te begrijpen:
- curl opent een TLS-verbinding met Google, die terugkeert een certificaat.
- curl kijkt naar dat “eindgebruiker” -certificaat, dwz het servercertificaat, en zoekt specifiek naar de uitgever.
- of de uitgever “bekend” is in de trust store, wordt de rest van de trust chain gevalideerd (dwz het certificaat van de uitgever van het servercertificaat wordt gecontroleerd, en als het een andere uitgever heeft dan zichzelf, wordt die uitgever gecontroleerd, enz.). Alleen als de volledige vertrouwensketen kan worden gevalideerd, wordt het certificaat als geldig beschouwd.
Het zou echter absoluut onpraktisch zijn om vertrouwensketens te distribueren als er certificaten van eindgebruikers zouden moeten worden opgenomen. Ik heb geen cijfers over het aantal websites dat er zijn, maar uitgaande van het feit dat Alexa een top 1 miljoen levert, zou je aannemen dat het meer dan 1 miljoen is.
Dat is een beetje het punt van een vertrouwensketen: je hebt over het algemeen de uitgevercertificaten nodig, maar je hoeft de eindcertificaten niet te verspreiden, omdat ze je vertellen wie de uitgever is.
En je kunt verifiëren dat ze niet zijn ” t liegen, omdat je de openbare sleutel van de uitgever kunt controleren (en de vertrouwensketen waarmee wordt vastgesteld dat het de juiste sleutel is), en valideren of het eindgebruikercertificaat (dat wil zeggen de server) echt is ondertekend door de privé-tegenhanger van de uitgever openbare sleutel.
Dus nee, u moet niet de eindgebruikercertificaten distribueren, maar alleen de vertrouwensketen – of, eenvoudiger gezegd: distribueer alle de certificaten die u genereert waar de BasicConstraints (legitiem) iets zeggen tenminste CA: TRUE. Verspreid niets dat niet aan die voorwaarde voldoet, want het is een verspilling van je tijd en schijfruimte – alles wat niet zegt CA: TRUE kan worden gevalideerd tegen iets dat dat wel doet.
Opmerkingen
Antwoord
Een zelfondertekend certificaat is precies dat: het is ondertekende mijn zelf (het is zijn eigen vertrouwensanker).
Om vertrouwd te worden, moet het daarom handmatig en expliciet in de lijst met vertrouwde ankers van de applicatie worden geplaatst. Hoe dat wordt gedaan, hangt af van het besturingssysteem en de applicatie.
Als u bijvoorbeeld de interne certificaatopslag van Windows gebruikt, moet u dat zelfondertekende certificaat in het archief “vertrouwde basiscertificeringsinstantie” plaatsen, anders wordt het certificaat niet geaccepteerd. OpenSSL gebruikt een ander, applicatiespecifiek opslagsysteem: u moet het certificaat ook als een vertrouwde CA installeren, maar hoe u dit moet doen, hangt sterk af van de applicatie en het besturingssysteem dat u gebruikt (zie dit artikel voor enkele algemene instructies).
Reacties
- Dit betekent dus de " Trust Store " -certificaat is precies hetzelfde als het certificaat dat bijvoorbeeld in apache is geïnstalleerd? Dat ' s het deel dat het meest verwarrend is, i ' ma
GNU/Linux
gebruiker, de map waarnaar ik moest linken in de clienttoepassing, was/etc/ssl/certs
. Ik kon echter geen duidelijke uitleg vinden van wat precies het proces aan die kant van de dingen is. Je begrijpt tenminste mijn vraag hier, het belangrijkste punt is om te schrijven de client en laat het de server vertrouwen waarmee het verbinding maakt. - Wat is ' Wat ik precies probeer te doen, is een CA maken, en ik vermoed dat het certificaat is ondertekend door de CA (tussenpersoon), dus in dat geval betekent dit dat de CA het vertrouwensanker is, dus de tussenliggende Ca moet worden geïnstalleerd in de map met vertrouwde certificaten? Bedankt voor uw reactie.
- Uw vraag is daarom algemener. Ik ' heb voorgesteld om het te sluiten met een link naar het antwoord dat u zoekt.
/etc/ssl/certs
directory? Omdat deze allemaal de openbare sleutels bevatten?