Привет, Хабр! Представляю вашему вниманию перевод заключительной статьи "Java Certificate" автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
- Java Cryptography
- Java Cipher
- MessageDigest
- Mac
- Signature
- KeyPair
- KeyGenerator
- KeyPairGenerator
- KeyStore
- Keytool
- Certificate
- CertificateFactory
- CertPath
Java Certificate (Сертификат)
Класс сертификата (java.security.cert.Certificate) представляет собой сертификат удостоверяющий принадлежность некоторому субъекту, например, пользователю. Экземпляр класса сертификата содержит имя и другие сведения об объекте, который он идентифицирует, а также, возможно, цифровую подпись от центра сертификации (ЦС). Класс Certificate
является абстрактным классом, поэтому, вы можете использовать в качестве типа переменной Certificate
, а ваша переменная всегда будет указывать на подкласс. Этот класс имеет один подкласс — X509Certificate
, который представляет сертификат X.509, использующийся в качестве сертификата в протоколах HTTPS и TLS.
Получение экземпляра сертификата
Вы можете получить экземпляр сертификата следующими способами:
- Из
CertificateFactory
. - Из хранилища ключей.
Посмотрите эти два руководства для получения дополнительной информации о получении экземпляра сертификата.
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<Certificate> certificates = certPath.getCertificates();
getType()
Метод getType()
возвращает строку, указывающую, какой тип сертификатов (например, X.509) содержится в этом экземпляре CertPath
. Вот пример получения типа CertPath
через методом getType()
:
String type = certPath.getType();