2016-10-11 26 views
19

Özel anahtar ve ortak anahtarımı, Swift tabanlı iOS uygulamasına SecKeyGeneratePair işlevini kullanarak oluşturdum.
Sonra, iOS CSR generation kullanarak Sertifika İmzalama İsteği oluşturdum ve sunucum PEM biçiminde sertifika zinciriyle yanıt verdi.
Ben DER-biçimi için aşağıdaki kodu kullanarak PEM-sertifika dönüştürülen: Kullandığım DER verilerden sertifika oluşturmak gerekir, Şimdiİstemci sertifikaları ve kimlikleri iOS'ta

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: []) 

let certificate = SecCertificateCreateWithData(nil, certDer)

takip ediyor Sorum: Nasıl özel sertifikayı bağlayabilirsiniz Başta yarattığım anahtar ve bu ikisinin de (anahtarlar ve sertifikalar) ait olduğu kimliği aldım?
Belki de anahtarlığa sertifika ekleyin ve SecItemCopyMatching kullanarak kimliği alın? Söz sunulan prosedür takip SecIdentityRef procedure

Düzenleme:

Anahtarlık sertifika eklemeden, ben sertifika Anahtarlık eklendiğini demektir inanıyoruz durumu yanıtını 0, olsun. Ben kimliğini almaya çalışıyorum ne zaman

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) 
} 

Şimdi, durumunu -25300 (errSecItemNotFound) olsun. Kimliği almak için aşağıdaki kod kullanılır. etiketi, özel/ortak anahtar oluşturmak için kullandığım özel anahtar etikettir.

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? 
} 

Ben SecItemCopyMatching kullanarak keychain'inizden özel anahtar & genel anahtar & sertifikası almak ve anahtarlığa sertifika eklemek mümkün, ama SecIdentity sorgulama çalışmıyor. Sertifikamın anahtarlarımla eşleşmesi mümkün mü? Bu nasıl kontrol edilir?

Ortak anahtarını temel64 biçiminde iOS'tan yazdırdım. Aşağıdaki basılmıştır:

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

sonra sertifika imza istek I Openssl (Openssl req -in ios.csr -pubkey -noout) kullanılarak ortak anahtar ekstre edildi. Aşağıdaki yanıtı basılmış: CSR oluşturulan anahtarın başında küçük bir fark olduğu görülmektedir

-----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). Soru RSA encryption dayanarak, MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A RSA şifreleme "1.2.840.113549.1.1.1" için base64 formatlı tanımlayıcı gibi görünüyor. Yani sanırım ortak anahtar iyi olabilir mi?

+0

Sertifika dönüştürme pem to der başarısız olursa – lipponen

+0

Eğer ------ BEGIN SERTİFİKASI ----- 've' ----- END BELGESİ ----- 'don emin misin Sorunlara neden olabilecek yeni satırlar var mı? –

+0

'u kaldırdıktan sonra yeni bir satır ile bitebilirseniz, tüm yeni satırları da kaldırıyorum (\ n), aksi halde SecCertificateCreateWithData hatası atar. Sadece soruya satır ekledim, gerçek kodda daha önce var olan satırda. – lipponen

cevap

0

SSL sertifikaları oluşturmanın olağan yolu, CSR, Sertifika İmzalama İsteği bilgisi oluşturmak için özel anahtarın kullanılmasıdır. Aslında, bu önemli imza ile şirket, e-posta, vb. Bilgileri de saklıyorsunuz. Bu KSS ile, sertifikanızı imzalarsınız, böylece özel anahtarınız ve CSR'de depolanmış bilgi ile ilişkilendirilir, ortak anahtarın dışında kalır. Şu anda oluşturulan anahtarınızı iletebileceğiniz IOS CSR Generation projesinde şu anda göremiyorum: IOS CSR Generation projesi ile oluşturulan CSR'nin kendi oluşturduğu anahtarı veya hiç özel anahtarı kullanmadığını düşünüyorum. O zaman, CER veya DER'den özel anahtarı çıkaramadığınız için mantık olacak, çünkü orada değil.

+0

Özel anahtar, yöntemde CSR oluşturma işlemine iletilir: - (NSData *) derlemesi: (NSData *) publicKeyBits privateKey: (SecKeyRef) privateKey – lipponen