Aquí está la estructura de un certificado X.509 :
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
}
Los datos contenidos en el propio certificado son la parte TBSCertificate
: vincula la clave pública (subjectPublicKeyInfo) a un identificador (el sujeto), y varias otras extensiones de atributos).
Esto se combina con la firma para formar una estructura Certificate
. El algoritmo de firma determina cómo se debe hacer esto.
Esencialmente, se calcula un resumen de TBSCertificate
(generalmente SHA-1) y luego se firma con la clave privada del firmante (el emisor en términos de X.509). La modificación más leve del contenido TBSCertificate
debería hacer que el resumen del cambio, lo que a su vez debería invalidar la firma.
Usando claves RSA, la firma del resumen usando la clave privada es matemáticamente muy similar a lo que se haría para el cifrado usando la clave pública. Sin embargo, esto no es lo mismo conceptualmente, y DSA no tiene esa reciprocidad, por ejemplo.
El principio es el mismo para otros tipos de certificados, aunque la estructura puede diferir. Teniendo en cuenta que las claves públicas de PGP son certificados de hecho, es posible que también le interesen estas preguntas: