(Public Key Infrastructure)
les dades es protegeixen amb CIPHER_HASH
$\downarrow$
derivades amb KEA
$\downarrow$
autenticats (els secrets) amb SIGN
$\downarrow$
Claus públiques de servidor i client (opcionalment)
?
hem canviat el problema de
“compartir claus simètriques”
pel de
“compartir claus públiques (asimètriques)”
hem simplificat el problema, però segueix sent massa complex com per a que el solventin els usuaris
com intercanviem les claus públiques (PBK
) de forma segura?
ens cal un mapeig segur:
PBKinterlocutor $\rightarrow$ identitat interlocutor
les dades es protegeixen amb CIPHER_HASH
$\downarrow$
derivades amb KEA
$\downarrow$
autenticats (els secrets) amb SIGN
$\downarrow$
Claus públiques de servidor i client
$\downarrow$
identitat interlocutor
PBKinterlocutor $\leftrightarrow$ identitat interlocutor
SSH
PGP
: gestió descentralitzada (Web of trust)PKI/X.509
: gestió centralitzadaclient$ ~/.ssh/id_rsa
(...)
client$ ~/.ssh/known_hosts
sshd
)
servidor# /etc/ssh/ssh_host_rsa_key
(...)
servidor|pep$ ~/.ssh/authorized_keys
(...)
un certificat conté la tupla:
(identitat interlocutor, PBKinterlocutor)
i per a poder-ne verificar la integritat (i l'autenticitat) una tercera part de confiança (TTP) signa aquesta tupla:
PVKTTP(identitat interlocutor, PBKinterlocutor)
Nota: PVKTTP(
...)
significa signatura RSA o ECDSA sobre la cadena "..."
hem de confiar en PBKTTP
el propietari de la PVKTTP
corresponent pot ser:
Nota:
PGP: Pretty Good Privacy
PKI: Public Key Infrastructure
sovint ni en PGP ni en PKI disposarem localment de la PBKTTP
que ha signat el certificat del nostre interlocutor
però podem "arribar-hi" de forma segura si descarreguem els certificats de les baules intermèdies
PVKi-1(i, PBKi)
$\vdots$
PVKi-2(i-1, PBKi-1)
PVKTTP(1, PBK1)
en PGP podem signar les claus de coneguts nosaltres mateixos si ens les han donat de forma segura
...i ells també poden fer el mateix, permetent abastar un pas més
Nota: PGP té una versió de lliure distribució anomenada GPG derivada de la rfc4880 (OpenPGP)
amb PGP podem arribar a tenir confiança en grups petits o mitjans, però no escala bé a grups grans
cada baula (certificat) té una garantia d'autenticitat $<1$
a partir d'uns quants certificats el nivell de seguretat deixar de ser acceptable
l'encadenat de certificats el fem a un punt comú
en el cas extrem, tothom pot rebre un certificat d'una única TTP: una autoritat de certificació (CA)
si rebem una connexió TLS, o rebem un missatge de correu signat, o volem enviar-ne un de xifrat, només ens cal rebre el certificat de l'interlocutor:
PVKCA(identitat_interlocutor, PBKinterlocutor)
aquest certificat, que el podrem trobar en un repositori qualsevol, i el podrem validar a condició que disposem
prèviament la clau PBKCA
(obtinguda per a medis alternatius fiables)
la PBKCA
és l'únic element que cal distribuir de forma segura,
la resta els podrem obtenir de forma no segura i validar-los
simple pels clients, però fràgil:
PBKCAi
les diferents CAs poden especialitzar-se: nivells de seguretat, mètodes de registre, legislación, costos, o simplement diferents organitzacions
els usaris poden escollir en quines CAs arrel confiar i en quines no
l'usuari (...) ha de gestionar
la llista de CAs (arrel) de confiança
les CAs subordinades emeten certificats als usuaris
$\Downarrow$
estan en línia o com a mínim, estan actives tot sovint
$\Downarrow$
probabilitat "alta" de compromís de la PVK
$\Downarrow$
hem de poder-les revocar en cas de compromís de la PVK
e.g. quan en una connexió TLS el servidor ens presenta la seva PBK
, ens l'aporta certificada
per una CA subordinada, juntament amb el certificat de la CA subordinada que l'ha signat:
PVKCAsub(id-servidor, PBKservidor)
+ PVKCAroot(id-CAsub, PBKCAsub)
la PBKCAroot
l'hem de tenir prèviament instal·lada
el procediment de registre gestiona la validació de credencials (registre) que demostra que un titular posseeix la clau privada corresponent a la clau pública que presenta
PVK
ha de ser automàtica:
PKCS #10
X.509
(prèvia)
Base64, DER, ASN.1
Estructura serialitzada PVKCA(interlocutor, PBKinterlocutor)
Certificate
(també X.509)-----BEGIN CERTIFICATE----- MIIG6zCCBdOgAwIBAgIIBDLZr/F50H4wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl cm5ldCBBdXRob3JpdHkgRzIwHhcNMTUxMjEwMTc1MjUxWhcNMTYwMzA5MDAwMDAw WjBmMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEVMBMGA1UEAwwMKi5n b29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtWRb+kjtt/VXuiTU zLDYdF2jb5BqN+bf2G9GcWoJ6ONktigxILSdJH9rgQlLsX07mGi1SgIo/rdARmVb 9p2gOKOCBIMwggR/MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjCCA0IG A1UdEQSCAzkwggM1ggwqLmdvb2dsZS5jb22CDSouYW5kcm9pZC5jb22CFiouYXBw ... Lrb5fFz7UWlT6/2lwe7o1BB5A8sxfrhPpsl8xj5qolZX+0yp9z4no0/ro/3BDYXA 0paEqOs/1ZavvT2sShY3naCSLGZ0L8Zbsg8TYVGNIIIv80omtq1ZOME04n8xdAk= -----END CERTIFICATE-----(exemple de certificat de google.com)
PEM: Privace Enhanced Mail
Convertim cada 3 bytes en 4 caràcters:
+
i /
total: 64 caràcters
i si la cadena no és múltiple de 3 bytes, afegim =
al final:
=
indica que l'últim bloc té tots tres bytes significatius=
indica que l'últim bloc té dos bytes significatius==
indica que l'últim bloc té un byte significatiuDER: Distinguished Encoding Rules
funcionalment equivalent a XML, JSON o la serialització nativa de Java $\rightarrow$ tipus lògic convertit a seqüència de bits
DER és independent de l'arquitectura del processador
(endianness, mida dels registres de la CPU)
Codificació TLV: Tipus + Longitud + Valor
Tipus + Longitud + Valor
SEQUENCE
...)Experiment: Parser DER en línia: lapo.it
ASN.1: Abstract Syntax Notation (One)
equivalent als "esquemes" XML, a les "classes" de Java (que després podem serialitzar), etc.
Tipus bàsics
INTEGER
, BOOLEAN
, ENUMERATED
...OCTET STRING
, BIT STRING
, Utf8String
, GeneralizedTime
...seqüència única que identifica un concepte, que s'obté
de la
ITU-T/CCITT o la
ISO
e.g. AESAlgorithmIdentifier ::= 2.16.840.1.101.3.4.0.1
{ joint-iso-ccitt(2) country(16) us(840) organization(1) gov(101) csor(3)
nistalgorithm(4) modules (0) aes (1) }
SEQUENCE
: equivalent a un struct
de C/C++SEQUENCE OF
: equivalent a un vector []
de C/C++SET
: com SEQUENCE
però sense ordre (semàntica)SET OF
: com SEQUENCE OF
però sense ordre (semàntica)SEQUENCE
: equivalent a un struct
de C/C++CHOICE
: alternativa de tipus; equivalent a union
de C/C++exemple d'estructura ASN.1:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}
Certificate
PVKCA(interlocutorx,
PBKinterlocutorx)
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING } TBSCertificate ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, serialNumber CertificateSerialNumber, signature AlgorithmIdentifier, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 extensions [3] EXPLICIT Extensions OPTIONAL -- If present, version MUST be v3 }
Name
el Name
defineix els Distinguished Name o DN
un DN és una seqüència d'RDN (Relative DN)
RDNs habituals:
corresponen a un estructura en arbre (LDAP, X.500)
validity {notBefore, notAfter}
issuer Name
serialNumber INTEGER
extensions SEQUENCE OF {OID, Bool, OCTET STRING}
extensions
SEQUENCE OF {OID, Bool, OCTET STRING}
és una manera d'afegir informació addicional que no està especificada en el moment de definició de l'estructura
X.509
(X.509 versió 3)
hi ha extensions que cal que siguin processades:
es marquen amb Critical True
: si un
sistema processa el certificat i no entén l'extensió (no en coneix l'OID
) ha de rebutjar el certificat
BasicConstraints
: cA, pathLenConstraint
KeyUsage
NameConstraints
AuthorityInformationAccess
les CAs reconegudes (arrel) han d'obtenir-se de forma fiable
aquest S.O. o el programari actuen de "TTP arrel"
en alguns sistemes es poden modificar aquestes llistes (per part de l'usuari, o l'administrador de sistemes)
Hi ha CAs arrel bones? com gestiono la llista de CAs arrel que haig de fer servir?
el fet que la llista de certificats pugui ser manipulada (usuari, sysadmin) ha fet que apareguin mecanismes "més segurs"
els certificats tenen una validesa limitada en el temps, però és possible que el seu contingut deixi de ser vàlid abans
si això passa, cal comunicar-ho a l'RA (Autoritat de Registre) seguint els procediment que dictamini la Política de Certificació (o la Declaració de Pràctiques de Certificació que en depengui)
exemple DNIe: Declaración de prácticas y políticas de certificación
keyCompromise
: potser he perdut el control de la PVKaffiliationChanged
: el DN
/SubjectAltName
ja no és correctesuperseded
: s'ha emès un certificat que el substitueixcessationOfOperation
: ja no cal (e.g. el servidor web ja no existeix)certificateHold
: suspès (posteriorment es cancel·la la suspensió, o es revoca)privilegeWithdrawn
: algun atribut ja no li correspon al titularCertificate Revocation List
és una llista signada (rfc5280) que conté els certicats no caducats que han estat revocats per una CA (o vàries: CRL indirectes), el moment en el que han deixat de ser vàlids, i la raó per la que han deixat de ser vàlids
CertificateList ::= SEQUENCE { tbsCertList TBSCertList, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING } TBSCertList ::= SEQUENCE { version Version OPTIONAL, -- if present, MUST be v2 signature AlgorithmIdentifier, issuer Name, thisUpdate Time, nextUpdate Time OPTIONAL, revokedCertificates SEQUENCE OF SEQUENCE { userCertificate CertificateSerialNumber, revocationDate Time, crlEntryExtensions Extensions OPTIONAL -- if present, version MUST be v2 } OPTIONAL, crlExtensions [0] EXPLICIT Extensions OPTIONAL -- if present, version MUST be v2 }
el mateix format que els certificats, però altres OID
reasonCode
invalidityDate
certificateIssuer
(només per a CRL indirectes)en CA de gran volum les CRL són inacceptablement grans: OCSP
els servidors OCSP o VA (Validation Authorities) responen l'estat de validesa d'un certificat individual
en servidors web d'alt rendiment,
la VA pot patir una càrrega similar $\rightarrow$ OCSP stapling
les TSA (Time-Stamp Authorities) emeten proves signades de que un conjunt de bytes (hash) ha estat presentat a una hora determinada
és un format de petició i un de resposta que conté un token TimeStampToken
(TST):
el token TST es pot presentar com a prova de que un document
existia en un cert moment
les TSA s'assemblen a les CA però a banda de disposar d'HSM, tenen una font fiable de temps:
rellotge atòmic, o un rellotge estabilitzat tèrmicament, o connexió GPS, o connexió a un
servidor NTP (Stratum-2 o proper), o alguna combinació dels anteriors (habitualment les CA fan servir NTP i prou)
CMS o Cryptographic Message Standard ens permet xifrar o signar un conjunt de bytes: correu, fitxers individuals, etc.
és una estructura ASN.1:
ContentInfo ::= SEQUENCE { contentType ContentType, content [0] EXPLICIT ANY DEFINED BY contentType } ContentType ::= OBJECT IDENTIFIER
content
tipus disponibles:
Data
: dades sense tractarSignedData
: dades signades per un o més signantsEnvelopedData
: dades xifrades simètricament, i claus xifrades amb la PBK d'un o més receptorsDigestedData
: hash (emmagatzament local, o per posterior ensobrat)EncryptedData
: xifrat en cru (emmagatzament local, xifrat simètric)que es poden combinar recursivament: e.g.
SignedData(Data("dades"), [signatures])
content
$\rightarrow$SignedData
signatura asimètrica
SignedData ::= SEQUENCE { version CMSVersion, digestAlgorithms DigestAlgorithmIdentifiers, encapContentInfo EncapsulatedContentInfo, -- dades signades certificates [0] IMPLICIT CertificateSet OPTIONAL, -- certificats necessaris (CAs sub.) crls [1] IMPLICIT RevocationInfoChoices OPTIONAL, -- CRL necessàries signerInfos SignerInfos } -- signatura(/es en paral·lel) DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier SignerInfos ::= SET OF SignerInfo
content
$\rightarrow$EnvelopedData
xifrat, simètric o asimètric (ensobrat)
EnvelopedData ::= SEQUENCE { version CMSVersion, originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL, recipientInfos RecipientInfos, encryptedContentInfo EncryptedContentInfo, unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
content
$\rightarrow$EnvelopedData + SignedData
una combinació habitual (e.g. S/MIME) és signar i xifrar
el PKCS #7 es fa servir sovint com a format per a entregar certificats (i CRL)
(e.g. el meu certificat i la cadena de CA):
el PKCS #7 se li dóna amb content
SignedData
... contenint els certificats
i/o les CRL, però sense dades ni signatures
pkcs11.h
)
d'HSM