0

我有一些使用Apple 安全传输钥匙串API 来创建 SSL/TLS 服务器 (CLI) 的 C++ 代码。该代码已经能够通过现有钥匙串中用户提供的指纹来加载服务器证书。

但是,出于兼容性原因,我想让服务器也从用户提供的文件集中加载证书 + 密钥 (PEM)。

需要明确的是:我不想将文件导入用户的钥匙串,而只是在那个“会话”中使用它。

基本上,填写XXX:

bool AppleTLSContext::addCredentialFile(const std::string& certfile,
                                        const std::string& keyfile)
{
  if (tryAsFingerprint(certfile)) {
    return true;
  }

  // XXX
}

似乎可以使用SecItemImport和/或SecKeychainItemCreateFromContent将证书/密钥导入带有随机密码的一次性钥匙串中。

  • 有没有不使用一次性钥匙扣的可行方法?
  • 如果不是,“一次性钥匙串”选项是否可行?
  • 此外,是否可以仅在内存中创建一次性钥匙串?(似乎SecKeychainCreate确实需要一条路径)

我正在寻找一种在编译后至少可以在 OSX 10.6+ 上运行的解决方案(#ifdefs 可以)。

4

1 回答 1

1

如果两个文件都可以合并并转换为 pkcs 12 格式,则可以使用 SecPKCS12Import 方法。

但是 SecPKCS12Import 在根上下文中不能正常工作。我不知道这种不当行为的原因。

OSStatus extractIdentityAndTrust(CFDataRef inPKCS12Data,
                             SecIdentityRef *outIdentity,
                             SecTrustRef *outTrust,
                             CFStringRef keyPassword)
{

OSStatus securityError = errSecSuccess;
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { keyPassword };
CFDictionaryRef optionsDictionary = NULL;

optionsDictionary = CFDictionaryCreate(
                                       NULL, keys,
                                       values, (keyPassword ? 1 : 0),
                                       NULL, NULL);
CFArrayRef items = NULL;
securityError = SecPKCS12Import(inPKCS12Data,
                                optionsDictionary,
                                &items);

if (securityError == 0)
{ 
    CFDictionaryRef myIdentityAndTrust = (CFDictionaryRef)CFArrayGetValueAtIndex (items, 0);

    const void *tempIdentity = NULL;
    tempIdentity = CFDictionaryGetValue (myIdentityAndTrust,
                                         kSecImportItemIdentity);
    CFRetain(tempIdentity);
    *outIdentity = (SecIdentityRef)tempIdentity;
    const void *tempTrust = NULL;
    tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
    CFRetain(tempTrust);
    *outTrust = (SecTrustRef)tempTrust;
}
if (optionsDictionary) 
    CFRelease(optionsDictionary);
if (items)
    CFRelease(items);
return securityError;
}

阿南德

于 2013-08-20T19:00:51.270 回答