Domanda

Abbiamo un'applicazione Java che memorizza RSA chiavi pubbliche e consente all'utente di crittografare un breve flusso di informazioni con uno qualsiasi dei tasti. L'applicazione permette inoltre all'utente di importare un nuovo certificato chiave nella chiavi. Quando si carica il certificato da un file, vogliamo usare il nome comune (CN) come alias. Qui è il problema:

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

Si sa per certo che il nome del soggetto nel file ha mescolato dell'involucro e abbiamo bisogno di preservare quel involucro. Qualcuno sa come ottenere il supporto X.509 più flessibile dalla JCE in java6?

Abbiamo pensato di utilizzare l'API leggero BouncyCastle, ma la documentazione è quasi inesistente.

EDIT: Utilizzando JDK 6u11 Ecco l'elenco dei fornitori di sicurezza da 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

Il certificato:

-----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-----
È stato utile?

Soluzione

Se vuoi dire che si sono letteralmente utilizzando l'operatore di identità (==) per testare, quindi l'asserzione deve sempre esito negativo. Utilizzare alias.equals ( "CN = CommonName, UO = ..."), invece.

Tuttavia, supponendo che non è questo il problema, può aggiungere:

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

nei punti appropriati nel codice e dopo i risultati? Si potrebbe alzare più contatti. Distacco il certificato che si sta caricando (in formato PEM text-friendly) sarebbe utile anche, se non è rivelare alcuna informazione di identificazione personale.

Altri suggerimenti

Provare a usare X500Principal # getName (String) per ottenere il DN nel formato di vostra scelta. Poi si può analizzare il nome comune di questo.

In alternativa, se si sta mappando un alias a un certificato vero e proprio è possibile memorizzare il "alias" in tutte le protezioni (e interrogare in tutte le protezioni), ma si avrebbe ancora l'involucro originale dal certificato mappato

Non è possibile riprodurre l'errore. Che JCE si usa? Usiamo JCE del Sole da Java 5 e 6 e siamo sempre il DN nella custodia originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top