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


116

때때로 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

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


같은 문제가있어 재현 할 수 없습니다 ... Apple의 KeychainItemWrapper 클래스를 사용하고 있습니다. 때때로 동일한 오류 메시지와 함께 Google Analytics에서 충돌합니다. Google Analytics v3.02를 사용하고 있습니다.
Joey

또한 AppStore의 앱에서도 괜찮은 것 같습니다. 개발 버전 앱에서만 발생합니다.
Joey

2
나는 앱 스토어 버전에 대한 crashlytics를 가지고 있으며 불행히도 앱 스토어에서도 발생하는 것 같습니다.하지만 개발자보다 덜 자주 발생합니다. : /
Tony

3
키 체인에 저장된 데이터가 이와 같이 무작위로 손실 될 수 있다는 사실은 응용 프로그램에 매우 치명적인 오류이기 때문에 키 체인에서 전환 할 생각입니다.
Tony

2
우리는 또한이 간헐적 인 문제를보고 있습니다. -34018 케이스를 포함하여 secItemCopyMatching에서 예기치 않은 rc를 받으면 예외가 발생합니다. 우리는 키 체인에서 필요한 값을 얻으면 앱 메모리에 캐시 한 다음 키 체인 액세스없이 제공하는 메커니즘을 추가하려고했습니다. 그러나 이제 우리는 처음에 키 체인 액세스가 -34018로 실패하는 드문 경우를보고 있습니다. -34018 후에 작업을 재 시도한 사람이 있습니까?
Chris Markle 2014

답변:


45

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


2
이 문제는 여전히 iOS 9.2, iPhone 5S에서 재현됩니다.
DevGansta

1
링크 한 스레드 에서 Apple최신 응답 에 따라 iOS 9.3이이 문제를 해결해야하는 것 같습니다 . @daidai,이 새로운 정보로 답변을 업데이트 해 주시겠습니까?
jf 2013 년

1
@YoonLee는 또한 AWS의 2.4.8 SDK를 사용하여 iOS10에서도 이것을보고 있습니다. AWSClientContext.m 라인 54에서 오류가 트리거되었습니다.이 문제를 해결하는 데 행운이 있습니까?
CharlesA

1
@YoonLee btw, 방금 아래 답변 중 하나를 사용하여이 문제를 해결했습니다. '목표 기능을 위해 키
체인

1
@CharlesA 네, 그날 해결했습니다. 당신이 옳습니다. 'KeyChain Entitlement on'이 문제를 해결하는 것으로 보입니다. 놀랍게도이 오류가 항상 발생하는 것은 아닙니다. 어쨌든, 지금은 이것을 켜고 있습니다.
윤 리

25

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

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

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

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


테스트 환경에서 수정되었는지 확인했습니다. 실제 테스트 대상에 실행 스크립트를 추가해야했습니다 (예 : 장치에서 실행되는 빌드 대상이 아니라 모든 단위 테스트가있는 대상). 또한 이것은 시뮬레이터가 아닌 장치에서만 문제임을 확인했습니다.
iwasrobbed

2
이 작업을 수행 할 때 ": no identity found Command / bin / sh failed with exit code 1"이 표시됩니까? $ CODE_SIGN_IDENTITY이없는 것 같습니다. 이 문제를 어떻게 고칠 지 아십니까?
Daniel Coffman

1
@DanielCoffman, 대상 설정으로 이동하고 코드 서명 ID에서 "iOS 개발자"(또는 다른 유효한 ID)를 선택해야합니다. 이것은 빌드 오류를 수정하지만 적어도 나에게는 키 체인 문제를 수정하지 않습니다. 여전히 -34018 오류 코드가 표시됩니다.
Marcin

3
감사합니다 Marcin. xcode 6 베타로 전환했을 때이 오류가 발생하기 시작했습니다. 이 스레드의 제안이 해결되지 않았습니다. xcode 5 및 -34018로 복귀하면 더 이상 발생하지 않습니다.
Daniel Coffman

XCode 6.3을 사용한 이후 처음으로이 오류가 발생합니다.
Vladimír Slavík

13

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

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

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

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

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

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


2
다음 앱 대리자 메서드를 사용하여 딥 링크를 통해 내 앱을 다시 열 때만이 문제가 발생합니다.-(BOOL) application : (UIApplication *) application handleOpenURL : (NSURL *) url. 앱을 시작하기 만하면 키 체인 작성이 작동하고 앱을 최소화 및 최대화해도 여전히 작동합니다. 이 문제는 딥 링크로 다시 열 때만 발생합니다. 내 프로젝트에 MyApp.entitlements가 구성되어 있습니다 (기능 탭의 키 체인 공유) Xcode 7 베타 4
FranticRock

제 경우는 앱이 딥 링크 된 경우에만 발생하는 Alex의 경우와 유사합니다. 그렇지 않으면 잘 실행됩니다. 다른 앱에서 앱을 열 때 일부 컨텍스트가 올바르지 않을 수 있습니다.
CodeBrew 2015

12

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

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

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


8
그리고 iOS 8 베타 3으로 돌아 왔습니다. :)
Mustafa

7
그리고 iOS 9.0으로 돌아 왔습니다
Alex Stone

4
그리고 지금 다시 :-( 아이폰 OS 9.2
바 모스

4
10 베타 2 아이폰 OS에서 돌아 가기
Pranjal Bikash 다스

3
그리고 iOS 10 베타 5로 돌아 왔습니다
Pascal

6

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

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


이상한. 나도이 문제를 해결하는 것 같습니다! 시뮬레이터에서 디버깅을 시작할 때마다 -34018 OSStatus를 경험할 수있었습니다.
midori

4

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


4

.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

4

나도 이것에 물 렸고 다른 해결 방법으로는 성공하지 못했습니다. 그런 다음 내 앱과 관련된 모든 프로필과 모든 와일드 카드 프로필을 삭제하여 장치 자체에서 프로비저닝 프로필을 정리했습니다 (이것이 요점 인 것 같습니다). 이렇게하려면 Xcode의 "장치"창으로 이동하여 (연결된) 전화기를 마우스 오른쪽 단추로 클릭하십시오.

"프로비저닝 프로필 표시"를 클릭하고 관련 프로필, 특히 팀 프로필을 삭제합니다.

별표가있는 항목도 포함됩니다. 앱을 다시 설치하면 모든 것이 정상으로 돌아 왔습니다.


이것은 Xcode에서 앱을 실행하고 개발 프로세스를 계속하는 데 도움이되었습니다.
salabaha

AdHoc 릴리스를 빌드 할 때 사용되는 PP를 확인할 수 있습니다. XC가 표시되면 프로필을 삭제하고 PP를 새로 고칩니다!
dogsgod

이것이 어떻게 요인이 될 수 있는지 알 수 있습니다. 거기에 무슨 엉망 !! 가을 청소하기
David

3

이 문제를 해결했습니다 (내 생각에). 장치에 유효한 서명 ID가 없음을 나타내는 와일드 카드 프로비저닝 프로필이 있습니다. 또한 유효한 내 앱에 대한 프로비저닝 프로필이있었습니다. 와일드 카드 프로필을 삭제했을 때 -34018 오류가 발생하지 않습니다.

또한 대상의 빌드 설정에있는 코드 서명 섹션에 나열된 코드 서명 ID 및 프로비저닝 프로필이 앱에 대한 것과 동일한 지 확인했습니다 (일반 "iPhone 개발자"가 아님).


이것과 비슷하게 나를 위해 고쳤습니다. 프로젝트 수준 코드 서명을 디버그의 경우 "iPhone Developer"로, 릴리스의 경우 "iPhone Distribution"으로 설정합니다. 그런 다음 기본 대상에서 재정의를 제거하여 동일하게 표시합니다. 이전에는 키 체인에 저장하는 데 100 % 실패했습니다. 이후에는 키 체인에 저장하는 것이 안정적으로 보입니다.
jowie

2

나는 점점되지 않았다 -34018 아주 드물게 내 애플 리케이션 (아이폰 OS 8.4)에서 오류가 발생했습니다. 몇 가지 조사 결과 앱이 키 체인에서 데이터를 너무 자주 요청할 때이 문제가 발생한다는 사실을 발견했습니다 .
예를 들어, 제 상황에서는 다른 애플리케이션 모듈에서 동시에 하나의 특정 키에 대한 두 개의 읽기 요청이있었습니다.
이 값을 메모리에 캐싱하는 기능을 추가했습니다.


1

Xcode 6.2, iPhone 6, iOS 8.3이 설치된 테스트 장치에서 실행되는 동일한 문제가 갑자기 발생했습니다. 명확하게 말하면 Xcode 테스트를 실행하는 동안이 아니라 내 장치에서 실제 앱을 실행하는 동안 발생했습니다. 시뮬레이터에서는 괜찮 았고 앱 자체에서 실행하는 것은 최근까지 완벽하게 괜찮 았습니다.

내 장치에서 프로비저닝 프로파일을 제거하고 (모두 제거했습니다) 프로젝트에서 키 체인 공유 기능을 일시적으로 활성화하는 등 여기서 찾을 수있는 모든 제안을 시도했습니다 (실제로는 필요하지 않더라도). Xcode의 개발 계정이 모든 인증서와 프로비저닝 프로파일 등으로 완전히 새로 고쳐 졌는지 확인했습니다. 아무것도 도움이되지 않았습니다.

그런 다음 일시적으로 접근성 수준을에서 kSecAttrAccessibleAfterFirstUnlock로 변경하고 kSecAttrAccessibleAlwaysThisDeviceOnly앱을 실행했는데 정상적으로 작동하고 키 체인에 쓸 수있었습니다. 그런 다음 다시로 변경 kSecAttrAccessibleAfterFirstUnlock했는데 문제가 "영구적으로"사라진 것 같습니다.


1

Xcode 8 Beta 3에서이 버그에 물 렸습니다. 키 체인 공유를 켜는 것이 유일한 해결책 인 것 같습니다.


1

나는 같은 문제가 있었다. 키 체인 공유를 설정하여 문제를 해결했습니다.


1

(이것은 OP의 질문에 대한 직접적인 대답은 아니지만 다른 사람들에게 도움이 될 수 있습니다)

Xcode를 버전 7.3.1에서 8.0으로 업데이트 한 후 시뮬레이터에서 키 체인 오류 -34018이 지속적으로 발생하기 시작했습니다.

daidai의 답변 에서이 팁에 따라 ,

문제의 일부 인스턴스는 잘못된 앱 서명으로 인해 발생합니다. 문제가 100 % 재현 가능하기 때문에이 경우를 쉽게 구분할 수 있습니다.

프로비저닝 프로파일이 대상의 서명 섹션에서 어떻게 든 없음으로 설정되었음을 발견했습니다.

그러나 프로비저닝 프로파일 필드를 유효한 값으로 설정하는 것만으로는이 경우 문제를 해결하는 데 충분하지 않았습니다.

추가 조사에 따르면 푸시 알림 자격도 오류를 표시했습니다. "앱 ID에 푸시 알림 기능 추가"라고했습니다. 단계가 완료되었지만 "권한 파일에 푸시 알림 인 타이틀먼트 추가"단계는 완료되지 않았습니다.

푸시 알림 문제를 해결하기 위해 "문제 해결"을 누른 후 키 체인 오류가 해결되었습니다.

이 특정 대상의 경우 "키 체인 공유"권한이 이전에 이미 켜져있었습니다. 이 기능을 꺼도 지금까지 키 체인 오류가 다시 나타나지 않았으므로이 경우에 필요한지 여부는 명확하지 않습니다.



0

나를 위해 일한 유일한 해결책은 먼저 지정된 키에 대해 nil 을 저장 한 다음 별도의 작업으로 새 값을 저장하는 것입니다. 기존 값을 덮어 쓰려고하면 오류 -34018로 인해 실패합니다. 그러나 먼저 nil을 저장 하는 한 업데이트 된 값은 즉시 성공적으로 저장됩니다.


0

오늘 SecItemDelete API를 실행할 때이 -34018 문제를 만났습니다. 이 문제를 해결하기 위해 한 것은 다음과 같습니다. 1. @ k1th 솔루션 https://stackoverflow.com/a/33085955/889892 다음 2. 주 스레드에서 SecItemDelete를 실행합니다 (이전에는 주 스레드에서 읽었으므로 삭제와 정렬합니다) .

다시 돌아와서 죄송합니다 :(



0

나를 위해 일한 것

  • 키 체인 공유를 켭니다.
  • 키 체인을 가능한 한 적게 사용하고 메모리, UserPreferences, 디스크 등에 데이터를 캐시합니다.
  • 실패한 경우 키 체인 CRUD 작업을 여러 번 재 시도하십시오.
  • DispatchQueue.sync를 사용하여 데이터를 저장 / 삭제 / 업데이트합니다.

0

저에게는 앱 서명 문제였습니다. 나는 단순히 Xcode에서 올바른 서명 팀으로 전환했고 더 이상 오류가 발생하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.