2014-09-16 2 views
0

У меня проблема. Я загружаю все ключи из своего хранилища ключей Windows-My, некоторые из них находятся на компьютере, а другие - со смарт-карты. Существуют сертификаты (псевдонимы), содержащие ключи с различными возможностями. Некоторые могут только шифровать данные или шифровать секретные ключи, но я заинтересован в фильтрации только тех, которые могут создавать цифровые подписи и проверять цифровые подписи для неотказуемости. Какое поле из цепочки сертификатов определенного сертификата скажет мне об этом, или каким способом получить эту информацию, и получить только сертификаты с атрибутами, которые я ищу?различение различных типов ключей в моем хранилище ключей

благодаря

ответ

0

Каждый сертификат имеет значения KeyUsage и ExtendedKeyUsage. Есть специальные ключевые обыкновений для шифрования, подписи и т.д., проверка подлинности веб-сервера и т.д.

+0

Как получить эти значения? когда я загружаю сертификат: сертификат сертификата = ks.getCertificate (aliass); я не получаю .getKeyUsage(); для этого нужно иметь дело с сертификатами X509? @nadir – caniaskyouaquestion

+0

, когда я передал его X509 и использовал getKeyUsage(). toString(); Я получаю что-то вроде этого: Z @ 77ef6359 – caniaskyouaquestion

+0

Взгляните на проект portecle, это хороший инструмент, который показывает использование ключей и расширенные действия ключа. Вы можете проверить, как они берут эту информацию, глядя на свои источники на sourceforge http://sourceforge.net/p/portecle/code/ci/master/tree/ – Nadir

0

Как сказал @Nadir, есть KeyUsage и необязательно ExtendedKeyUsage в структуре сертификата, вы можете проверить это на RFC 5280 где KeyUsage ASN1 формат определяется как следующим образом:

KeyUsage ::= BIT STRING { 
    digitalSignature  (0), 
    nonRepudiation   (1), -- recent editions of X.509 have 
           -- renamed this bit to contentCommitment 
    keyEncipherment   (2), 
    dataEncipherment  (3), 
    keyAgreement   (4), 
    keyCertSign    (5), 
    cRLSign     (6), 
    encipherOnly   (7), 
    decipherOnly   (8) } 

и ExtendedKeyUsage определяется как SEQUENCE из Object identifiers OIDs:

ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId 
KeyPurposeId ::= OBJECT IDENTIFIER 

, где это возможно OIDs являются:

id-kp-serverAuth    OBJECT IDENTIFIER ::= { id-kp 1 } 
id-kp-clientAuth    OBJECT IDENTIFIER ::= { id-kp 2 } 
id-kp-codeSigning   OBJECT IDENTIFIER ::= { id-kp 3 } 
id-kp-emailProtection  OBJECT IDENTIFIER ::= { id-kp 4 } 
id-kp-timeStamping   OBJECT IDENTIFIER ::= { id-kp 8 } 
id-kp-OCSPSigning   OBJECT IDENTIFIER ::= { id-kp 9 } 

Как попросить проверить, какой секретный ключ, связанные с этим сертификатом выдаются для выполнения цифровых подписей с помощью Java можно использовать класс java.security.cert.X509Certificate:

import java.security.KeyStore; 
import java.security.cert.X509Certificate; 

KeyStore ks = ...; 
X509Certificate certificate = (X509Certificate) ks.getCertificate(alias); 
boolean[] keyUsage = certificate.getKeyUsage(); 
// keyUsage[0] --> digitalSignature 
// keyUsage[1] --> non repudiation 
if(keyUsage[0] || keyUsage[1]){ 
    // certificate is issued to perform signature 
} 

Необязательно, если вам это нужно, вы можете также получить доступ к ExtendedKeyUsage с тем же классом:

X509Certificate certificate =...; 
certificate .getExtendedKeyUsage(); 

Надеется, что это помогает,

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

  • Нет связанных вопросов^_^