2009-08-10 2 views
0

У нас есть приложение Java, которое хранит открытые ключи RSA и позволяет пользователю шифровать короткий поток информации с помощью любого из ключей. Приложение также позволяет пользователю импортировать новый ключ сертификата в хранилище ключей. Когда мы загружаем сертификат из файла, мы хотим использовать общее имя (CN) в качестве псевдонима. Вот проблема:Получить данные REAL X.509 из отформатированного сертификата RFC1421

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----- 
+0

Я тоже столкнулся с этим. Это отстой, что X500Principal не предоставляет методы для доступа к различным частям DN. Я думаю, что анализ результатов X500Principal.getName() является единственным решением ... –

ответ

0

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

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

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

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

+0

Вы правы, утверждение было только для иллюстрации. Кроме того, я отправлю сертификат в исходный вопрос. Спасибо. –

0

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

1

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

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

Смежные вопросы