احصل على بيانات X.509 الحقيقية من شهادة RFC1421 المنسقة

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

سؤال

لدينا تطبيق Java يخزن مفاتيح RSA العامة ويسمح للمستخدم بتشفير دفق قصير من المعلومات مع أي من المفاتيح. يسمح التطبيق أيضا للمستخدم باستيراد شهادة مفتاح جديدة في Keystore. عندما نقوم بتحميل الشهادة من ملف، نريد استخدام الاسم الشائع (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+Y4yZDr8JKq 70WX / S2M + OO1 + SBJSXMTEDDFKDAL BGCQHKJOOAQDBQAAWLQIUA + VCQEYMHWXDKY4XC + OO / ZF / PRKCFQCDKAS5HPSMAZBZGTOEYYFT QFJSVW == ----- شهادة نهاية -----
هل كانت مفيدة؟

المحلول

إذا كنت تقصد أنك تستخدم حرفيا مشغل الهوية (==) لاختبار، ثم يجب أن تفشل التأكيد دائما. استخدم الاسم المستعار. المساواة ("CN = CommonName، OU = ...") بدلا من ذلك.

ومع ذلك، على افتراض أن هذه ليست المشكلة، يمكن أن تضيف:

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

في النقاط المناسبة في التعليمات البرمجية ونشر النتائج؟ قد يحضر المزيد من العملاء المتوقعين. سيكون نشر الشهادة التي تقوم بتحميلها (بتنسيق PEM الصديق للنص) ستكون مفيدة للغاية، إذا لم تكشف عن أي معلومات عن تحديد شخصيا.

نصائح أخرى

جرب استخدام X500Principal # GetName (سلسلة) للحصول على DN بتنسيق اختيارك. ثم يمكنك تحليل الاسم الشائع من ذلك.

بدلا من ذلك، إذا كنت تعاني من اسم مستعار إلى شهادة فعلية، فيمكنك تخزين "الاسم المستعار" في جميع القبعات (واستعلامها في جميع الأغطية) ولكنك لا يزال لديك غلاف الأصلي من الشهادة المعينة

لا يمكن إعادة إنتاج الخطأ. ما jce التي تستخدمها؟ نستخدم JCE Sun's JCE من Java 5 و 6 ونحن نحصل دائما على DN في القضية الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top