Olá Habr! Apresento a você a tradução do artigo final "Certificado Java", de Jakob Jenkov, a partir de uma série de artigos para iniciantes que desejam aprender o básico da criptografia em Java.
Sumário:
- Criptografia Java
- Cifra Java
- Messagedigest
- Mac
- Assinatura
- Par de chaves
- Keygenerator
- KeyPairGenerator
- Keystore
- Keytool
- Certificado
- CertificateFactory
- CertPath
Certificado Java
A classe de certificado ( java.security.cert.Certificate ) é um certificado que certifica que uma entidade pertence, por exemplo, a um usuário. A instância da classe de certificado contém o nome e outras informações sobre o objeto que identifica, bem como, possivelmente, uma assinatura digital de uma autoridade de certificação (CA). A classe Certificate é uma classe abstrata; portanto, você pode usar Certificate como o tipo da variável e sua variável sempre apontará para uma subclasse. Essa classe possui uma subclasse - X509Certificate , que representa o certificado X.509, usado como certificado nos protocolos HTTPS e TLS.
Obtendo uma instância de certificado
Você pode obter uma instância de certificado das seguintes maneiras:
Consulte estes dois guias para obter mais informações sobre como obter uma instância de certificado.
getEncoded ()
O método getEncoded() do certificado retorna a versão codificada do certificado como uma matriz de bytes. Por exemplo, se o certificado for um certificado X509, a matriz de bytes retornada conterá uma versão codificada em X.590 da instância do certificado (ASN.1 DER). Aqui está um exemplo usando o método getEncoded() :
 byte[] encodedCertificate = certificate.getEncoded(); 
getPublicKey ()
O método de certificado getPublicKey() retorna a chave pública desta instância de certificado. Aqui está um exemplo do método getPublicKey() :
 PublicKey certificatePublicKey = certificate.getPublicKey(); 
getType ()
O método getType() retorna o tipo de instância do certificado. Exemplo getType() :
 String certificateType = certificate.getType(); 
verificar ()
A classe de certificado contém três métodos verify() . Esses métodos podem ser usados para verificar se o certificado está realmente assinado com a chave privada correspondente à chave pública esperada. Aqui está um exemplo de verificação de certificado:
 
O método verify() não retorna um valor. Se o teste falhar, uma InvalidKeyException será InvalidKeyException . Se nenhuma exceção for lançada, a instância do certificado poderá ser considerada verificada.
Java CertificateFactory (Fábrica de Certificados
A classe CertificateFactory ( java.security.cert.CertificateFactory ) é capaz de criar instâncias de certificado ( Certificate ) a partir de dados binários para certificados codificados em X.509 (ASN.1 DER). CertificateFactory também pode criar instâncias CertPath . CertPath é uma cadeia de certificados, em que cada certificado é assinado pelo próximo certificado nesta cadeia.
Criando uma instância do CertificateFactory
Antes de criar instâncias de Certificate , você deve criar uma instância de CertificateFactory . Um exemplo:
 CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
Este exemplo cria uma instância do CertificateFactory , capaz de instanciar um certificado X.509 ( X509Certificate é uma subclasse de Certificate ).
Criar instância de certificado
Criando uma instância do CertificateFactory , você pode começar a criar instâncias do Certificate . Isso é feito chamando o método generateCertificate() . Um exemplo de chamada ao método generateCertificate() :
 InputStream certificateInputStream = new FileInputStream("my-x509-certificate.crt"); Certificate certificate = certificateFactory.generateCertificate(certificateInputStream); 
Criando uma instância do CertPath
CertificateFactory também pode instanciar CertPath . Uma instância do CertPath criada chamando o método generateCertPath() :
 InputStream certificateInputStream = new FileInputStream("my-x509-certificate-chain.crt"); CertPath certPath = certificateFactory.generateCertPath(certificateInputStream); 
Java CertPath (cadeia de certificados)
A classe CertPath ( java.security.cert.CertPath ) representa uma cadeia de certificados (objetos Certificate ), em que cada certificado é um assinante digital do próximo certificado na cadeia. A classe CertPath normalmente usada para verificar um certificado de identidade, junto com certificados de autoridades de certificação (CAs) que assinaram o certificado.
Obtendo uma Instância do CertPath
Normalmente, uma instância do CertPath obtida em uma fábrica de certificados ( CertificateFactory CertPathBuilder ).
getCertificates ()
Depois de obter a instância do CertPath , você pode obter as instâncias de Certificate quais o CertPath consiste chamando o método getCertificates() . Aqui está um exemplo de obtenção de certificados de uma instância do CertPath :
 List<Certificate> certificates = certPath.getCertificates(); 
getType ()
O método getType() retorna uma sequência indicando que tipo de certificados (por exemplo, X.509) está contido nesta instância do CertPath . Aqui está um exemplo de como obter o tipo CertPath através do método getType() :
 String type = certPath.getType();