iOS 재서명 적용

4677 단어

코드 재서명


서명 메커니즘


iOS 서명은 코드sign 명령을 사용해야 합니다. 이 명령의 사용법을 이해하면 서명 메커니즘에 대한 이해를 높일 수 있습니다.
가장 간단한 상황은 서명 가능한 인증서로 파일에 서명하는 것이다
codesign -s "iPhone Distribution: Xiaoxuan Chen (CXJ8TF54LW)" mix.sh 

인증서 서명을 사용하면 신분과 코드의 완전성을 확인할 수 있지만 응용 실행은 다른 제한을 받아 서명할 때 응용 권한을 지정할 수 있다.
codesign -fs "iPhone Distribution: Qinda Zhuang (287VV6UT6R)" --entitlements=/Users/wangxuefeng/Desktop/CITest/entitlements.plist Live.app

entitlements.plist에 응용 권한이 저장되어 있습니다.
entitlements를 직접 만들지 않았습니다.plist, 그러나 우리가 응용 권한을 수정할 때, 예를 들어 전송을 열면entitlements가 변경됩니다.entitlements 정보는 provisioning profiles에 저장됩니다.
  • codesign은 codesign을 통해 OS X와 iOS 시스템에서 실행 가능한 바이너리 파일에 서명할 수 있다. 서명을 설정하려면 인증서와 키가 필요하고 파일이 변경되지 않도록 해야 한다
  • entitlementsentitlements 권한 수여 메커니즘은 어떤 시스템 자원이 어떤 상황에서 한 응용 프로그램에 사용될 수 있는지를 결정한다. 예를 들어 전송, 디버깅, 샌드박스 설정
  • provisioningprofiles는 전체 코드 서명과 샌드위치 메커니즘의 구성 부분에서 서명, 권한 수여와 샌드위치를 연결시킨다. 그것이 바로 설정 파일이다.

  • 재서명

  • 새 인증서와 프로비저닝 프로필 준비
  • 서명은 인증서와 키를 사용하고, 권한 수여 메커니즘은entitlements를 사용합니다.plist, 인증서와 일치하는 provisioning 프로필도 당연히 빠질 수 없습니다.entitlements.plist는 provisioning profiles에서 내보낼 수 있기 때문에 서명할 수 있는 인증서와 해당하는 provisioning profiles를 준비하면 됩니다.
  • 오래된 서명 삭제
  • iOS 응용 프로그램의 서명은.app에서 진행되었기 때문에 서명과 관련된 파일은 모두 저장됩니다.앱에.
    이미 있는 파일 서명 제거: 프로그램의 서명은 모두 한 파일에 있습니다CodeSignatue/CodeResources 는 서명하는 동안 파일이 재생성되므로 제거하지 않아도 됩니다.provisioning profiles: provisioning profiles를 제거하면 응용 프로그램에 복사됩니다. 이름은embedded입니다.mobileprovision, 이 파일 삭제
    CFBundleIdentifier
    #    Plist,Plist         
    defaults write /Users/wangxuefeng/Desktop/ci/Live.app/info.plist "CFBundleName" "  Top"
    defaults write /Users/wangxuefeng/Desktop/ci/Live.app/info.plist "CFBundleDisplayName" "  Top"
    defaults write /Users/wangxuefeng/Desktop/ci/Live.app/info.plist "CFBundleIdentifier" "com.fungo.loveshowtop"
    
    #     iPhone Distribution: Qinda Zhuang (287VV6UT6R)               ,       
    codesign -f -s "iPhone Distribution: Qinda Zhuang (287VV6UT6R)" --entitlements entitlements.plist Live.app
    
    #    
    codesign --verify Live.app
    
    #      
    codesign -vv -d Live.app
    
    #               
    security find-identity -v -p codesigning
    
    #  entitlements.plist
    security cms -D -i Live.app/embedded.mobileprovision > t_entitlements_full.plist 
    /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' t_entitlements_full.plist > entitlements.plist
    

    resign.sh

    workspace=~/Desktop/CITest
    
    payloadDirectory=${workspace}/Payload
    entitlementsPlistPath=${workspace}/entitlements.plist
    
    rm -rf payloadDirectory
    mkdir payloadDirectory
    
    cp -r $1 Payload
    
    provisioningFile=$3
    
    appName=Live.app
    
    appBundlePath=${payloadDirectory}/${appName}
    appBundleInfoPlist=${appBundlePath}/Info.plist
    appBundleProvisioningFilePath=${appBundlePath}/embedded.mobileprovision
    
    #  info.plist  CFBundleResourceSpecification   
    defaults delete $appBundleInfoPlist "CFBundleResourceSpecification"
    
    #     embedded.mobileprovision
    rm $appBundleProvisioningFilePath
    
    #   embedded.mobileprovision   app 
    cp -R "${3}" $appBundleProvisioningFilePath
    
    #    embedded.mobileprovision
    security cms -D -i $appBundleProvisioningFilePath > ${workspace}/t_entitlements_full.plist 
    /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' ${workspace}/t_entitlements_full.plist > ${entitlementsPlistPath}
    
    #  appID
    applicationIdentifier=`defaults read ${entitlementsPlistPath} "application-identifier"`
    newBundleId=${applicationIdentifier#*.}
    
    #       
    bundleExecutable=`defaults read $appBundleInfoPlist "CFBundleExecutable"`
    chmod 755 ${appBundlePath}/${bundleExecutable}
    
    #  bundleid, .app .appex       info.plist     
    oldBundleId=`defaults read ${appBundleInfoPlist} "CFBundleIdentifier"`
    
    # if $newBundleId != $oldBundleId then
        echo changing Bundle id $appBundleInfoPlist $newBundleId
        defaults write $appBundleInfoPlist "CFBundleIdentifier" $newBundleId
    # fi
    
    #  
    for file in `ls $appBundlePath/Frameworks` 
    do
         codesign -vvv -fs "$2" --no-strict --entitlements=${entitlementsPlistPath} $appBundlePath/Frameworks/$file
    done
    
    codesign -vvv -fs "$2" --no-strict --entitlements=${entitlementsPlistPath} $appBundlePath
    
    #      
    codesign -v $appBundlePath
    

    호출
    sh resign.sh /Users/wangxuefeng/Desktop/ci/Release-iphones/Live.app "iPhone Distribution: Qinda Zhuang (287VV6UT6R)" /Users/wangxuefeng/Library/MobileDevice/Provisioning\ Profiles/1fb19f15-021a-40ac-9f4f-d33fe1a1d138.mobileprovision

    좋은 웹페이지 즐겨찾기