2014-02-17 4 views
0

Я хочу сделать небольшую программу, которая поступает в качестве входных данных (1) Сертификат X509 (2) соответствующий ЦС, который подписал этот сертификат. Он должен проверить этот сертификат, если он не поврежден или нет, путем проверки подписи. Для этого я считаю, что сначала мне нужно извлечь две вещи: (1) Значение подписи (2) остальных полей сертификата. Следующий код работает нормально для получения открытого ключа , но для меня требуется значение подписи.Получить значение подписи из сертификата X509

URL httpslink = new URL("https://mail.yahoo.com"); 
HttpsURLConnection con = (HttpsURLConnection) httpslink.openConnection(); 
con.connect(); 
Certificate ct[] = con.getServerCertificates(); 

X509Certificate c = ((X509Certificate) ct[0]); 
System.out.println(c.getPublicKey().toString()); 

Я пробовал много способов получить значение подписи, но мне не удалось. Можете ли вы, ребята, дать мне хотя бы удар, чтобы сделать это. THANK YOU

+0

Вы пробовали метод getSignature? http://docs.oracle.com/javase/7/docs/api/java/security/cert/X509Certificate.html#getSignature() – Jumbogram

+0

Да, я ... он не показывает мне значение подписи! Он показывает мне это странное значение => [B @ 5fa34e31 – user3317181

+0

Это результат вызова toString() в массиве byte []. Содержимое по-прежнему является подписью. – EJP

ответ

0

Как уже упоминалось, используя метод getSignature, вы получаете подпись. Тем не менее, это byte[]. Таким образом, вы не должны ожидать ничего полезного от его значения toString.

Относительно оригинал объективна, хотя:

проверить этот сертификат, если он не поврежден или не проверив подпись.

Вам не нужно делать все это вручную. Вместо этого вам следует использовать Certificate методы getPublicKey и verify:

boolean check (Certificate testCert, Certificate caCert) 
{ 
    try 
    { 
     testCert.verify(caCert.getPublicKey()); 
     return true; 
    } 
    catch (GeneralSecurityException e) 
    { 
     return false; 
    } 
] 

В зависимости от используемых алгоритмов может потребоваться использовать другой проверить перегрузки поставить явную поставщика.

Для сомневающихся в соответствии Certificate метод комментариев:

/** 
* Verifies that this certificate was signed using the 
* private key that corresponds to the specified public key. 
* 
* @param key the PublicKey used to carry out the verification. 
* 
* ... 
*/ 
public abstract void verify(PublicKey key) 

/** 
* Gets the public key from this certificate. 
* 
* @return the public key. 
*/ 
public abstract PublicKey getPublicKey() 
+0

@EJP Вы совершенно неправы. – mkl

+0

@ EJP * Сертификат ЦС и подписанный им сертификат имеют один и тот же открытый ключ? * - никто этого не утверждал. См. Мое дополнение к ответу 'testCert.verify' * Проверяет, что этот сертификат был подписан с использованием закрытого ключа, который соответствует указанному открытому ключу. * – mkl

+0

@EJP * Идея состоит в том, что у вас есть открытый ключ субъекта через другой источник. * - Нет, идея состоит в том, что у вас есть сертификат CA и проверьте, был ли связанный с ним закрытый ключ подписывал сертификат для тестирования. Это то, о чем попросил ОП: * Я хочу сделать небольшую программу, которая поступает в качестве входных данных (1). Сертификат X509 (2) соответствующий ЦС, который подписал этот сертификат. Он должен проверить этот сертификат, если он не поврежден или нет, подтвердив подпись. * – mkl

Смежные вопросы