0

Apple Secure TransportおよびKeychain 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 に答える