Validação de certificados em Java

Propaganda
Segurança Informática e nas
Organizações
Guiões das Aulas Práticas
André Zúquete1 e Hélder Gomes2
1
Departamento de Eletrónica, Telecomunicações e Informática
2
Escola Superior de Tecnologia e Gestão de Águeda
Universidade de Aveiro
20162017
Aula Prática 5
Validação de certicados em Java
Resumo:
- Assinaturas digitais.
- Dispositivos PKCS#11
- Assinaturas digitais com o Cartão de Cidadão.
Conteúdo
5.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . 5-2
5.2 Intervalo de validade dos certicados . . . . . . . . 5-2
5.3 Certicados âncora de conança . . . . . . . . . . 5-2
5.3.1
5.3.2
5.4
5.5
5.6
5.7
Leitura de certicados a partir de uma keystore . . 5-3
Carregamento de uma keystore com certicados . . 5-3
Construção de um caminho de certicação
Validação de um caminho de certicação .
Desaos . . . . . . . . . . . . . . . . . . . . .
Bibliograa . . . . . . . . . . . . . . . . . . .
5-1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5-4
5-5
5-7
5-7
5.1 Introdução
Os certicados digitais de chave pública são denidos na norma X.509v3 e
são geridos no contexto de PKIs (Public Key Infrastructures - Infraestruturas
de Chave Pública), que denem as políticas que regulam a sua utilização. A
maioria ds normas que regulam a utilizaç ao de certicados digitais X.509 na
1
Internet, foram denidas pelo PKIX Working Group
da IETF.
Este guião aborda a validação de certicados. Um certicado é considerado
válido, para ser utilizado para um m especíco, se as seguintes condições se
vericarem: (i) o certicado é/foi usado dentro do seu período de validade,
(ii) o certicado foi emitido (assinado) por uma entidade (CA) de conança
e (iii) as políticas no certicado permitem a sua utilização para o m pretendido.
Neste guião, apenas iremos abordar as duas primeiras condições
acima indicadas.
Para obter informação adicional, pode consultar o Java
2
PKI Reference Guide .
Para a realização deste guião é necessário que tenha o software do Cartão de
Cidadão instalado no seu computador.
5.2 Intervalo de validade dos certicados
Os certicados X.509 contém a denição de um intervalo de validade que
dene o período temporal em que eles podem ser usados.
Implemente um pequeno programa que leia um certicado do seu Cartão de
Cidadão e verique se a data actual está dentro do período de validade do
certicado.
Sugestão:
Use a classe X509Certicate.
5.3 Certicados âncora de conança
Os certicados de âncora de conança são os certicados no qual o utilizador
cona e que, tipicamente, são certicados raiz (i.e., auto-assinados).
1 https://datatracker.ietf.org/wg/pkix/documents/
2 https://docs.oracle.com/javase/8/docs/technotes/guides/security/certpath/CertPathProgGuide.html
5-2
5.3.1 Leitura de certicados a partir de uma keystore
Normalmente os certicados âncora de conança são fornecidos pelo sistema
operativo ou pelos programas que deles necessitam (e.g., Firefox, Thunderbird, etc.), mas podem também ser fornecidos pelo utilizador.
ticados devem ser protegidos numa
Keystore,
Estes cer-
para evitar a adição ou a
remoção de algum deles, intencionalmente ou não.
O Java inclui um con-
junto de certicados raiz (âncoras de conança), que podem ser lidos do
cheiro
lib/security/cacerts, na pasta da versão de Java que está a usar.
Pode usar a seguinte linha de código para obter o nome completo do cheiro
cacerts.
String filename = System.getProperty("java.home") +
"/lib/security/cacerts".replace('/', File.separatorChar);
cacerts contém
password "changeit).
O cheiro
a
uma
keystore
que pode carregar (load) usando
Os certicados de âncora de conança (ou raiz de conança) são importantes
para a validação de caminhos de certicação (ou cadeias de certicados).
Qualquer caminho de certicação válido tem de terminar num certicado
âncora de conança.
A classe
PKIXParameters
do Java, que especica o
conjunto de parâmetros para o algoritmo de validação de certicados denido
pelo PKIX, o que inclui os certicados âncora de conança, pode ser usada
keystore.
ks é a variável que contém o keystore,
para ler todos os certicados âncora de conança contidos numa
O seguinte excerto de código, em que
ilustra como isso pode ser feito:
PKIXParameters par = new PKIXParameters(ks);
for(TrustAnchor ta : par.getTrustAnchors() )
{
X509Certificate c = ta.getTrustedCert();
System.out.println( c.getSubjectDN().getName());
}
Implemente um pequeno programa que mostre todos os certicados de conança (âncoras de conança) do Java.
5.3.2 Carregamento de uma keystore com certicados
Por vezes os certicados estão sob a forma de cheiros numa pasta, como
acontece com os certicados de conança da Mozilla, que estão na pasta
5-3
/usr/share/ca-certificates/mozilla. Pode pois ser conveniente lê-los
keystore (por exemplo, para iniciar um objecto PKIXParameters).
para uma
No guião sobre a utilização do Cartão de Cidadão pode ver como ler um
certicado a partir de um cheiro. O seguinte excerto de código mostra como
inserir um
array
de certicados (variável
certs)
numa
keystore
vazia.
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null); //empty keystore
for(Certificate c : certs ){
X509Certificate xc = (X509Certificate) c;
ks.setCertificateEntry(xc.getSubjectDN().getName(), c);
}
Implemente um pequeno programa que leia todos os certicados raiz de conança da Mozilla e os coloque numa
Sugestão:
Use a classe
keystore.
File.
5.4 Construção de um caminho de certicação
Uma cadeia de certicados, ou caminho de certicação, é o conjunto de certicados que compõem a cadeia de conança, desde a âncora de conança até
ao certicado do utilizador nal.
Frequentemente, para validar um certi-
cado de um utilizador nal é necessário construir uma cadeia de certicação
usando um conjunto de possíveis certicados intermédios.
Outras vezes, o
utilizador nal fornece a cadeia de certicação em conjunto com o seu certicado.
O seguinte excerto de código mostra como construir uma cadeia de certicação, dados um conjunto de certicados âncora de conança, um conjunto de
possíveis certicados intermédios, e um certicado de utilizador nal.
//defines the end-user certificate as a selector
X509CertSelector cs = new X509CertSelector();
cs.setCertificate((X509Certificate)myCert);
//Create an object to build the certification path
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
//Define the parameters to buil the certification path and
//provide the Trust anchor certificates (trustAnchors) and
//the end user certificate (cs)
PKIXBuilderParameters pkixBParams =
5-4
new PKIXBuilderParameters(trustAnchors,cs);
pkixBParams.setRevocationEnabled(false); //No revocation check
//Provide the intermediate certificates (iCerts)
CollectionCertStoreParameters ccsp =
new CollectionCertStoreParameters(Arrays.asList(iCerts));
CertStore store = CertStore.getInstance("Collection", ccsp);
pkixBParams.addCertStore(store);
//Build the certification path
CertPath cp = null;
try {
CertPathBuilderResult cpbr = cpb.build(pkixBParams);
cp = cpbr.getCertPath();
System.out.println(
"Certification path built with success!");
} catch (CertPathBuilderException ex) {
System.out.println(
"It was not possible to build a certification path!");
}
Nota:
Durante a construção da cadeia de certicação, é possível vericar o
estado de revogação dos certicados. No entanto, por simplicidade, o excerto
de código acima não faz essa vericação.
A revogação de certicados é o
assunto da secção seguinte.
Descarregue da página da disciplina o conjunto de todos os certicados intermédios do Cartão de Cidadão e implemente um pequeno programa para
construir o caminho de certicação para o seu certicado de autenticação,
usando os certicados âncora de conança do Java.
5.5 Validação de um caminho de certicação
Dado um caminho de certicação, podemos proceder à sua validação, i.e.,
vericar se as assinaturas de todos os certicados estão válidas e se nenhum
dos certicados foi revogado, entre outras vericações denidas pelas normas
PKIX. Um certicado revogado é um certicado que foi tornado inválido
antes de terminar o seu intervalo de validade.
O PKIX dene dois mecanismos para permitir vericar se um certicado
foi ou não revogado: As listas de certicados revogados (CRL - Certicate
Revocation Lists) e o protocolo para a vericação online do estado dos certi-
5-5
cados (OCSP - Online Certicate Status Protocol). O Java 8 disponibiliza
a classe
PKIXRevocationChecker
que pode ser congurada para vericar o
estado de revogação de uma cadeia de certicação usando os dois mecanismos atrás indicados. Também permite a validação de certicados baseada
em propriedades especícas contidas nos certicados, mas isso não será aqui
abordado.
O seguinte excerto de código mostra como pode ser feita a validação de uma
cadeia de certicação em Java8, usando o protocolo OCSP para vericar o
estado de revogação dos certicados (a variável
cp contém o caminho de cer-
ticação para validar, incluindo o certicado do utilizador nal, e a variável
trustAnchors contém o conjunto de certicados raíz de conança).
PKIXParameters pkixParams = new PKIXParameters(trustAnchors);
//Class that performs the certification path validation
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
//Disables the previous mechanism for revocation check (pre Java8)
pkixParams.setRevocationEnabled(false);
//Enable OCSP verification
Security.setProperty("ocsp.enable", "false");
//Instantiate a PKIXRevocationChecker class
PKIXRevocationChecker rc =
(PKIXRevocationChecker) cpv.getRevocationChecker();
//Configure to validate all certificates in chain using only OCSP
rc.setOptions(EnumSet.of(
PKIXRevocationChecker.Option.SOFT_FAIL,
PKIXRevocationChecker.Option.NO_FALLBACK));
PKIXCertPathValidatorResult result = null;
try {
//Do the velidation
result =
(PKIXCertPathValidatorResult) cpv.validate(cp, pkixParams);
System.out.println("Certificado Válido");
System.out.println("Issuer of trust anchor certificate: " +
result.getTrustAnchor().getTrustedCert().getIssuerDN().getName());
} catch (CertPathValidatorException cpve) {
System.out.println("Validation failure, cert[" +
cpve.getIndex() + "] :" + cpve.getMessage());
}
Implemente um pequeno programa para validar o caminho de certicação
que construiu na secção anterior.
5-6
NOTA:
Pode usar o
Wireshark para vericar as mensagens trocadas com os
servidores de OCSP para a obtenção do estado de revogação dos certicados
na cadeia de certicação.
5.6 Desaos
Altere o seu programa, desenvolvido na secção anterior, para usar apenas
CRL para vericar a revogação de certicados na validação da cadeia de
certicação.
Altere o seu programa, para usar o OCSP em primeiro lugar e as CRL caso
o OCSP falhe.
Altere o seu programa para vericar apenas o estado de revogação do certicado do utilizador nal.
5.7 Bibliograa
http://docs.oracle.com/javase/tutorial/security/index.html
http://docs.oracle.com/javase/8/docs/technotes/guides/security
https://docs.oracle.com/javase/8/docs/technotes/guides/
security/certpath/CertPathProgGuide.html
https://docs.oracle.com/javase/8/docs/technotes/guides/
security/StandardNames.html
https://docs.oracle.com/javase/
8/docs/api/
https://datatracker.ietf.org/wg/pkix/charter/
https://en.wikipedia.org/wiki/X.509
5-7
5-8
Download