Ecco la struttura di un certificato 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
}
I dati contenuti nel certificato stesso sono la parte TBSCertificate
: lega la chiave pubblica (subjectPublicKeyInfo) a un identificatore (l'oggetto) ea varie estensioni di altri attributi.
Questo viene quindi combinato con la firma per formare una struttura Certificate
. L'algoritmo della firma impone come dovrebbe essere fatto.
In sostanza, un compendio di TBSCertificate
(tipicamente SHA-1) viene calcolato e quindi firmato con la chiave privata del firmatario (l'emittente in termini X.509). La minima modifica del contenuto di TBSCertificate
dovrebbe rendere la modifica del digest, che a sua volta dovrebbe invalidare la firma.
Usando le chiavi RSA, la firma del digest usando la chiave privata è matematicamente molto simile a ciò che si farebbe per la crittografia usando la chiave pubblica. Questo non è lo stesso concettualmente, però, e la DSA non ha quella reciprocità, per esempio.
Il principio è lo stesso per altri tipi di certificati, sebbene la struttura possa differire. Considerando che le chiavi pubbliche PGP sono in effetti certificati, potresti essere interessato anche a queste domande: