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

StackOverflow https://stackoverflow.com/questions/1257389

Вопрос

У нас есть 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-----
Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top