Получите НАСТОЯЩИЕ данные X.509 из сертификата в формате RFC1421

У нас есть приложение 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, но документации почти не существует.

РЕДАКТИРОВАТЬ: Использование 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-----

person Jonathan Bernard    schedule 10.08.2009    source источник
comment
Я тоже столкнулся с этим. Отстойно, что X500Principal не предоставляет методов для доступа к различным частям DN. Я предполагаю, что синтаксический анализ результата X500Principal.getName() - единственное решение...   -  person Kevin Wong    schedule 10.06.2011


Ответы (3)


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

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

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

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

person erickson    schedule 10.08.2009
comment
Вы правы, утверждение было просто для иллюстрации. Кроме того, я опубликую сертификат в исходном вопросе. Спасибо. - person Jonathan Bernard; 11.08.2009

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

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

person Kevin    schedule 11.08.2009

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

person ZZ Coder    schedule 10.08.2009