2

我想将某些用于 TLS 验证的 CA 证书添加到我的 iOS 6 应用程序的钥匙串中。证书包含在应用程序包中。我不想添加在几个示例中描述的任何身份(私钥/证书组合)。

SecPKCS12Import调用没有返回任何错误,但不幸的是它也没有返回任何证书。

为了让您重现我的步骤,我以 Google 中间证书('Google Internet Authority')为例,并在下载的 PEM 证书上运行以下命令:

婴儿床.

#convert PEM certificate to PKCS12
openssl pkcs12 -export -in google.pem -nokeys -out google.p12 -passout "pass:google"
#verification
openssl pkcs12 -in google.p12 -passin "pass:google"
MAC verified OK
Bag Attributes: <No Attributes>
subject=/C=US/O=Google Inc/CN=Google Internet Authority
issuer=/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
MIICsDCCAhmgAwIBAgIDFXfhMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
[...]
ARlIjNvrPq86fpVg0NOTawALkSqOUMl3MynBQO+spR7EHcRbADQ/JemfTEh2Ycfl
vZqhEFBfurZkX0eTANq98ZvVfpg=
-----END CERTIFICATE-----

之后,我将该文件捆绑在我的应用程序中,并在其中执行了以下代码:

NSMutableDictionary * options = [[[NSMutableDictionary alloc] init] autorelease];
[options setObject:@"google" forKey:(id)kSecImportExportPassphrase];
CFArrayRef items = NULL;
NSData *certData = [NSData dataWithContentsOfFile:[NSBundle pathForResource:@"google" ofType:@"p12" inDirectory:[[NSBundle mainBundle] bundlePath]]];
OSStatus result = SecPKCS12Import((CFDataRef)certData, (CFDictionaryRef)options, &items);
assert(result == errSecSuccess);
CFIndex count = CFArrayGetCount(items);
NSLog(@"Certificates found: %ld",count);

控制台结果输出为“找到的证书:0”。certData变量填充了正确数量的字节,如果我更改提供的密码,结果将更改为errSecAuthFailed

你知道问题可能是什么吗?

4

1 回答 1

4

我会说这是一个错误,请参阅相关问题SSL Identity Certificate to run an HTTPS Server on iOS和错误SecPKCS12Import 当证书在 Jan 1st 10000 之后过期时返回空数组

由于您只需要证书,没有私钥,我将从 DER 格式文件中导入证书。

$ openssl x509 -in google.pem -out google.der -outform DER
$ openssl x509 -in google.der -noout -text

捆绑 DER 证书文件并导入:

NSString *path = [[NSBundle mainBundle] pathForResource:@"google" ofType:@"der"];
NSData *derData = [NSData dataWithContentsOfFile:path];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)derData);

// add cert to KeyChain or use it as you need

CFRelease(cert);
于 2013-08-21T18:38:17.913 回答