[ios] SecItemAdd 및 SecItemCopyMatching에서 오류 코드 -34018 (errSecMissingEntitlement)을 반환합니다.

때때로 Xcode에서 장치에서 응용 프로그램을 실행할 때 키 체인에 액세스하려고하지만 오류 -34018로 인해 실패합니다. 이는 문서화 된 키 체인 오류 코드와 일치하지 않으며 일관되게 재현 할 수 없습니다. (아마도 30 % 정도일 수 있으며, 왜 발생하는지 명확하지 않습니다.) 이 문제를 디버깅하는 것을 매우 어렵게 만드는 것은 문서가 완전히 부족하기 때문입니다. 이 문제의 원인과 해결 방법을 알고 있습니까? Xcode 5를 사용하고 기기에서 iOS 7.0.4를 실행하고 있습니다.

여기에 공개 된 문제가 있습니다 : https://github.com/soffes/sskeychain/issues/52

편집 : 요청 당 키 체인 액세스 코드 추가

SSKeychain키 체인과의 인터페이스 를 위해 라이브러리를 사용하고 있습니다. 다음은 스 니펫입니다.

#define SERVICE @"default"

@implementation SSKeychain (EXT)

+ (void)setValue:(NSString *)value forKey:(NSString *)key {
    NSError *error = nil;
    BOOL success = NO;
    if (value) {
        success = [self setPassword:value forService:SERVICE account:key error:&error];
    } else {
        success = [self deletePasswordForService:SERVICE account:key error:&error];
    }
    NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
    if (!success) {
        LogError(@"Unable to set value to keychain %@", error);
    }
    LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
    if (value == nil)
        LogWarn(@"Setting keychain %@ to nil!!!", key);
}

+ (NSString *)valueForKey:(NSString *)key {
    NSError *error = nil;
    NSString *value = [self passwordForService:SERVICE account:key error:&error];
    if (error && error.code != errSecItemNotFound) {
        NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
        LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
    }
    return value;
}

+ (BOOL)removeAllValues {
    LogInfo(@"Completely Reseting Keychain");
    return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
        return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
    }];
}

@end

대부분의 경우 괜찮습니다. 때로는 키 체인에 쓰거나 읽을 수없는 어설 션 오류가 발생하여 심각한 어설 션 오류가 발생합니다.



답변

iOS 10 / XCode 8 수정 :

키 체인 인 타이틀먼트 추가, 프로젝트 설정-> 기능-> 키 체인 공유-> 키 체인 그룹 추가 + 켜기로 이동합니다.

Apple의 답변 :

업데이트 : 마침내 iOS 8.3에서 -34018 오류를 재현 할 수있었습니다. 이것은 근본 원인을 식별 한 다음 해결 방법을 찾는 첫 번째 단계입니다.

평소와 같이 출시 기간을 정할 수는 없지만 이로 인해 많은 개발자가 영향을 받았으므로이 문제를 해결하고 싶습니다.

앞서 나는 대안으로 키 체인에 액세스하기 전에 application : didFinishLaunchingWithOptions 및 applicationDidBecomeActive :에 약간의 지연을 추가 할 것을 제안했습니다. 그러나 실제로 도움이되지는 않습니다. 즉, 앱을 다시 시작하는 것 외에는 현재 알려진 해결 방법이 없습니다.

이 문제는 메모리 부족과 관련된 것으로 보이므로 메모리 경고를보다 적극적으로 처리하면 문제가 완화 될 수 있습니다.

https://forums.developer.apple.com/thread/4743#14441

최신 정보

좋습니다. 여기에 최신 정보가 있습니다.
이것은 여러 가지 가능한 원인이있는 복잡한 문제입니다.

  • 문제의 일부 인스턴스는 잘못된 앱 서명으로 인해 발생합니다. 문제가 100 % 재현 가능하기 때문에이 경우를 쉽게 구분할 수 있습니다.
  • 문제의 일부 인스턴스는 iOS가 앱 개발을 지원하는 방식의 버그로 인해 발생합니다 (r. 23,991,853). 이 문제를 디버깅하는 것은 OS의 또 다른 버그 (r. 23,770,418)가 그 효과를 마스킹했기 때문에 복잡했습니다. 즉, 장치가 메모리 부족 상태 일 때만 문제가 발생했음을 의미합니다. 이러한 문제는 iOS 9.3에서 해결되었다고 생각합니다.
  • 이 문제의 원인이 아직 더 많을 것으로 의심됩니다.

따라서 iOS 9.3 이상을 실행하는 사용자 장치 (Xcode에서 대화하지 않은 장치)에서이 문제가 발생하면 이에 대한 버그 보고서를 제출하십시오. 버그 보고서에 기기 시스템 로그를 포함 해보세요 (고객 기기를 다룰 때 까다로울 수 있습니다. 한 가지 옵션은 고객에게 시스템 로그를 볼 수있는 Apple Configurator를 설치하도록 요청하는 것입니다). 버그를 신고하는 경우 기록을 위해 버그 번호를 게시하십시오.

Apple을 대신하여이 끔찍한 문제를 추적하는 데 도움을 주신 모든 분들께 감사드립니다. 공유하고 즐기십시오

https://forums.developer.apple.com/thread/4743#126088


답변

기본적으로 테스트 대상에서 실행 스크립트로 다음을 추가하여 .xcttest 폴더를 코드 서명해야합니다.

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

장치에서 키 체인을 테스트 할 때 -34018 오류가 많이 발생했으며 이로 인해 문제가 해결되었습니다.

테스트 대상에 문제가 없으면 이것이 해결책이 아닐 수 있습니다.


답변

소스 코드를 조사한 후 . 키 체인 기능은 앱 프로세스와 분리 된 자체 프로세스에서 실행되는 보안 데몬을 통해 액세스됩니다.

앱과 보안 프로세스는 XPC 라는 기술을 통해 함께 ‘대화’합니다 .

필요한 경우 securityd는 XPC에서 잘 알려진 launchd 명령을 통해 시작됩니다. 데몬이 Activity Monitor 앱에서 실행되고 있고 (물론 Simulator에서 실행중인 경우) 부모 프로세스가 시작되었는지 확인할 수 있습니다.

내 생각 엔 알 수없는 이유로 보안 데몬이 시작하지 못하거나 너무 느리게 수행 할 수 있으며 사용하려고 할 때 준비가되지 않았을 가능성이 있습니다.

데몬을 사전 실행하는 방법을 생각할 수 있습니다.

더 정확하지 않은 것에 대해 사과드립니다. 수사를 좀 더 진행하는 데 도움이되기를 바랍니다.


답변

iOS 8 SDK를 사용하여 Xcode 6 베타에서 코드를 빌드하고 실행 한 후 유사한 동작을 관찰하고 있습니다 (Xcode 5 / iOS 7에서 올바르게 작동 함). Xcode 6의 iOS 시뮬레이터에서 SecItemCopyMatching은 항상 -34018을 반환합니다. 기능 탭에서 “키 체인 공유”를 켠 후 작동하기 시작했습니다.

그러나 나는 또 다른 문제가 있습니다. 나는 (다른 것들 중에서) 데모 응용 프로그램에서 사용되는 정적 라이브러리를 개발 중입니다. 위의 솔루션은 데모 응용 프로그램 프로젝트에서 작동하지만 정적 라이브러리 프로젝트를 단위 테스트하려고 할 때 정확히 동일한 오류가 발생합니다. 문제는 내 정적 라이브러리 프로젝트에 기능 탭이 없다는 것입니다 (독립 실행 형 애플리케이션이 아니기 때문에).

테스트 대상에서 코드 서명을 사용하여 JorgeDeCorte가 게시 한 솔루션을 시도해 보았지만 작동하지 않습니다.


답변

시도 응용 프로그램 시작할 때 모든 중단 점을 사용하지 엑스 코드에서합니다. 나중에 활성화 할 수 있습니다.

(위의 해결 방법 중 어느 것도 나를 위해 일하지 않았습니다)


답변

7.1 및 8.0을 실행하는 시뮬레이터에서 동일한 문제가 발생했습니다. 파헤치는 동안 Apple 샘플 앱의 대상 기능에 대해 KeyChain 공유가 켜져 있음을 알았습니다. 내 앱에 대해이 기능을 켜서 기본값으로 남겨둔 권한 파일이 생성되었으며 이제 더 이상 -34018 오류가 발생하지 않습니다. 이것은 이상적이지는 않지만 지금은 KeyChain 공유 옵션을 사용할 것입니다.


답변

.xctest 번들을 공동 설계하는 것은 경우에 따라 들리는 것처럼 쉽지 않습니다. 주로 JorgeDeCorte는 주어진 짧은 줄 이 대부분의 개발자에게 충분 하다는 그의 대답에 맞습니다 Run Script.

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

그러나 키 체인에 여러 인증서가있는 경우 다음 줄과 함께 실패합니다.

iPhone Developer: ambiguous (matches "iPhone Developer: Your Name (ABC123DEF45)" and "iPhone Developer: Your Name (123ABC456DE)"

여러 인증서가있는 경우에도 올바른 인증서를 얻는 솔루션은이 짧은 스크립트입니다. 확실히 이것이 이상적이지는 않지만 내가 아는 한 Xcode가 .app 서명에 사용하고 찾은 인증서를 얻을 기회가 없습니다.

echo "codesign --verify --force --sign \"$CODE_SIGN_IDENTITY\" \"$CODESIGNING_FOLDER_PATH\""
IDENTITIES=`security find-identity -v -s "Code Signing" | grep "iPhone Developer" | awk '{ print $2 }'`

for SHA in $IDENTITIES; do
    codesign --verify --force --sign $SHA "$CODESIGNING_FOLDER_PATH"
    if [ $? -eq 0 ]; then
        echo "Matching identity found: $SHA"
        exit 0
    fi
done;

exit 1