Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用。iPhone应用程序中的bks密钥库证书_Iphone_Objective C_Ios_Bouncycastle - Fatal编程技术网

使用。iPhone应用程序中的bks密钥库证书

使用。iPhone应用程序中的bks密钥库证书,iphone,objective-c,ios,bouncycastle,Iphone,Objective C,Ios,Bouncycastle,我正在构建一个需要.bks密钥库进行身份验证的iPhone应用程序。我没有找到任何关于iOS应用程序的信息 我想知道苹果是否允许在他们的应用程序中使用密钥库,以及如何开始使用iOS。证书是使用BouncyCastle创建的。我确实在android上找到了关于它的信息,但在iOS上我没有运气。任何帮助都将不胜感激。您可以像这样从密钥库导出所需的证书 keytool -exportcert -keystore <keystore> -file some.cer 当您需要证书时,您可以从

我正在构建一个需要.bks密钥库进行身份验证的iPhone应用程序。我没有找到任何关于iOS应用程序的信息


我想知道苹果是否允许在他们的应用程序中使用密钥库,以及如何开始使用iOS。证书是使用BouncyCastle创建的。我确实在android上找到了关于它的信息,但在iOS上我没有运气。任何帮助都将不胜感激。

您可以像这样从密钥库导出所需的证书

keytool -exportcert -keystore <keystore> -file some.cer
当您需要证书时,您可以从密钥链获得如下证书:

- (SecCertificateRef) getCertFromKeyChain
{
    CFTypeRef ref = NULL;
    SecItemCopyMatching((__bridge CFDictionaryRef)([self clientCertificateQuery]), &ref);

    return (SecCertificateRef) ref;
}
clientCertificateQuery看起来像这样

static NSString *clientCertSubject = @"TestSubjectClient";

-(NSMutableDictionary *) clientCertificateQuery
{
    NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
    [query setObject:(__bridge id) kSecClassCertificate forKey:(__bridge id)kSecClass];
    [query setObject:clientCertSubject forKey:(__bridge id<NSCopying>)(kSecMatchSubjectContains)];
    [query setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
 id)kSecAttrKeyType];
    return query;
}
然后您可以像这样加载.p12文件(credits go)

最后但并非最不重要的是,与此主题相关的一些链接:


这种方式不安全,因为证书文件存储在主捆绑包中。有些人可能会提取包,然后在没有密码的情况下获取文件。安卓系统的密钥库更好,但我不知道在iOS中做密钥库。有什么想法吗?@camdaochemgio对,我更新了关于如何使用PCKS12商店的帖子。
static NSString *clientCertSubject = @"TestSubjectClient";

-(NSMutableDictionary *) clientCertificateQuery
{
    NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
    [query setObject:(__bridge id) kSecClassCertificate forKey:(__bridge id)kSecClass];
    [query setObject:clientCertSubject forKey:(__bridge id<NSCopying>)(kSecMatchSubjectContains)];
    [query setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
 id)kSecAttrKeyType];
    return query;
}
 keytool -importkeystore -srckeystore KEYSTORE.jks -destkeystore KEYSTORE.p12 -srcstoretype BKS -deststoretype PKCS12 -srcstorepass mysecret -deststorepass mysecret -srcalias myalias -destalias myalias -srckeypass mykeypass -destkeypass mykeypass -noprompt
// Load Certificate
NSString *path = [[NSBundle mainBundle] pathForResource:@"cert" ofType:@"p12"];
NSData *p12data = [NSData dataWithContentsOfFile:path];
CFDataRef inP12data = (__bridge CFDataRef)p12data;

// Only password based PKCS#12 blobs are supported
CFStringRef password = CFSTR("Password");
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { password };
CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

// The import
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus securityError = SecPKCS12Import(inP12data, options, &items);

if (securityError == 0)
{
    // Exploring the content
    CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
    const void *tempIdentity = NULL;
    tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity);
    *identity = (SecIdentityRef)tempIdentity;
    const void *tempTrust = NULL;
    tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust);
    *trust = (SecTrustRef)tempTrust;
}

if (options) {
    CFRelease(options);
}