Dal punto di vista di un programmatore, sono necessarie alcune cose per convalidare un certificato X.509.
- Un insieme di "trust ancore" — i certificati di origine delle CA su cui si fa affidamento. Questi devono essere protetti da manomissioni, in modo che un utente malintenzionato non sostituisca un certificato CA con il proprio falso. Le chiavi pubbliche in questi certificati vengono utilizzate per verificare le firme digitali su altri certificati.
- Una raccolta di certificati intermedi. L'applicazione potrebbe conservare una raccolta di questi, ma la maggior parte dei protocolli, come SSL e S/MIME, che utilizzano i certificati hanno un modo standard per fornire certificati aggiuntivi.La conservazione di questi non richiede alcuna cura particolare; la loro integrità è protetta dalla firma di una CA radice.
- Informazioni di revoca. Anche se un certificato è stato emesso da una CA, potrebbe essere stato revocato prematuramente perché la chiave privata è stata divulgata o l'entità finale ha cambiato la propria identità. Ad esempio, una persona cambia lavoro e un certificato con il nome della vecchia società in esso contenuto viene revocato. È possibile utilizzare CRL o un servizio Web come OCSP per ottenere un aggiornamento sullo stato di un certificato.
Con questi ingressi disponibili, è possibile utilizzare built-in PKIX support per costruire e convalidare un percorso del certificato.
/* Givens. */
InputStream trustStoreInput = ...
char[] password = ...
List<X509Certificate> chain = ...
Collection<X509CRL> crls = ...
/* Construct a valid path. */
KeyStore anchors = KeyStore.getInstance(KeyStore.getDefaultType());
anchors.load(trustStoreInput, password);
X509CertSelector target = new X509CertSelector();
target.setCertificate(chain.get(0));
PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target);
CertStoreParameters intermediates = new CollectionCertStoreParameters(chain)
params.addCertStore(CertStore.getInstance("Collection", intermediates));
CertStoreParameters revoked = new CollectionCertStoreParameters(crls);
params.addCertStore(CertStore.getInstance("Collection", revoked));
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
/*
* If build() returns successfully, the certificate is valid. More details
* about the valid path can be obtained through the PKIXBuilderResult.
* If no valid path can be found, a CertPathBuilderException is thrown.
*/
PKIXBuilderResult r = (PKIXBuilderResult) builder.build(params);
Una cosa importante da notare è che se un percorso non può essere trovato, non si ottiene molte informazioni circa il motivo. Questo può essere frustrante, ma è così in base alla progettazione. In generale, ci sono molti percorsi potenziali. Se falliscono tutti per ragioni diverse, in che modo il costruttore di percorsi decidere cosa segnalare come motivo?
Grazie per la spiegazione dettagliata del concetto di CA. Lo capisco adesso. Devo solo capire i dettagli sul livello di programmazione ora. – Rob