2012-04-05 31 views
10

XML RSA秘密鍵をPEMファイルに変換するという私の問題を解決しましたが、P12秘密鍵をインポートするときにnullデータを取得するという別の問題が発生します。以下は、私の手順です:P12ファイルへSecPKCS12Importで正しいp12ファイルをインポートする方法

  1. 変換のPEMファイル

    openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts 
    
  2. 読むのP12ファイル

    NSString *path = [[NSBundle bundleForClass:[self class]]  
            pathForResource:@"MyPrivateKey" ofType:@"p12"]; 
    NSData *p12data = [NSData dataWithContentsOfFile:path]; 
    if (![self getPrivateKeyRef]) 
        RSAPrivateKey = getPrivateKeywithRawKey(p12data); 
    
  3. インポートP12のiOSプロジェクトへの秘密鍵

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

考えられるエラー(OSStatus値は0)はありませんでしたが、items配列はIDデータを取得しませんでした。私は間違ったOpenSSlの使用法のために正しいp12ファイル形式を取得しなかったのだろうかと思います。誰もp12ファイルを正常にインポートしましたか?私は数日の間この問題に立ち往生した、あなたが手がかりを持っている場合、私にアドバイスを与えてください、ありがとう!

ユベール

+0

:1)入力されたキーは、あなたの入力証明書2として確実に同じではないでしょう)ドキュメントは-nocerts'はありませんが作成されます 'と言います出力時の証明書。あなたはそれなしで試しましたか? – MrTJ

答えて

8

私は、インターネットからいくつかのヒントを得た、そして次は、iOS許容P12キーと証明書ファイルを取得するための手順です:

  1. コンバートXMLをPEM
    シェルへ> XMLSpec2PEMをコンパイルします。 Javaの
    シェル> XMLSpec2PEM rsa.xml
    hereから借り)
    をrsa.pemする出力結果を保存

  2. RSA秘密鍵に改宗PEM
    のOpenSSL> RSA -in rsa.pem -out rsaPrivate.key

  3. -new -key rsaPrivate.key -out rsaCertReq証明書要求
    のOpenSSL> REQを生成します.CRT
    (入力いくつかの基本的な認証データ)

  4. 要求のサイン認証
    のOpenSSL> X509 -req -days 3650 -in rsaCertReq.crt -signkey rsaPrivate.keyアウトRSAC ert.crt

  5. は(PKCS12秘密鍵が生成
    のOpenSSL> X509 -outformデル-in rsaCert.crt -out rsaCert.der

  6. (iOSの許容可能な形式)DERに証明書のファイル形式を変換しますiOSの許容可能な形式)
    のOpenSSL> PKCS12 -export -out rsaPrivate.pfx -inkey rsaPrivate.key -in rsaCert.crt

ませさらなるステップ、ファイルの属ステップ5とステップ6でtedがiOSで使用できるようになりました!OpenSSLの命令の

参照: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

Hubertを報告してくれてありがとう。これはXMLエンコードされた秘密鍵を内部表現に変換する非常に迂回的な方法ですが、正しいものでなければならず、より堅牢な方法があるかどうかはわかりません(もちろんObjective Cで変換ルーチンを記述するのではありません)。ああ、しばらくしてからあなた自身の答えを受け入れるかもしれない! –

+0

答えは「はい」と思います。私が上で行ったことは、opensslコマンドラインツールを使って有効なキーフォーマットに変換するだけなので、openssl apiで操作を行うことが可能です。私は一度だけ行う必要があるので、私はこれを単にしませんでした。 –

+0

私の場合、ステップ2「PEMからRSA秘密鍵への変換」は、入力ファイルと全く同じ出力ファイルを生成しました。それにもかかわらず、すべての手順を踏んだ後に作成されたp12ファイルは、iOSアプリケーションに必要なものであり、この投稿を見つけることは大きな助けとなりました。 –

関連する問題