우리는 루트를 사용하여 실행되는 시작 데몬을 가지고 있으며 네트워크를 통해 서버 구성 요소와 통신합니다. 서비스로 인증해야하기 때문에 암호를 처음 가져올 때 시스템 키 체인에 저장합니다. 후속 실행시, 키 체인에서 암호를 검색하여이를 사용하여 네트워크 서비스를 인증하는 것이 좋습니다.Mac 시작 데몬이 시스템 키 체인에서 암호를 저장 한 후에 검색 할 수 없습니다.
이 작업은 정상적으로 진행되었지만, macOS 10.12에서는 기존 코드가 작동을 멈췄으며,이 문제를 해결하는 방법에 대해 완전히 모호했습니다. 그것은이 아래로 비등 :
에 관계없이 우리는 새 암호를 저장하거나 이전을 검색하고 있는지의, 우리는 시스템 키 체인에 대한 참조를 사용하여이 얻을 :
SecKeychainCopyDomainDefault(kSecPreferencesDomainSystem, &system_keychain);
에 우리는 또한 비활성화 사용자 상호 작용을 우리가 데몬의 컨텍스트에서 이미 벗어나기를 기대한다고해도 좋을 것입니다.
SecKeychainSetUserInteractionAllowed(false);
키 체인에 새 암호를 저장
, 우리는OSStatus status = SecKeychainAddInternetPassword(
system_keychain,
urlLength, server_base_url,
0, NULL,
usernameLength, username,
0, NULL,
0,
kSecProtocolTypeAny, kSecAuthenticationTypeAny,
passwordLength, password,
NULL);
이 많은 작품을 사용합니다. 성공이보고되고 Keychain Access.app의 "system"키 체인에서 항목을 볼 수 있습니다. 우리 데몬의 후속 실행에 가져
이 선으로 이루어집니다 :
status = SecKeychainFindInternetPassword(
system_keychain,
urlLength, url,
0, NULL,
usernameLength, username,
0, NULL,
0,
kSecProtocolTypeAny, kSecAuthenticationTypeAny,
&passwordLength, &password_data,
NULL);
불행하게도,이 우리에게 불분명 한 이유로 errSecAuthFailed
반환 시작했다. 아무 소용이
우리가 시도한 몇 가지 추가 우리가 점검 한 내용과 일
:- 데몬 바이너리는 개발자 아이디 인증서로 서명됩니다.
- 데몬 바이너리에는 번들 ID와 버전이있는 Info.plist 섹션이 포함되어 있습니다.
- Keychain Access.app의 암호 항목에있는 "Access Control"탭에서 "이 응용 프로그램의 액세스를 항상 허용"목록에서 데몬 바이너리를 볼 수 있습니다.
- 키 체인 접근에서 "모든 응용 프로그램이이 항목에 액세스하도록 허용"으로 수동 전환하면 작동합니다. 그러나 키 체인에 비밀번호를 저장하는 데는 다소 어려움이 있습니다.
- 우리는 매개 변수를
SecKeychainAddInternetPassword
으로 사용 해보았지만 아무런 차이가 없었습니다. - 우리는
SecKeychainUnlock()
으로 키 체인의 잠금을 해제하려했지만 문서에 나와 있듯이 이것은 불필요한 것으로 보입니다. Keychain Access.app
에있는 항목을 삭제하면SecKeychainFindInternetPassword()
이errSecItemNotFound
이됩니다 (예상대로). 그래서 그것은 확실히 찾기 항목을 저장할 수 있습니다, 그냥 읽을 수 없습니다.
키 체인 설명서는 읽기 쉽고 부분적으로 동어 반복적 인 부분이 아닙니다. ("Y를하기 위해서 당신은 Y를하고 싶다"라고 언급하지 않고 Y를 할 필요가있다.) 그럼에도 불구하고, 나는 그것을 끝내고 그것을 대부분 이해했다고 생각한다.특정 설정의 다양한 측면에 대해서는 자세히 다루지 않지만 (데몬으로부터의 액세스) 이전에 에 저장된 항목에 액세스하려면에 특별한 승인이나 인증이 필요하지 않아야합니다. 우리가 보는 행동과 직접적으로 모순이됩니다.
아이디어가 있으십니까?