2012-04-05 20 views
10

Tôi đã giải quyết vấn đề về chuyển đổi khóa riêng tư RSA thành tệp PEM, nhưng tôi gặp phải một vấn đề khác mà tôi nhận được dữ liệu rỗng khi nhập khóa riêng P12. Sau đây là các bước của tôi:Cách tạo tệp p12 hợp lệ để được nhập chính xác bởi SecPKCS12Import

  1. Chuyển đổi tập tin PEM để tập P12

    openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts 
    
  2. đọc tập tin P12 cho dự án iOS

    NSString *path = [[NSBundle bundleForClass:[self class]]  
            pathForResource:@"MyPrivateKey" ofType:@"p12"]; 
    NSData *p12data = [NSData dataWithContentsOfFile:path]; 
    if (![self getPrivateKeyRef]) 
        RSAPrivateKey = getPrivateKeywithRawKey(p12data); 
    
  3. nhập P12 Private Key

    SecKeyRef getPrivateKeywithRawKey(NSData *pfxkeydata) 
    { 
        NSMutableDictionary * options = [[[NSMutableDictionary alloc] init] autorelease]; 
    
        // Set the public key query dictionary 
        //change to your .pfx password here 
        [options setObject:@"MyPassword" forKey:(id)kSecImportExportPassphrase]; 
    
        CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
    
        OSStatus securityError = SecPKCS12Import((CFDataRef) pfxkeydata, 
                  (CFDictionaryRef)options, &items); 
    
        CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); 
        SecIdentityRef identityApp = 
        (SecIdentityRef)CFDictionaryGetValue(identityDict, 
                 kSecImportItemIdentity); 
        //NSLog(@"%@", securityError); 
    
        assert(securityError == noErr); 
        SecKeyRef privateKeyRef; 
        SecIdentityCopyPrivateKey(identityApp, &privateKeyRef); 
    
        return privateKeyRef; 
    
    } 
    

Tư tưởng không có lỗi (giá trị OSStatus là 0), nhưng mảng mục không nhận được bất kỳ dữ liệu nhận dạng nào. Tôi tự hỏi nếu tôi đã không nhận được đúng định dạng tập tin p12 do sử dụng OpenSSl sai. Có ai nhập thành công tệp p12 không? Tôi đã mắc kẹt trong vấn đề này trong một vài ngày, xin vui lòng cho tôi lời khuyên nếu bạn có manh mối, cảm ơn!

Hubert

+0

Về OpenSSL sử dụng: 1) Chìa khóa đầu vào sẽ chắc chắn không giống như giấy chứng nhận đầu vào của bạn 2) doc nói '-nocerts' sẽ tạo ra không chứng chỉ ở đầu ra; bạn đã thử mà không có nó? – MrTJ

Trả lời

8

Tôi có một số lời khuyên từ internet, và sau đây là các bước để có được iOS chấp nhận được chìa khóa p12 và chứng nhận file:

  1. chuyển đổi XML để PEM
    Shell> biên dịch XMLSpec2PEM. java
    Shell> XMLSpec2PEM rsa.xml
    lưu kết quả đầu ra vào rsa.pem
    (mượn từ here)

  2. convert PEM để RSA Private Key
    OpenSSL> rsa -in rsa.pem out rsaPrivate.key

  3. Tạo một yêu cầu cấp giấy chứng nhận
    OpenSSL> req -new -key rsaPrivate.key out rsaCertReq .crt
    (đầu vào một số dữ liệu chứng nhận cơ bản)

  4. chứng nhận Đăng ký được yêu cầu
    OpenSSL> x509 -req -days 3650 -in rsaCertReq.crt -signkey rsaPrivate.key out rsaC ert.crt

  5. Chuyển đổi định dạng tệp giấy chứng nhận để DER (iOS định dạng chấp nhận được)
    OpenSSL> x509 -outform der -in rsaCert.crt out rsaCert.der

  6. Tạo pkcs12 chìa khóa cá nhân (iOS định dạng chấp nhận được)
    OpenSSL> pkcs12 -Xuất out rsaPrivate.pfx -inkey rsaPrivate.key -in rsaCert.crt

Không bước tiếp theo, các file chi ted trong bước 5 và 6 bây giờ có thể được sử dụng trong iOS!

tham khảo các hướng dẫn OpenSSL:
http://blogs.yaclife.com/?tag=ios%E3%80%80seckeyref%E3%80%80raw%E3%80%80key%E3%80%80rsa%E3%80%803des

http://devsec.org/info/ssl-cert.html

+1

Cảm ơn bạn đã báo cáo lại Hubert. Đó là cách xoay vòng khủng khiếp để chuyển đổi khóa riêng được mã hóa XML thành một biểu diễn bên trong, nhưng nó phải chính xác và tôi không chắc liệu có một cách mạnh mẽ hơn (ngoài viết thói quen chuyển đổi trong Objective C) không. Oh, bạn có thể chấp nhận câu trả lời của riêng bạn sau một thời gian! –

+0

Tôi đoán câu trả lời là có. Những gì tôi đã làm ở trên chỉ là sử dụng công cụ dòng lệnh openssl để chuyển đổi nó thành một định dạng khóa hợp lệ, vì vậy các hoạt động có thể được thực hiện với api openssl. Tôi đã không làm điều này đơn giản chỉ vì tôi chỉ cần làm điều đó một lần. –

+0

Trong trường hợp của tôi, bước 2 "chuyển đổi PEM thành RSA Private Key" đã tạo ra cùng một tệp đầu ra giống như tệp đầu vào. Tuy nhiên, tệp p12 được tạo sau khi thực hiện tất cả các bước là chính xác những gì tôi cần cho ứng dụng iOS của mình và việc tìm kiếm bài đăng này là một trợ giúp lớn. –

Các vấn đề liên quan