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