(Public Key Infrastructure)
los datos se protegen con CIPHER_HASH
$\downarrow$
derivadas con KEA
$\downarrow$
autenticados (los secretos) con SIGN
$\downarrow$
Claves públicas de servidor y cliente (opcionalmente)
?
hemos cambiado el problema de
“compartir claves simétricas”
por el de
“compartir claves públicas (asimétricas)”
hemos simplificado el problema, pero sigue siendo demasiado complejo como para que lo solventen los usuarios
¿cómo intercambiamos las claves públicas (PBK
) de forma segura?
nos hace falta un mapeo seguro:
PBKinterlocutor $\rightarrow$ identidad interlocutor
los datos se protegen con CIPHER_HASH
$\downarrow$
derivadas con KEA
$\downarrow$
autenticados (los secretos) con SIGN
$\downarrow$
Claves públicas de servidor y cliente (opcionalmente)
$\downarrow$
identidad interlocutor
PBKinterlocutor $\leftrightarrow$ identidad interlocutor
SSH
PGP
: gestión descentralizada (Web of trust)PKI/X.509
: gestión centralitzadacliente$ ~/.ssh/id_rsa
(...)
cliente$ ~/.ssh/known_hosts
sshd
)
servidor# /etc/ssh/ssh_host_rsa_key
(...)
servidor|pep$ ~/.ssh/authorized_keys
(...)
un certificado contiene la tupla:
(identidad interlocutor, PBKinterlocutor)
y para poder verificar la integridad (y la autenticidad) una tercera parte de confianza (TTP) firma esta tupla:
PVKTTP(identidad interlocutor, PBKinterlocutor)
Nota: PVKTTP(
…)
significa firma RSA o ECDSA sobre la cadena "…"
hemos de confiar en PBKTTP
el propietario de la PVKTTP
correspondiente puede ser:
Nota:
PGP: Pretty Good Privacy
PKI: Public Key Infrastructure
frecuentemente ni en PGP ni en PKI dispondremos localmente de la PBKTTP
que ha firmado el certificado de nuestro interlocutor
pero podemos "llegar" de forma segura si descargamos los certificados de los eslabones intermedios
PVKi-1(i, PBKi)
$\vdots$
PVKi-2(i-1, PBKi-1)
PVKTTP(1, PBK1)
en PGP podemos firmar las claves de conocidos nosotros mismos si nos las han pasado de forma segura
...y ellos también pueden hacer lo mismo, permitiendo alzacanzar un paso más
Nota: PGP tiene una versión de libre distribución llamada GPG derivada de la rfc4880 (OpenPGP)
con PGP podemos llegar a tener confianza en grupos pequeños o medianos, pero no escala bien en grupos grandes
cada eslabón (certificado) tiene una garantía de autenticidad $<1$
a partir de unos cuantos certificados el nivel de seguredad deja de ser aceptable
el encadenado de certificados lo hacemos hasta un punto común
en el caso extremo, todo el mundo puede recibir un certificado de una única TTP: una autoridad de certificación (CA)
si recibimos una conexión TLS, o recibimos un mensaje de correo firmado, o queremos enviar uno cifrado, sólo nos hace falta recibir el certificado del interlocutor:
PVKCA(identidad_interlocutor, PBKinterlocutor)
este certificado, que lo podremos encontrar en un repositorio cualquiera, y lo podremos validar a condición de que conozcamos
previamente la clave PBKCA
(obtenida por medios alternativos fiables)
la PBKCA
es el único elemento que hace falta distribuir de forma segura,
el resto los podremos obtener de forma no segura y validarlos
simple para los clientes, pero frágil:
PBKCAi
las diferentes CAs pueden especializarse: niveles de seguridad, métodos de registro, legislación, costes, o simplemente diferentes organizaciones
los usarios pueden escoger en qué CAs raíz confiar y en cuales no
el usuario (…) debe gestionar
la lista de CAs (raíz) de confianza
las CAs subordinadas emiten certificados a los usuarios
$\Downarrow$
están en línea o como mínimo, están activas frecuentemente
$\Downarrow$
probabilidad "alta" de compromiso de la PVK
$\Downarrow$
hemos de poderlas revocar en caso de compromiso de la PVK
e.g. cuando en una conexión TLS el servidor nos presenta su PBK
, nos la aporta certificada
por una CA subordinada, juntamente con el certificado de la CA subordinada que la ha firmado:
PVKCAsub(id-servidor, PBKservidor)
+ PVKCAroot(id-CAsub, PBKCAsub)
la PBKCAroot
la debemos tener previamente instalada
el procedimiento de registro gestiona la validación de credenciales (registro) que demuestra que un titular posee la clave privada correspondiente a la clave pública que presenta
PVK
ha de ser automática:
PKCS #10
X.509
(previa)
Base64, DER, ASN.1
Estructura serializada PVKCA(interlocutor, PBKinterlocutor)
Certificate
(también 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-----(ejemplo de certificado de google.com)
PEM: Privace Enhanced Mail
Convertimos cada 3 bytes en 4 carácteres:
+
y /
total: 64 carácteres
y si la cadena no es múltiple de 3 bytes, añadimos =
al final:
=
indica que el último bloque tiene todos tres bytes significativos=
indica que el último bloque tiene dos bytes significativos==
indica que el último bloque tiene un byte significativoDER: Distinguished Encoding Rules
funcionalmente equivalente a XML, JSON o la serialización nativa de Java $\rightarrow$ tipo lógico convertido a secuencia de bits
DER es independiente de la arquitectura del procesador
(endianness, tamaño de los registros de la CPU)
Codificación TLV: Tipo + Longitud + Valor
Tipo + Longitud + Valor
SEQUENCE
…)Experimento: Parser DER en línea: lapo.it
ASN.1: Abstract Syntax Notation (One)
equivalente a los "esquemas" XML, a las "clases" de Java (que después podemos serializar), etc.
Tipos básicos
INTEGER
, BOOLEAN
, ENUMERATED
…OCTET STRING
, BIT STRING
, Utf8String
, GeneralizedTime
…secuencia única que identifica un concepto, que se obtiene
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
: equivalente a un struct
de C/C++SEQUENCE OF
: equivalente a un vector []
de C/C++SET
: como SEQUENCE
pero sin orden (semántica)SET OF
: como SEQUENCE OF
pero sin orden (semántica)CHOICE
: alternativa de tipo; equivalente a union
de C/C++ejemplo de 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
define los Distinguished Name o DN
un DN es una secuencia de RDN (Relative DN)
RDNs habituales:
corresponden a un estructura en árbol (LDAP, X.500)
validity {notBefore, notAfter}
issuer Name
serialNumber INTEGER
extensions SEQUENCE OF {OID, Bool, OCTET STRING}
extensions
SEQUENCE OF {OID, Bool, OCTET STRING}
es una manera de añadir información adicional que no está especificada en el momento de definición de la estructura
X.509
(X.509 versión 3)
hay extensiones que hace falta que sean procesadas:
se marcan con Critical True
: si un
sistema procesa el certificado y no entiende la extensión (no conoce el OID
) debe dar el certificado por inválido
BasicConstraints (2.5.29.19)
: cA, pathLenConstraint
KeyUsage (2.5.29.15)
NameConstraints (2.5.29.30)
AuthorityInformationAccess (1.3.6.1.5.5.7.1.1)
las CAs reconocidas (raíz) deben obtenerse de forma fiable
el S.O. o el software actúan de "TTP raíz"
en algunos sistemas se pueden modificar estas listas (por parte del usuario, o el administrador de sistemas)
¿Hay CAs raíz buenas? ¿cómo gestiono la lista de CAs raíz que usaré?
Si el certificado del servidor HTTPS al que nos conectamos está bajo una de estas CA raíz: se muestra en verde
El hecho que la lista de certificados pueda ser manipulada (usuario, sysadmin) ha hecho que aparezcan mecanismos "más seguros"
Por ejemplo: los navegadores han separado en dos listas las CA root confiables: una modificable por el usuario/administrador y otra no (CABforum)
Certificados EV, Extended Validation: las CAs que emiten estos certificados siguen unos procedimientos específicos para la validación de los datos del titular (registro); la lista de certificados raíz normalmente está grabada en el código fuente de los navegadores, etc. Los certificados EV exigen que el propietario del dominio siga procedimientos que se auditan (presencialmente)
Los certificados no-EV no tienen porqué pasar ninguna auditoria, habitualmente se valida simplemente la posesión del servidor Web (HTTP challenge) o del DNS (DNS Challenge)
las CA bajo Certificate Transparency publican los certificados que emiten en una base de datos distribuida
los propietarios legítimos puede consultar (monitorizar) si alguna otra CA ha certificado nuestro dominio
en realidad, cualquier usuario puede escribir y leer esta BB.DD. distribuida
Ver: SSLmate Cert Spotter
DNS CA Authorization (DNS CAA): la CA comprueba que el DNS (CAA record) le autoriza a emitir certificados para el dominio
Esto obliga a un atacante a tener que comprometer no sólo el servidor
(en caso de usar desafío sobre el control del servidor)
si no el control de titularidad del dominio
*.google.com
entre otroslos certificados tienen una validez limitada en el tiempo, pero es posible que su contenido deje de ser válido antes
si esto pasa, hace falta comunicarlo a la RA (Autoridad de Registro) siguiendo los procedimientos que dictamine la Política de Certificación (o la Declaración de Prácticas de Certificación derivada)
ejemplo DNIe: Declaración de prácticas y políticas de certificación
keyCompromise
: quizás he perdido el control de mi PVKaffiliationChanged
: el DN
/SubjectAltName
ya no es correctosuperseded
: se ha emitido un certificado que lo sustituyecessationOfOperation
: ya no hace falta (e.g. el servidor web ya no existe)certificateHold
: suspendido (posteriormente se cancela la suspensión, o se revoca)privilegeWithdrawn
: algún atributo ya no le corresponde al titularCertificate Revocation List
es una lista firmada (rfc5280) que contiene los certicados no caducados que han sido revocados por una CA (o varies: CRL indirectas), el momento en el que han dejado de ser válidos, y la razón por la que han dejado de ser válidos
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 mismo formato que los certificados, pero otros OID
reasonCode
invalidityDate
en CAs de gran volumen las CRL son inaceptablemente grandes: OCSP
los servidores OCSP o VA (Validation Authorities) responden el estado de validez de un certificado individual
en servidores web de alto rendimiento,
la VA puede sufrir una carga similar $\rightarrow$ OCSP stapling
las TSA (Time-Stamp Authorities) emiten pruebas firmadas de que un conjunto de bytes (hash) ha sido presentado a una hora determinada
es un formato de petición y uno de respuesta que contiene un token TimeStampToken
(TST):
el token TST se puede presentar como prueba de que un documento
existia en un cierto momento
las TSA se parecen a las CA pero a parte de disponer de HSM, tienen una fuente fiable de tiempo:
reloj atómico, o un reloj estabilizado térmicamente, o conexión GPS, o connexión a un
servidor NTP (Stratum-2 o similar), o alguna combinación de las anteriores (habitualmente las CA utilizan exclusivamente NTP)
CMS o Cryptographic Message Standard nos permite cifrar o firmar un conjunto de bytes: correo, ficheros individuales, etc.
es una estructura ASN.1:
ContentInfo ::= SEQUENCE { contentType ContentType, content [0] EXPLICIT ANY DEFINED BY contentType } ContentType ::= OBJECT IDENTIFIER
content
tipos disponibles:
Data
: datos sin tratarSignedData
: datos firmados por uno o más firmantesEnvelopedData
: datos cifrados simétricamente, y claves cifradas con la PBK de uno o más receptoresDigestedData
: hash (almacenamiento local, o para posterior ensobrado)EncryptedData
: cifrado en crudo (almacenamiento local, cifrado simétrico)que se pueden combinar recursivamente: e.g.
SignedData(Data("datos"), [firmas])
content
$\rightarrow$SignedData
firma asimétrica
SignedData ::= SEQUENCE { version CMSVersion, digestAlgorithms DigestAlgorithmIdentifiers, encapContentInfo EncapsulatedContentInfo, -- datos firmados certificates [0] IMPLICIT CertificateSet OPTIONAL, -- certificados necesarios (CAs sub.) crls [1] IMPLICIT RevocationInfoChoices OPTIONAL, -- CRL necesarias signerInfos SignerInfos } -- firma(/as en paralelo) DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier SignerInfos ::= SET OF SignerInfo
content
$\rightarrow$EnvelopedData
cifrado, simétrico o asimétrico (ensobrado)
EnvelopedData ::= SEQUENCE { version CMSVersion, originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL, recipientInfos RecipientInfos, -- claves simétricas firmadas al receptor(es) encryptedContentInfo EncryptedContentInfo, -- datos cifrados con clave simétrica anterior unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
content
$\rightarrow$EnvelopedData + SignedData
una combinación habitual (e.g. S/MIME) es firmar y cifrar
el PKCS #7 se usa a veces como formato para entregar certificados (y CRL)
(e.g. mi certificado y la cadena de CA):
el PKCS #7 contiene (content
) SignedData
… conteniendo los certificados
y/o las CRL, pero sin datos ni firmas
pkcs11.h
)
de HSM