2016-10-11 11 views
19

में ग्राहक प्रमाणपत्र और पहचान SecKeyGeneratePair फ़ंक्शन का उपयोग करके मैंने अपने स्विफ्ट-आधारित आईओएस एप्लिकेशन को निजी कुंजी और सार्वजनिक कुंजी जेनरेट की है।
फिर, मैंने iOS CSR generation का उपयोग कर प्रमाणपत्र हस्ताक्षर अनुरोध जेनरेट किया और मेरे सर्वर ने पीईएम प्रारूप में प्रमाणपत्र श्रृंखला के साथ उत्तर दिया।
मैं पीईएम-प्रमाण पत्र परिवर्तित der-प्रारूप करने के लिए निम्नलिखित कोड का उपयोग कर: अबआईओएस

var modifiedCert = certJson.replacingOccurrences(of: "-----BEGIN CERTIFICATE-----", with: "") 
modifiedCert = modifiedCert.replacingOccurrences(of: "-----END CERTIFICATE-----", with: "") 
modifiedCert = modifiedCert.replacingOccurrences(of: "\n", with: "") 
let dataDecoded = NSData(base64Encoded: modifiedCert, options: []) 

, मैं का उपयोग कर DER- द्वारा डेटा से प्रमाण पत्र बनाना चाहिए let certificate = SecCertificateCreateWithData(nil, certDer)

मेरा प्रश्न पीछा कर रहा है: मैं कैसे निजी के साथ प्रमाण पत्र कनेक्ट कर सकते हैं कुंजी मैंने शुरुआत में बनाया है और पहचान प्राप्त की है जहां इनमें से दोनों (कुंजी और प्रमाणपत्र) संबंधित हैं?
शायद, कीचेन में प्रमाणपत्र जोड़ें और SecItemCopyMatching का उपयोग कर पहचान प्राप्त करें? मैं प्रश्न में प्रस्तुत प्रक्रिया का पालन किया है SecIdentityRef procedure

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

जब प्रमाण पत्र कीचेन पर जोड़ने, मैं स्थिति प्रतिक्रिया 0, जो मेरा मानना ​​है कि इसका मतलब है कि प्रमाण पत्र कीचेन पर जोड़ दिया गया है मिलता है।

let certificate: SecCertificate? = SecCertificateCreateWithData(nil, certDer) 
    if certificate != nil{ 
     let params : [String: Any] = [ 
      kSecClass as String : kSecClassCertificate, 
      kSecValueRef as String : certificate! 
     ] 
     let status = SecItemAdd(params as CFDictionary, &certRef) 
     print(status) 
} 

अब जब मैं पहचान पाने के लिए कोशिश कर रहा हूँ, मैं स्थिति -25,300 (errSecItemNotFound) मिलता है। पहचान प्राप्त करने के लिए निम्नलिखित कोड का उपयोग किया जाता है। टैग निजी कुंजी टैग है जिसका उपयोग मैंने निजी/सार्वजनिक कुंजी उत्पन्न करने के लिए किया है।

let query: [String: Any] = [ 
    kSecClass as String : kSecClassIdentity, 
    kSecAttrApplicationTag as String : tag, 
    kSecReturnRef as String: true 
] 

var retrievedData: SecIdentity? 
var extractedData: AnyObject? 
let status = SecItemCopyMatching(query as NSDictionary, &extractedData) 

if (status == errSecSuccess) { 

    retrievedData = extractedData as! SecIdentity? 
} 

मैं निजी कुंजी & सार्वजनिक कुंजी & कीचेन से SecItemCopyMatching का उपयोग कर प्रमाण पत्र मिलता है और कीचेन के लिए प्रमाण पत्र को जोड़ने में सक्षम हूँ, लेकिन SecIdentity क्वेरी करने से काम नहीं करता। क्या यह संभव है कि मेरा प्रमाणपत्र मेरी चाबियों से मेल नहीं खाता है? यह कैसे चेक किया जाता है?

मैंने बेस 64 प्रारूप में आईओएस से सार्वजनिक कुंजी मुद्रित की। निम्नलिखित छपा था:

MIIBCgKCAQEAo/MRST9oZpO3nTl243o+ocJfFCyKLtPgO/QiO9apb2sWq4kqexHy 
58jIehBcz4uGJLyKYi6JHx/NgxdSRKE3PcjU2sopdMN35LeO6jZ34auH37gX41Sl 
4HWkpMOB9v/OZvMoKrQJ9b6/qmBVZXYsrSJONbr+74/mI/m1VNtLOM2FIzewVYcL 
HHsM38XOg/kjSUsHEUKET/FfJkozgp76r0r3E0khcbxwU70qc77YPgeJHglHcZKF 
ZHFbvNz4E9qUy1mWJvoCmAEItWnyvuw+N9svD1Rri3t5qlaBwaIN/AtayHwJWoWA 
/HF+Jg87eVvEErqeT1wARzJL2xv5V1O4ZwIDAQAB 

तब प्रमाणपत्र हस्ताक्षर अनुरोध से मैं openssl (openssl अनुरोध -इन ios.csr -pubkey -noout) का उपयोग सार्वजनिक कुंजी निकाला। निम्नलिखित प्रतिक्रिया मुद्रित की गई थी:

-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo/MRST9oZpO3nTl243o+ 
ocJfFCyKLtPgO/QiO9apb2sWq4kqexHy58jIehBcz4uGJLyKYi6JHx/NgxdSRKE3 
PcjU2sopdMN35LeO6jZ34auH37gX41Sl4HWkpMOB9v/OZvMoKrQJ9b6/qmBVZXYs 
rSJONbr+74/mI/m1VNtLOM2FIzewVYcLHHsM38XOg/kjSUsHEUKET/FfJkozgp76 
r0r3E0khcbxwU70qc77YPgeJHglHcZKFZHFbvNz4E9qUy1mWJvoCmAEItWnyvuw+ 
N9svD1Rri3t5qlaBwaIN/AtayHwJWoWA/HF+Jg87eVvEErqeT1wARzJL2xv5V1O4 
ZwIDAQAB 
-----END PUBLIC KEY---- 

ऐसा लगता है कि सीएसआर से उत्पन्न कुंजी की शुरुआत में मामूली अंतर है। (MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A)। RSA encryption पर सवाल के आधार पर, ऐसा लगता है कि MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A आरएसए एन्क्रिप्शन "1.2.840.113549.1.1.1" के लिए बेस 64-स्वरूपित पहचानकर्ता है। तो मुझे लगता है कि सार्वजनिक कुंजी ठीक हो सकती है?

+0

आश्चर्यचकित होना शुरू हुआ, अगर पेम से डेर में प्रमाणपत्र रूपांतरण – lipponen

+0

विफल रहता है क्या आप सुनिश्चित हैं कि '----- BEGIN प्रमाण पत्र -----' और '----- अंत प्रमाण पत्र -----' डॉन नई लाइनें नहीं हैं जो मुद्दों का कारण बन सकती हैं?आप –

+0

को हटाने के बाद एक नई लाइन के साथ समाप्त हो रहे हैं, मैं सभी नईलाइनों को भी हटा रहा हूं (\ n), अन्यथा SecCertificateCreateWithData त्रुटि फेंकता है। बस प्रश्न में लाइन जोड़ दी, वास्तविक कोड में लाइन पहले वहां रही है। – lipponen

उत्तर

0

SSL प्रमाण पत्र जेनरेट करने का सामान्य तरीका यह है कि निजी कुंजी का उपयोग सीएसआर, प्रमाणपत्र हस्ताक्षर अनुरोध जानकारी उत्पन्न करने के लिए किया जाता है। असल में, आप उस कुंजी हस्ताक्षर के साथ कंपनी, ईमेल, आदि जानकारी भी कर रहे हैं। उस सीएसआर के साथ, आप अपने प्रमाण पत्र पर हस्ताक्षर करते हैं, इसलिए यह आपकी निजी कुंजी और सीएसआर में संग्रहीत जानकारी से जुड़ा होगा, सार्वजनिक कुंजी को कभी भी न छोड़ें। मैं वर्तमान में आईओएस सीएसआर जेनरेशन प्रोजेक्ट में नहीं देख पा रहा हूं, जहां आप अपनी जेनरेट की गई कुंजी को पास कर सकते हैं: मुझे लगता है कि आईओएस सीएसआर जनरेशन प्रोजेक्ट के साथ उत्पन्न सीएसआर इसकी अपनी जेनरेट की गई कुंजी या कोई निजी कुंजी नहीं है। उस तथ्य के साथ तर्क मिलेगा कि आप सीईआर या डीईआर से निजी कुंजी नहीं निकाल सकते हैं, क्योंकि यह वहां नहीं है।

+0

निजी कुंजी विधि में सीएसआर निर्माण प्रक्रिया को पास की जाती है: - (एनएसडीएटा *) बिल्ड: (एनएसडीएटा *) पब्लिककेबिट्स निजीकी: (सेककीरफ) निजीकी – lipponen