- Криптография в Java. Класс Certificate
- Оглавление:
- Java Certificate (Сертификат)
- Получение экземпляра сертификата
- getEncoded()
- getPublicKey()
- getType()
- verify()
- Java CertificateFactory (Фабрика сертификатов
- Создание экземпляра CertificateFactory
- Создание экземпляра Certificate
- Создание экземпляра CertPath
- Java CertPath (Цепочка сертификатов)
- Получение экземпляра CertPath
- getCertificates()
- getType()
Криптография в Java. Класс Certificate
Привет, Хабр! Представляю вашему вниманию перевод заключительной статьи «Java Certificate» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
Java Certificate (Сертификат)
Класс сертификата (java.security.cert.Certificate) представляет собой сертификат удостоверяющий принадлежность некоторому субъекту, например, пользователю. Экземпляр класса сертификата содержит имя и другие сведения об объекте, который он идентифицирует, а также, возможно, цифровую подпись от центра сертификации (ЦС). Класс Certificate является абстрактным классом, поэтому, вы можете использовать в качестве типа переменной Certificate , а ваша переменная всегда будет указывать на подкласс. Этот класс имеет один подкласс — X509Certificate , который представляет сертификат X.509, использующийся в качестве сертификата в протоколах HTTPS и TLS.
Получение экземпляра сертификата
Вы можете получить экземпляр сертификата следующими способами:
Посмотрите эти два руководства для получения дополнительной информации о получении экземпляра сертификата.
getEncoded()
Метод getEncoded() сертификата возвращает закодированную версию сертификата в виде байтового массива. Например, если сертификат является сертификатом X509, возвращенный байтовый массив будет содержать версию экземпляра сертификата в кодировке X.590 (ASN.1 DER). Вот пример использования метода getEncoded() :
byte[] encodedCertificate = certificate.getEncoded();
getPublicKey()
Метод сертификата getPublicKey() возвращает открытый ключ этого экземпляра сертификата. Вот пример метода getPublicKey() :
PublicKey certificatePublicKey = certificate.getPublicKey();
getType()
Метод getType() возвращает тип экземпляра сертификата. Пример getType() :
String certificateType = certificate.getType();
verify()
Класс сертификата содержит три метода verify() . Эти методы могут использоваться для проверки того, что сертификат действительно подписан с закрытым ключом, соответствующим ожидаемому открытому ключу. Вот пример проверки сертификата:
// получение ожидаемого открытого ключа (не из сертификата!) PublicKey expectedPublicKey = . ; try < certificate.verify(expectedPublicKey); >catch (InvalidKeyException e) < // сертификат не был подписан данным открытым ключом >catch (NoSuchAlgorithmException | NoSuchProviderException | SignatureException | CertificateException e)< // что-то еще пошло не так >
Метод verify() не возвращает значения. Если проверка не пройдена, будет выдано исключение InvalidKeyException . Если не сгенерировано исключение, экземпляр сертификата можно считать проверенным.
Java CertificateFactory (Фабрика сертификатов
Класс CertificateFactory (java.security.cert.CertificateFactory) способен создавать экземпляры сертификата ( Certificate ) из двоичных данных сертификатов с кодировками X.509 (ASN.1 DER). CertificateFactory также может создавать экземпляры CertPath . CertPath — это цепочка сертификатов, где каждый сертификат подписан следующим сертификатом в данной цепочке.
Создание экземпляра CertificateFactory
Прежде чем вы сможете создавать экземпляры Certificate , вы должны создать экземпляр CertificateFactory . Пример:
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
В этом примере создается экземпляр CertificateFactory , способный создавать экземпляры сертификата X.509 ( X509Certificate — подкласс Certificate ).
Создание экземпляра Certificate
Создав экземпляр CertificateFactory , вы можете начать создавать экземпляры Certificate . Это делается с помощью вызова метода generateCertificate() . Пример вызова метода generateCertificate() :
InputStream certificateInputStream = new FileInputStream("my-x509-certificate.crt"); Certificate certificate = certificateFactory.generateCertificate(certificateInputStream);
Создание экземпляра CertPath
CertificateFactory также может создавать экземпляр CertPath . Экземпляр CertPath создается вызовом метода generateCertPath() :
InputStream certificateInputStream = new FileInputStream("my-x509-certificate-chain.crt"); CertPath certPath = certificateFactory.generateCertPath(certificateInputStream);
Java CertPath (Цепочка сертификатов)
Класс CertPath (java.security.cert.CertPath) представляет цепочку сертификатов (объекты Certificate ), где каждый сертификат является цифровым подписывающим лицом следующего сертификата в цепочке. Класс CertPath обычно используется для проверки сертификата личности вместе с сертификатами центров сертификации (ЦС), которые подписали сертификат.
Получение экземпляра CertPath
Обычно экземпляр CertPath получают из фабрики сертификатов ( CertificateFactory или CertPathBuilder ).
getCertificates()
Получив экземпляр CertPath , вы можете получить экземпляры Certificate , из которых состоит CertPath , вызвав метод getCertificates() . Вот пример получения сертификатов из экземпляра CertPath :
List certificates = certPath.getCertificates();
getType()
Метод getType() возвращает строку, указывающую, какой тип сертификатов (например, X.509) содержится в этом экземпляре CertPath . Вот пример получения типа CertPath через методом getType() :
String type = certPath.getType();