में ग्राहक प्रमाणपत्र और पहचान 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-स्वरूपित पहचानकर्ता है। तो मुझे लगता है कि सार्वजनिक कुंजी ठीक हो सकती है?
आश्चर्यचकित होना शुरू हुआ, अगर पेम से डेर में प्रमाणपत्र रूपांतरण – lipponen
विफल रहता है क्या आप सुनिश्चित हैं कि '----- BEGIN प्रमाण पत्र -----' और '----- अंत प्रमाण पत्र -----' डॉन नई लाइनें नहीं हैं जो मुद्दों का कारण बन सकती हैं?आप –
को हटाने के बाद एक नई लाइन के साथ समाप्त हो रहे हैं, मैं सभी नईलाइनों को भी हटा रहा हूं (\ n), अन्यथा SecCertificateCreateWithData त्रुटि फेंकता है। बस प्रश्न में लाइन जोड़ दी, वास्तविक कोड में लाइन पहले वहां रही है। – lipponen