認証に .bks キーストアが必要な iPhone アプリを作成しています。iOS アプリに関するこの情報については何も見つかりませんでした。
Apple がアプリでのキーストアの使用を許可しているかどうか、および iOS で開始する方法を知りたいです。証明書は BouncyCastle を使用して作成されます。Androidについてはそれに関する情報を見つけましたが、iOSについては運がありませんでした。どんな助けでも大歓迎です。
認証に .bks キーストアが必要な iPhone アプリを作成しています。iOS アプリに関するこの情報については何も見つかりませんでした。
Apple がアプリでのキーストアの使用を許可しているかどうか、および iOS で開始する方法を知りたいです。証明書は BouncyCastle を使用して作成されます。Androidについてはそれに関する情報を見つけましたが、iOSについては運がありませんでした。どんな助けでも大歓迎です。
このようにキーストアから必要な証明書をエクスポートできます
keytool -exportcert -keystore <keystore> -file some.cer
ストア タイプとストア プロバイダについて keytool を指定する必要がある場合があります。こちらを参照してください。
次のコードを使用して、その .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 キーチェーンにインポートする必要はありません。運が悪かったので、とにかくキーチェーンに証明書が必要でしたが、これについて何かがあります。
アップデート:
camdaochemgio がコメントで指摘したように、アプリに秘密情報 (秘密鍵など) を含む証明書を含める場合、上記の方法を使用することはお勧めしません。.cer ファイルは保護されておらず、.ipa から簡単に抽出できるためです。
PKCS#P12 はパスワード保護をサポートしているので、これを使用することをお勧めします。
次のようにキーストアを PKCS#P12 に変換できます (ここから取得):
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 ファイルをロードできます (クレジットはここに移動します) 。
// 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);
}
最後になりましたが、このトピックに関するいくつかのリンク: