ios - 从 NSString 创建KeychainValue

标签 ios iphone objective-c certificate keychain

我正在尝试将证书添加到钥匙串(keychain)。我看到有几篇文章是从一个文件创建的,但我想从 NSString 创建一个。

我的 NSString 在 RSA - 64base 上,就像:

-----BEGIN CERTIFICATE-----
MIIDoDCCAoigAwIBAgIJAL8qgXMVVVhPMA0GCSqGSIb3DQEBBQUAMGwxCzAJBgNVBAYTAkJSMRIw
...
FT70at8bty9ocDaXuI3j6mfw2SI=
-----END CERTIFICATE-----

我正在尝试做这样的事情:

+ (NSMutableDictionary *)newSearchDictionary:(NSString *)identifier {
    NSMutableDictionary *searchDictionary = [[NSMutableDictionary alloc] init];

    [searchDictionary setObject:(__bridge id)kSecClassCertificate forKey:(__bridge id)kSecClass];

    NSData *encodedIdentifier = [identifier dataUsingEncoding:NSUTF8StringEncoding];
    [searchDictionary setObject:encodedIdentifier forKey:(__bridge id)kSecAttrGeneric];
    [searchDictionary setObject:encodedIdentifier forKey:(__bridge id)kSecAttrAccount];
    [searchDictionary setObject:SERVICE_NAME forKey:(__bridge id)kSecAttrService];
    return searchDictionary;
}


+ (BOOL)createKeychainValue:(NSString *)certificado forIdentifier:(NSString *)identifier {
    NSMutableDictionary *dictionary = [self newSearchDictionary:identifier];

    NSData *certificadoData = [certificado dataUsingEncoding:NSUTF8StringEncoding];
    SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certificadoData);

    [dictionary setObject:(__bridge id)(cert) forKey:(__bridge id<NSCopying>)(kSecValueRef)];

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, NULL);

    CFRelease(cert);

    if (status == errSecSuccess) {
        return YES;
    }
    return NO;
}

但是返回的证书为零。可能是因为我的证书是 PEM 而我需要 DER。我该如何转换?我在我的项目中使用 openssl。

最佳答案

对我有用并创建 SecCertificateRef 的函数是:

+ (NSData *)derFromPem:(NSString *)pem {

    BIO *certBio = BIO_new(BIO_s_mem());
    BIO_write(certBio, [pem UTF8String], strlen([pem UTF8String]));
    X509 *x = PEM_read_bio_X509(certBio,NULL,0,NULL);
    BIO *outBio = BIO_new(BIO_s_mem());
    i2d_X509_bio(outBio, x);

    int len = BIO_pending(outBio);
    char *out = calloc(len + 1, 1);
    int i = BIO_read(outBio, out, len);

    return [NSData dataWithBytes:out length:i];
}

关于ios - 从 NSString 创建KeychainValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19580307/

相关文章:

ios - 如何为 plist 文件中的 UIColor 设置默认的 NSUserDefaults 值?

ios - 如何使用 GPUImageHarrisCornerDetectionFilter 检测图像的角点

ios - 无法从 View 中填充表格

ios - Storyboard中的 UITableView 隐藏第一个单元格时,它会好吗?为什么?

ios - 如何将 UILabel 和 UIButton 项目都放入 UITableView 标题部分的 UIView

ios - 魔法记录 - MR_createEntity 返回 nil

ios - 如何在自定义动画期间调用 scrollViewDidScroll : the same way UIScrollView does,?

iphone - 如何在 Core Plot 中使用自定义标签添加刻度线?

objective-c - iPhone:以编程方式将选项卡栏 Controller 添加到导航 Controller

ios - UIView 未调整大小以填充 iPhone 6 窗口