我正在構建需要.bks密鑰庫進行身份驗證的iPhone應用程序。我沒有發現任何有關iOS應用程序的信息。使用。 iPhone應用程序中的bks密鑰庫證書
我想知道蘋果是否允許在他們的應用程序中使用密鑰庫以及如何在iOS上開始。證書使用BouncyCastle創建。我找到了關於它的信息,但對於iOS我沒有運氣。任何幫助將不勝感激。
我正在構建需要.bks密鑰庫進行身份驗證的iPhone應用程序。我沒有發現任何有關iOS應用程序的信息。使用。 iPhone應用程序中的bks密鑰庫證書
我想知道蘋果是否允許在他們的應用程序中使用密鑰庫以及如何在iOS上開始。證書使用BouncyCastle創建。我找到了關於它的信息,但對於iOS我沒有運氣。任何幫助將不勝感激。
你可以導出你的密鑰庫需要這樣
keytool -exportcert -keystore <keystore> -file some.cer
您可能需要告訴密鑰工具有關的存儲類型和存儲提供商,look here證書(或多個)。
您可以閱讀.CER文件插入iOS鑰匙扣這樣的代碼:
- (void) importCertToKeyChain: (NSData *) data
{
// Delete the old certificate, otherwise SecItemAdd complains.
OSStatus oss = SecItemDelete((__bridge CFDictionaryRef)([self clientCertificateQuery]));
// Import the certificate
SecCertificateRef certRef = NULL;
certRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(data));
NSDictionary *att = [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)(kSecClassCertificate), kSecClass, (__bridge id) certRef, kSecValueRef, nil];
oss = SecItemAdd((__bridge CFDictionaryRef)(att), NULL);
}
當您需要的證書,你可以從鑰匙扣得到這樣的:
- (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;
}
還有一個讀取PCKS12存儲的功能(您仍然需要將BKS存儲轉換爲該格式)。它被稱爲SecPKCS12Import
,並且您不需要將證書導入到您的iOS鑰匙串中。我沒有運氣,無論如何都需要鑰匙鏈的證書,但這裏是something about this。
更新:
由於camdaochemgio使用上述方法不推薦,包括一個應用程序,包含機密信息(如私鑰)的證書時評論中指出。因爲.cer文件不受保護,可以很容易地從.ipa中提取。
PKCS#P12支持密碼保護,所以最好使用它。
您可以隱蔽你的密鑰庫這樣的PKCS#P12(採取from here):
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
然後你就可以加載.p12文件像這樣(學分去here)
// 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);
}
末但並非最不重要的一些有關此主題的鏈接:
這種方法並不安全,因爲該證書文件存儲在主束。有些人可能會提取捆綁包,然後無密碼地獲取文件。作爲Android的密鑰庫更好,但我不知道在iOS中做密鑰庫。任何想法? –
@camdaochemgio對,我更新了關於如何使用PCKS12商店的帖子。 – sofacoder