0

RSA公開鍵を格納し、ユーザーが任意の鍵を使用して情報の短いストリームを暗号化できるようにするJavaアプリケーションがあります。このアプリケーションでは、ユーザーが新しいキー証明書をキーストアにインポートすることもできます。ファイルから証明書をロードするときは、エイリアスとして共通名(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

ファイル内のサブジェクト名に大文字と小文字が混在していることはわかっているので、その大文字と小文字を保持する必要があります。Java6のJCEからより柔軟なX.509サポートを取得する方法を知っている人はいますか?

BouncyCastle軽量APIの使用を検討しましたが、ドキュメントはほとんど存在しません。

編集:JDK6u11の使用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

証明書:

-----証明書の開始-----
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
fpbAbC​​QctMToFF5QqggumOlJozXyfV9eyYyNn + Y4yZDr8JKq70WX / S2M + Oo1 + SBJsXMTeDdfkDAL
BgcqhkjOOAQDBQADMAAwLQIUA + VcqEYMHwXdKY4XC + oO / zF / pRkCFQCDKAS5HpSMazbZgToEEYft
QFJSvw ==
-----証明書の終了-----
4

3 に答える 3

1

X500Principal#getName(String)を使用して、選択した形式でDNを取得してみてください。次に、その中から一般名を解析できます。

または、エイリアスを実際の証明書にマッピングする場合は、「エイリアス」をすべて大文字で保存(およびすべて大文字でクエリ)することもできますが、マッピングされた証明書の元の大文字小文字は引き続き使用できます。

于 2009-08-11T17:04:18.353 に答える
0

エラーを再現できません。どのJCEを使用していますか?Java 5および6のSunのJCEを使用し、常に元のケースでDNを取得します。

于 2009-08-10T22:25:44.137 に答える
0

文字通り恒等演算子(==)を使用してテストしている場合、アサーションは常に失敗するはずです。代わりに、alias.equals( "CN = CommonName、OU = ...")を使用してください。

ただし、それが問題ではないと仮定すると、次のように追加できます。

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

コードの適切なポイントで結果を投稿しますか?それはより多くのリードをもたらすかもしれません。個人を特定できる情報が開示されていない場合は、ロードしている証明書を(テキスト対応のPEM形式で)投稿することも役立ちます。

于 2009-08-10T22:11:36.693 に答える