如何使SecPKCS12Import正确导入有效的p12文件

Hub*_*ang 11 openssl rsa pkcs#12 ios

我已经解决了将XML RSA私钥转换为PEM文件的问题,但是我遇到另一个问题,即在导入P12私钥时我得到空数据.以下是我的步骤:

  1. 将PEM文件转换为P12文件

    openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将P12文件读入iOS项目

    NSString *path = [[NSBundle bundleForClass:[self class]]    
                        pathForResource:@"MyPrivateKey" ofType:@"p12"];
    NSData *p12data = [NSData dataWithContentsOfFile:path];
    if (![self getPrivateKeyRef]) 
        RSAPrivateKey = getPrivateKeywithRawKey(p12data);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 导入P12私钥

    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;
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

以为没有错误(OSStatus值为0),但items数组没有获得任何身份数据.我想知道我是否由于OpenSSl使用错误而得不到正确的p12文件格式.有没有人成功导入p12文件?我已经坚持了几天这个问题,如果你有线索,请给我建议,谢谢!

休伯特

Hub*_*ang 8

我从互联网上得到了一些提示,以下是获得iOS可接受的p12密钥和认证文件的步骤:

  1. 将XML转换为PEM
    Shell>编译XMLSpec2PEM.java
    Shell> XMLSpec2PEM rsa.xml
    将输出结果保存到rsa.pem
    (从这里借用)

  2. 将PEM转换为RSA私钥
    OpenSSL> rsa -in rsa.pem -out rsaPrivate.key

  3. 生成认证请求
    OpenSSL> req -new -key rsaPrivate.key -out rsaCertReq.crt
    (输入一些基本认证数据)

  4. 签名认证请求
    OpenSSL> x509 -req -days 3650 -in rsaCertReq.crt -signkey rsaPrivate.key -out rsaCert.crt

  5. 将认证文件格式转换为DER(iOS可接受格式)
    OpenSSL> x509 -outform der -in rsaCert.crt -out rsaCert.der

  6. 生成PKCS12私钥(iOS可接受的格式)
    OpenSSL> pkcs12 -export -out rsaPrivate.pfx -inkey rsaPrivate.key -in rsaCert.crt

没有进一步的步骤,现在可以在iOS中使用步骤5和6中生成的文件!

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