2012-04-06 20 views
12

मान्य करना मैं कई चरणों में X509 प्रमाणपत्रों को संसाधित करने और कुछ समस्याओं में चलने की कोशिश कर रहा हूं। मैं जेसीई के लिए नया हूं इसलिए मैं अभी तक पूरी तरह से अद्यतित नहीं हूं।जावा एक्स 50 9 सर्टिफिकेट पार्सिंग और

हम विभिन्न एन्कोडिंग (पीईएम, डीईआर और पीसीकेएस 7) के आधार पर कई अलग-अलग X509 प्रमाणपत्रों को पार्स करने में सक्षम होना चाहते हैं। मैंने फ़ायरफ़ॉक्स (श्रृंखला सहित प्रमाणपत्र) का उपयोग कर पीईएम और पीसीकेएस प्रारूप में https://belgium.be से वही प्रमाण पत्र निर्यात किया है। मैं जोड़ी लाइनों बाहर है कि सवाल

public List<X509Certificate> parse(FileInputStream fis) { 
    /* 
    * Generate a X509 Certificate initialized with the data read from the inputstream. 
    * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates. 
    */ 
    List<X509Certificate> certificates = null; 
     log.debug("Parsing new certificate."); 
     certificates = (List<X509Certificate>) cf.generateCertificates(fis); 
    return certificates; 
    } 

इस कोड के लिए आवश्यक नहीं कर रहे हैं छोड़ दिया है ठीक के रूप में मैं एक FileInputStream बजाय PCKS7 के लिए एक BufferedInputStream, जो काफी पहले से ही मुझे लगता है कि अजीब बात है के साथ काम aslong काम कर रहा है? लेकिन मैं इसके साथ रह सकता हूं।

अगला चरण इन प्रमाणपत्र श्रृंखलाओं को सत्यापित करना है। 1) जांचें कि क्या सभी प्रमाणपत्रों की वैध तिथि है (आसान) 2) ओसीएसपी का उपयोग कर प्रमाणपत्र श्रृंखला की पुष्टि करें (और यदि प्रमाणपत्र में कोई ओसीएसपी यूआरएल नहीं मिलता है तो सीआरएल में फॉलबैक)। यह वह जगह है जहां मैं पूरी तरह से यह सुनिश्चित नहीं कर रहा हूं कि इसे कैसे संभाला जाए।

मैं सूर्य जेसीई का उपयोग कर रहा हूं, लेकिन ऐसा लगता है कि इसके लिए बहुत अधिक दस्तावेज उपलब्ध नहीं हैं (उदाहरणों में)?

मैंने पहले एक सरल कार्यान्वयन किया जो केवल ओसीएसपी/सीआरएल चेक के बिना श्रृंखला की जांच करता है।

private Boolean validateChain(List<X509Certificate> certificates) { 
    PKIXParameters params; 
    CertPath certPath; 
    CertPathValidator certPathValidator; 
    Boolean valid = Boolean.FALSE; 

    params = new PKIXParameters(keyStore); 
    params.setRevocationEnabled(false); 

    certPath = cf.generateCertPath(certificates); 
    certPathValidator = CertPathValidator.getInstance("PKIX"); 

    PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) 
    certPathValidator.validate(certPath, params); 

     if(null != result) { 
     valid = Boolean.TRUE; 
     } 
    return valid; 
} 

यह मेरा पीईएम प्रमाण पत्र के लिए ठीक काम कर रहा है, लेकिन नहीं PCKS7 प्रमाण पत्र के लिए (एक ही certifcate, केवल अन्य प्रारूप में निर्यात)। java.security.cert.CertPathValidatorException: पथ किसी भी ट्रस्ट एंकर के साथ श्रृंखला नहीं है।

एकमात्र अंतर जो मैं देख सकता हूं वह यह है कि जिस क्रम में सर्टपाथ बनता है वह वही नहीं है? मैं यह पता लगाने में सक्षम नहीं था कि क्या गलत हो रहा था इसलिए मैंने इसे अभी छोड़ दिया और पीईएम प्रमाण पत्र के साथ जाने के लिए रखा, लेकिन इस प्रश्न 1 को कॉल करने दें;)

जो मैं बाद में लागू करना चाहता था वह ओसीएसपी जांच थी। जाहिर है अगर मैं ओसीएसपी का उपयोग कर सक्षम करता हूं: Security.setProperty ("ocsp.enable", "true"); और सेट params.setRevocationEnabled (सत्य); यह ओसीएसपी यूआरएल को अपने आप में ढूंढने में सक्षम होना चाहिए, लेकिन ऐसा लगता है कि यह मामला नहीं है। मानक कार्यान्वयन क्या करना है (प्रश्न 2)? java.security.cert.CertPathValidatorException: एक OCSP प्रतिसादी

पिछले जा रहे हैं का स्थान निर्दिष्ट करना होगा, मैं प्रमाण पत्र AuthorityInfoAccessExtension और इस तरह का उपयोग करने से OCSP url प्राप्त करने में एक रास्ता मिल गया।

लेकिन ocsp.url संपत्ति में मैन्युअल रूप से OCSP यूआरएल सेट करने के बाद, मैं एक java.security.cert.CertPathValidatorException हो रही है: OCSP प्रतिसाद त्रुटि: अनधिकृत

ऐसा लगता है कि मैं एक याद कर रहा हूँ बहुत सारे आवश्यक कदम जबकि ऑनलाइन संदर्भों में से बहुत कुछ कहते हैं ocsp.enable संपत्ति को आपको बस इतना करना चाहिए?

शायद आप में से कोई भी whizkids प्रक्रिया के माध्यम से मुझे मार्गदर्शन नहीं कर सकता है?मुझे दिखाएं कि मैं पूरी तरह गलत हूं :)

अगला कदम सीआरएल जांच लागू करेगा यदि कोई ओसीएसपी नहीं मिला, अगर कोई कोई उदाहरण बता सकता है या मुझे इस पर कुछ दस्तावेज दिखा सकता है तो इसकी भी सराहना की जाएगी!

धन्यवाद!

संपादित करें:

// Activate OCSP 
     Security.setProperty("ocsp.enable", "true"); 
     // Activate CRLDP -- no idea what this is 
     Security.setProperty("com.sun.security.enableCRLDP", "true"); 

     X509Certificate target = (X509Certificate) certPath.getCertificates().get(0); 
     Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/"); 
     Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName()); 
     Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName()); 
     Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16)); 

कौन सा एक अपवाद देता है:: जावा के बाद से यह अपने आप ही गुण उठा नहीं कर रहा है, मैं का उपयोग कर सभी गुण अपने आप को स्थापित करने के लिए निम्नलिखित की कोशिश कर रहा हूँ। security.cert.CertPathValidatorException: उत्तरदाता का प्रमाण पत्र नहीं मिला (ओसीएसपी सुरक्षा गुणों का उपयोग कर सेट करें)।

+0

ओएससीपी चेकर इसे getOCSPServerURI विधि में ऐसा करने लगता है: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/security/provider/certpath/OCSPChecker .java # OCSPChecker.getOCSPServerURI% 28sun.security.x509.X509CertImpl% 2Cjava.lang.String% 29 –

+0

आपके उदाहरण में 'सीएफ' क्या है? – spy

+0

यह काफी समय से रहा है, लेकिन मैं कहूंगा कि https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –

उत्तर

15

भविष्य में संदर्भ के लिए मैं अपने ही सवाल का जवाब पोस्ट करेंगे (आंशिक रूप से कम से कम)

OCSP और CRL जांच मानक जावा कार्यान्वयन पहले से ही में लागू किया जाता है और कस्टम कोड या अन्य प्रदाताओं (BC के लिए कोई जरूरत नहीं है , ..)। वे डिफ़ॉल्ट रूप से अक्षम हैं। दो पैरामीटर सेट

इस सक्षम करने के लिए, आप कम से कम करने के लिए है:

(PKIXParameters or PKIXParameterBuilder) params.setRevocationEnabled(true); 
Security.setProperty("ocsp.enable", "true"); 

यह OCSP जाँच जब आप प्रमाण पत्र पथ मान्य करने के लिए कोशिश कर रहे हैं सक्रिय कर देंगे (PKIXCertPathValidatorResult.validate())।

आप सीआरएल के लिए वापस आने की जांच जोड़ना चाहते हैं जब अगर कोई OCSP उपलब्ध है, एक aditional संपत्ति जोड़ें:

System.setProperty("com.sun.security.enableCRLDP", "true"); 

अपनी समस्याओं का एक बहुत तथ्य यह है मैं अलग प्रमाण पत्र का समर्थन करने के लिए है कि की वजह से हो रही हैं प्रारूप (पीकेसीएस 7, पीईएम)। मेरे कार्यान्वयन पीईएम के लिए ठीक काम करता है, लेकिन जब से PKCS7 श्रृंखला में प्रमाण पत्र के आदेश को बचाने नहीं है कि यह थोड़ा मुश्किल (http://bugs.sun.com/view_bug.do?bug_id=6238093)

X509CertSelector targetConstraints = new X509CertSelector(); 

targetConstraints.setCertificate(certificates.get(0)); 
// Here's the issue for PKCS7 certificates since they are not ordered, 
// but I havent figured out how I can see what the target certificate 
// (lowest level) is in the incoming certificates.. 

PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, targetConstraints); 

आशा यह अन्य लोगों के लिए उपयोगी टिप्पणी हो जाएगा और साथ ही है, शायद किसी को कर सकते हैं एक unordered पीकेसीएस 7 सूची में लक्ष्य प्रमाण पत्र कैसे प्राप्त करें पर एक प्रकाश डाला?