Безопасный транспорт: загрузить сертификат сервера из файла

У меня есть код C ++, который использует Apple Secure Transport а также Брелок API для создания сервера SSL / TLS (CLI).
Код уже может загрузить сертификат сервера с помощью предоставленного пользователем отпечатка пальца из существующей цепочки для ключей.

Однако из соображений совместимости я бы хотел, чтобы сервер также загружал ключ cert + (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+ после компиляции (#ifdefвсе в порядке).

0

Решение

Если оба файла можно объединить и преобразовать в формат 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;
}

Ананд

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]