Получите РЕАЛЬНЫЕ данные X.509 из отформатированного сертификата RFC1421 - PullRequest
0 голосов
/ 11 августа 2009

У нас есть приложение Java, которое хранит открытые ключи RSA и позволяет пользователю зашифровать короткий поток информации любым из ключей. Приложение также позволяет пользователю импортировать новый сертификат ключа в хранилище ключей. Когда мы загружаем сертификат из файла, мы хотим использовать общее имя (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

Мы точно знаем, что имя субъекта в файле имеет смешанный регистр, и нам нужно сохранить этот регистр. Кто-нибудь знает, как получить более гибкую поддержку X.509 от JCE в Java6?

Мы думали об использовании облегченного API BouncyCastle, но документации почти не существует.

EDIT: Использование 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-----

Ответы [ 3 ]

1 голос
/ 11 августа 2009

Попробуйте использовать X500Principal # getName (String) , чтобы получить DN в выбранном вами формате. Затем вы можете разобрать общее имя из этого.

В качестве альтернативы, если вы сопоставляете псевдоним с действующим сертификатом, вы можете сохранить «псевдоним» во всех заглавных буквах (и запросить его во всех заглавных буквах), но у вас все равно будет оригинальный регистр из сопоставленного сертификата

0 голосов
/ 11 августа 2009

Невозможно воспроизвести ошибку. Какой JCE вы используете? Мы используем Sun JCE из Java 5 и 6 и всегда получаем DN в оригинальном случае.

0 голосов
/ 11 августа 2009

Если вы имеете в виду, что вы буквально используете для проверки оператор идентификации (==), то утверждение всегда должно проваливаться. Вместо этого используйте alias.equals ("CN = CommonName, OU = ...").

Однако, если проблема не в этом, можно добавить:

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

в соответствующих точках кода и выложить результаты? Это может привести к большему количеству потенциальных клиентов. Публикация загружаемого вами сертификата (в текстовом формате PEM) также будет полезна, если он не раскрывает какую-либо личную информацию.

...