2014-11-09 4 views
6

목표 : 내 패키지에 서명하고 내 자신의 커널 확장에 서명하십시오. "내 자신"이라는 말은 "내가 작성한 파일이거나 다른 곳에서 가져온 파일, 자신의 소스에서 재 컴파일 한 파일, 컴퓨터에 설치하려는 파일이다.Mavericks/Yosemite에서 kext에 서명 할 수 없습니까?

문제점 : 매버릭스는 내 서명을 Code Signing Failure: code signature is invalid kext), Yosemite는로드하지 않습니다.

나는 내 자신의 CA와 코드 서명 인증서가 있습니다. 코드에 성공적으로 서명하고 주어진 certs가 서명 한 코드를 허용하는 정책을 설정할 수있었습니다. 설치 및 실행 - 아래 출력에서 ​​볼 수 있듯이 codesignspctl을 좋아하지만 kext (커널 확장)에는 적용되지 않는 것 같습니다 - kextutil은 서명이 유효하지 않다 고 주장합니다. 점점 :

$ codesign --verify -vvvv /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: valid on disk 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: satisfies its Designated Requirement 

$ spctl -a -vvv -t exec /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted 
source=XXXXXCode 
origin=XXXXXCoder 
$ spctl -a -vvv -t install /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted 
source=XXXXXInstall 
origin=XXXXXCoder 

$ kextutil -tn /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
Diagnostics for /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: 
Code Signing Failure: code signature is invalid 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext appears to be loadable (including linkage for on-disk libraries). 

이 kext는 경고 메시지와 함께로드되며 요세미티에서는 그렇지 않습니다.

hereApple CA CPS Developer ID에서 인증서에 kext-signing 인증서로 지정하는 다음 확장자 ((1.2.840.113635.100.6.1.18))가 있어야한다는 것을 알았습니다. 내 것은 그것을 가지고 있지 않습니다. 나는 그것이 그것이 내 문제의 원인이라고 생각하지만 그것을 해결하는 방법을 모른다. 주어진 인증서를 kext 서명 인증서로 지정하는 정책을 만들려면 spctl에 유형 옵션이없는 것 같습니다.

Apple의 연례 "사용료"를 100 달러 지불하지 않으면이 확장 기능을 어떻게 추가합니까 (OpenSSL 기반 솔루션이 적합 할지라도 키 체인 인증서 지원 기능 포함).

+1

인증서로 서명 된 kexts를 수락하는 자신 만의 커널을 컴파일하는 것이 아니라면, Apple에서 하나를 가져와야합니다. 개발자의 ID 인증서는 1 년이 아니라 5 년 후에 만료됩니다. – pmdj

+0

감사합니다. 그러나 이해할 수 있는지 확실하지 않습니다. [개발자 회원 센터] (https://developer.apple.com/membercenter/index.action)는 특정 개발자 프로그램에 등록하지 않는 한 /를 요구할 수 없습니다. [Mac 개발자 프로그램] (https://developer.apple.com/programs/mac/)은 연간 99 달러입니다. 개발자 ID 인증서를 발급하는 데 걸리는 시간을 확인할 방법이 없습니다. 1 년 후에 회원 자격을 취소 (또는 갱신하지 않겠다는 뜻)겠습니까?하지만 개발자 ID 인증서는 4 년 더 유효하지 않습니다. – Mouse

+1

예, 갱신은 자동이 아닙니다. 경험상 개발자 ID 인증서는 발급 후 5 년 후에 만료됩니다. 만료되기 직전에 새 인증서를 요청하면 약 6 년이 걸릴 것입니다. 인증서가 만료되면 서명 된 소프트웨어가 게이트 키퍼 유효성 검사에 실패 할 것으로 예상되므로 게이트 키퍼가 차단하기 몇 달 전에 웹에 소프트웨어를 게시하는 것은 좋지 않을 수 있습니다. 5 년은 소프트웨어에서 오랜 시간입니다. 그때까지는 Mac이 ARM CPU에서 실행될 수 있으며 제 3 자 kexts는 전혀 허용되지 않습니다. ;-) – pmdj

답변

2

Apple만이이 OID로 인증서를 생성하고 커널에 대해 유효한 것으로 간주 할 수 있습니다.

자세한 내용은 tonymacx86.com의 What's New in Kext Development을 참조하십시오. 다음은 관련 부분입니다.

OID입니다 1.2.840.113635 애플의 기업 접두사이며, OID의 나머지는 특정 속성이 커널 확장을로드 할 수 있도록 인증서 "잎" (서명 인증서)에 존재해야하는지에 대해 설명합니다. 이 은 $ 99/yr 개발자 프로그램의 일부로 Apple에서 제공 한 인증서로만 유효한 유효한 서명 된 커널 확장을 만들 수 있음을 의미하며 해당 이해 관계자는 특별 양식을 작성하여 인증서가 필요한 이유를 설명해야합니다. ; kext 인증서는 요청 및 승인시에만 제공됩니다.

특정 OID로 인증서를 생성하고 자신의 CA로 서명하는 것이 가능하지만 OS X은 커널 확장을 위해 Apple의 CA 만 인식합니다. Gatebreak's documentation은 이것을 간단히 언급합니다.

변화 kextutil, kextd에 포함 된 코드 요구 사항, 그들은 애플의

+0

OID가 1.2.840.113635로 시작하는 확장명을 가진 인증서를 만들 수없고 내 키 체인에서 신뢰할 수있는 것으로 표시되는 자체 CA로 인증서에 서명 할 수 없다는 뜻입니까? Apple CA가 서명하지는 않지만 "신뢰할 수있는"것으로 표시된 모든 신뢰할 수있는 CA가 동일한 것은 아닙니다. 나는 그런 증명서가 kext에 주어진 _distribute_을 허용하지 않을 것이라는 것을 깨닫는다. 그러나 그것은 필요하지 않다. – Mouse

+0

@Mouse OSX는 커널 확장을 위해 Apple의 CA 만 인식 할 것입니다. [Gatebreak] (http://www.tonymacx86.com/mavericks-desktop-support/112306-gatebreak-signed-kexts-everyone.html)는 이것에 대해 간략하게 이야기합니다. 나는 이것에 대해 잘못 입증되고 싶다. –

+0

사과 만 특정 OID로 인증서를 생성 할 수 있을지는 의문입니다. OpenSSL을 해킹하여 원하는 OID를 추가하고 openssl이 행복하게 OID를 사용하여 인증서를 생성하기 만하면된다고 생각합니다. RPKI에서 일했고 인증서에 BGP 및 IP 리소스를위한 새로운 OID가 있습니다. – Lmwangi

1

사람이 아닌 다른 루트 인증서 그들이 원하는대로 OID를 인증서를 생성 할 수 있도록 kextcache. 사실, OID가 항상 추가되고 있습니다. IANA으로 이동하여 OID를 요청하고 gnutls/openssl 소스 코드를 해킹하여 새로운 fangled 필드에 대해 generating certificates을 시작할 수 있습니다.인증서에 있어야하는 코드 서명에 대한 관련 OID는 documented입니다. 그것은 kexts에 서명 할 수있는 개인 CA 및 중개 인증서의 생성을 처리해야합니다. patches을 생성 할 수있는 OpenSSL에 대해 살펴보십시오 RPKI certificaes

다음 작업은 Apple이 귀하의 CA를 앵커 인증서로 인식하는 방법을 알아내는 것입니다. 내 추측으로는 KeyChain Access를 사용하여 생성 된 CA 인증서를 가져와야한다는 것입니다. 사과가 어떻게 든 CA를 하드 코드하면 (어리 석고 바보가 될 것입니다), 우리는 운명을 따릅니다. 그렇지 않으면 일부 파일 시스템 리소스에서 인증서 앵커를로드해야합니다. 찾으려면 dtruss를 사용하십시오. 나의 초기 조사 포인트는/System/Library/Keychains/

4

Apple에서 Kext 서명 인증서를 요청하려면 this form을 사용해야합니다.

+1

이 대답의 유일한 문제점은 Mac 개발자로서 연회비 $ 99를 지불해야한다는 것입니다. 그리고 이것은 제 원래의 질문이 말했듯이 제가 피하고 싶은 것입니다. – Mouse

+1

물론,이 질문은 그 형식보다 훨씬 쉽게 찾을 수 있습니다. 나는이 형식을 상당히 오래 전에 발견했습니다. –