2014-09-16 6 views
0

문제가 있습니다. Windows-My 키 저장소의 모든 키를로드합니다. 일부 키는 컴퓨터에서 가져온 것이고 다른 키는 스마트 카드에서 가져온 것입니다. 다른 기능을 가진 키가 포함 된 인증서 (별칭)가 있습니다. 데이터를 암호화하거나 비밀 키를 암호화 할 수있는 사람도 있지만 디지털 서명을 만들고 부인 방지를 위해 디지털 서명을 확인할 수있는 것들만 필터링하는 데 관심이 있습니다. 특정 인증서의 인증서 체인의 어떤 필드가 해당 정보를 얻는 지, 또는 해당 정보를 얻는 방법은 무엇이며 원하는 특성을 가진 인증서 만 가져올 수 있습니까?내 키 저장소의 다른 유형의 키 구분

감사합니다.

답변

0

각 인증서에는 KeyUsage 및 ExtendedKeyUsage 값이 있습니다. 등의 암호화, 서명 등, 웹 서버 인증을위한 특수 키 용도가 있습니다 KeyUsage ASN1 형식은 다음과 같이 정의된다

+0

어떻게 그 값을 검색하나요? 같은 인증서를로드 할 때 : Certificate certificate = 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 ::= 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하면 SEQUENCEObject identifiers OIDs의 정의된다

ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId 
KeyPurposeId ::= OBJECT IDENTIFIER 
0,123,414 가능 OID를은 다음과 같습니다

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.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 
} 

선택적 경우를

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

희망이 도움이,을 : 당신은 당신이 같은 클래스로 ExtendedKeyUsage에 액세스 할 수 있습니다, 필요