2009-08-10 3 views
0

우리는 RSA 공개 키를 저장하고 사용자가 키를 사용하여 짧은 정보 스트림을 암호화 할 수있는 Java 응용 프로그램을 보유하고 있습니다. 또한이 응용 프로그램은 사용자가 새 키 인증서를 키 스토어로 가져올 수 있도록합니다. 파일에서 인증서를로드 할 때 CN (별칭)으로 일반 이름을 사용하려고합니다. 여기에 문제가 :RFC1421 형식의 인증서에서 REAL X.509 데이터 가져 오기

CertificateFactory x509CertFact = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = x509CertFact.generateCertificate(certificateInputStream); 
String alias = cert.getSubjectX500Principal().getName(); 

assert alias.equals("CN=CommonName, OU=TestCo..."); // FAILS 
assert alais.equals("cn=commonname, ou=testco..."); // PASSES 

우리는 파일의 주체 이름은 케이스를 혼합했다는 사실을 알고 있고 우리는 그 케이스를 보존해야합니다. 누구든지 Java6의 JCE에서보다 유연한 X.509 지원을받는 방법을 알고 있습니까?

우리는 BouncyCastle 경량 API를 사용하려고 생각했지만 문서는 거의 존재하지 않습니다.

편집 : 여기에 JDK의 6u11 사용은 java.security에서 보안 업체의 목록입니다

security.provider.1=sun.security.provider.Sun 
security.provider.2=sun.security.rsa.SunRsaSign 
security.provider.3=com.sun.net.ssl.internal.ssl.Provider 
security.provider.4=com.sun.crypto.provider.SunJCE 
security.provider.5=sun.security.jgss.SunProvider 
security.provider.6=com.sun.security.sasl.Provider 
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI 
security.provider.8=sun.security.smartcardio.SunPCSC 
security.provider.9=sun.security.mscapi.SunMSCAPI 
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider 

인증서 :

 
-----BEGIN CERTIFICATE----- 
MIIDHjCCAtugAwIBAgIESnr4OzALBgcqhkjOOAQDBQAwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT 
DEdlbWFsdG8gSW5jLjEnMCUGA1UECxMeU29sdXRpb25zIGFuZCBTcGVjaWFsIFByb2plY3RzMSMw 
IQYDVQQDExpGUkJCTHVuYUNyeXB0b1NlcnZlci0xLjAuMDAeFw0wOTA4MDYxNTM1MjNaFw0wOTEx 
MDQxNTM1MjNaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxHZW1hbHRvIEluYy4xJzAlBgNVBAsT 
HlNvbHV0aW9ucyBhbmQgU3BlY2lhbCBQcm9qZWN0czEjMCEGA1UEAxMaRlJCQkx1bmFDcnlwdG9T 
ZXJ2ZXItMS4wLjAwggG3MIIBLAYHKoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qcLuzk5/YRt1I8 
70QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJP 
u6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCFQCXYFCP 
FSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o66oL5V0wLPQeCZ1FZV466 
1FlP5nEHEIGAtEkWcSPoTCgWE7fPCTKMyKbhPBZ6i1R8jSjgo64eK7OmdZFuo38L+iE1YvH7YnoB 
JDvMpPG+qFGQiaiD3+Fa5Z8GkotmXoB7VSVkAUw7/s9JKgOBhAACgYBHBBVNzuoXgpPFPkSN71rI 
MKkSIUAVE7iLagFCklCEvHlh1UxyRhCWNh/UazaJzHRZofWlVPRGmgtl+J6BJRJIDorPqt8FfifY 
fpbAbCQctMToFF5QqggumOlJozXyfV9eyYyNn+Y4yZDr8JKq70WX/S2M+Oo1+SBJsXMTeDdfkDAL 
BgcqhkjOOAQDBQADMAAwLQIUA+VcqEYMHwXdKY4XC+oO/zF/pRkCFQCDKAS5HpSMazbZgToEEYft 
QFJSvw== 
-----END CERTIFICATE----- 
+0

나는 이것도 도망 쳤다. X500Principal은 DN의 다른 부분에 접근 할 수있는 방법을 제공하지 않습니다. 나는 X500Principal.getName()의 결과를 구문 분석하는 것이 유일한 해결책이라고 생각한다. –

답변

0

당신이 그대로 신원 연산자를 사용하는 것을 의미하는 경우 (==) 테스트하려면 어설 션이 항상 실패해야합니다. 대신 alias.equals ("CN = CommonName, OU = ...")를 사용하십시오. 코드의 해당 지점에서

System.out.println(x509CertFact.getProvider()); 
System.out.println(alias); 

을하고 그 결과를 게시 :

그러나,이 문제가 아니에요 가정, 추가 할 수 있습니까? 리드가 늘어날 수 있습니다. 개인 식별 정보를 공개하지 않으면로드중인 인증서를 게시 (텍스트 친화적 인 PEM 형식)해도 도움이됩니다.

+0

당신이 맞다, 주장은 단지 설명을위한 것이었다. 또한 원래 질문으로 인증서를 게시합니다. 고맙습니다. –

0

오류를 재현 할 수 없습니다. JCE는 어떤 것을 사용합니까? Java 5 및 6의 Sun의 JCE를 사용하며 항상 원래의 경우 DN을 얻습니다.

1

X500Principal#getName(String)을 사용하여 원하는 형식으로 DN을 가져 오십시오. 그런 다음 일반 이름을 구문 분석 할 수 있습니다. 당신이 실제 인증서 별칭을 매핑하는 경우

양자 택일로, 당신은 모두 대문자에서 "별칭을"저장 (모든 대문자를 쿼리)하지만 당신은 여전히 ​​매핑 된 인증서에서 원래 케이스를했을 수

관련 문제