문제

우리는 RSA 공개 키를 저장하고 사용자가 어떤 키로든 짧은 정보 스트림을 암호화할 수 있게 해주는 Java 애플리케이션을 보유하고 있습니다.또한 애플리케이션을 사용하면 사용자가 새 키 인증서를 키 저장소로 가져올 수 있습니다.파일에서 인증서를 로드할 때 일반 이름(CN)을 별칭으로 사용하려고 합니다.문제는 다음과 같습니다.

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-----
도움이 되었습니까?

해결책

문자 그대로 Identity Operator를 사용한다는 것을 의미한다면 (==) 테스트하려면 어설 션은 항상 실패해야합니다. 대신 alias.equals ( "cn = commonname, ou = ...")를 사용하십시오.

그러나 문제가 아니라고 가정하면 다음을 추가 할 수 있습니다.

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

코드의 적절한 지점에서 결과를 게시합니까? 더 많은 리드가 나타날 수 있습니다. 로드중인 인증서를 게시하면 (텍스트 친화적 인 PEM 형식) 개인 식별 정보를 공개하지 않으면 도움이됩니다.

다른 팁

사용해 보세요 X500Principal#getName(문자열) 원하는 형식으로 DN을 가져옵니다.그런 다음 일반 이름을 구문 분석할 수 있습니다.

또는 별칭을 실제 인증서에 매핑하는 경우 "별칭"을 모두 대문자로 저장하고 쿼리할 수 있지만 매핑된 인증서의 원래 대소문자는 그대로 유지됩니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top