質問

私たちは、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を使用して考えてきましたが、ドキュメントはほとんど存在しないです。

編集: ここでは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形式で)ロードしている証明書を投稿すること、あまりにも役立つだろう。

他のヒント

<のhref = "http://java.sun.com/javase/6/docs/api/javax/security/auth/x500/X500Principal.html#getName(java.lang.String)" のrelを使用してみてください= "nofollowをnoreferrer">のX500Principal#のgetName(String)をには、お好みの形式でDNを取得します。そして、あなたがその外の共通名を解析することができます。

あなたが実際の証明書にエイリアスをマッピングしている場合は、

また、あなたはすべて大文字で「エイリアス」を記憶(とすべて大文字で、それを照会)でしたが、あなたはまだマップされた証明書

からオリジナルのケースを持っているでしょう

エラーを再現することはできません。あなたは何JCEを使用していますか?私たちは、Java 5と6からSunのJCEを使用して、私たちは常にオリジナルケースにDNを取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top