背景
iOS軟體的開發和發布離不開認證和設定檔,如果要想發布app到Apple Store或者使用蘋果的推播通知功能,都需要個人開發人員認證簽名該app,以便通過蘋果的認證和審核。由於我們公司的app不是單獨一個,而是一個客戶對應一個app,在新版本中,需要用到推播通知功能,就需要發布app到Apple Store,通過認證後才能正常使用蘋果提供的這個服務,同時,為了滿足部分客戶要把自己的app發布到Apple Store 的需求,因此,我們需要使用這部分功能的客戶上傳他們的個人開發人員認證和相關檔案。 這時,就需要對這些認證進行驗證和管理,以及在打包時,動態匯入這個認證並簽名,這篇文章主要是為了記錄相關的原理、驗證認證、打包等技術點的實現細節。
專業詞彙
簽署憑證:
簽署憑證是用來在編譯代碼後進行程式碼簽署的,主要是為了說明這個代碼的所有者和合法性。通過iOS7 的SDK編譯時間,在編譯的時候就需要指定簽署憑證,當然我們仍然可以在編譯後進行重簽名。
推送認證:
推送認證主要我們的伺服器發送推送資訊給蘋果伺服器時,需要用到的認證認證,打包的時候不需要用到,僅僅是我們後台與蘋果伺服器通訊時需要。
AppId:
每個應用都有唯一的AppId,全球唯一,是應用的一個標識。推送認證在產生時會要求指定AppId,因此一個推送認證對應唯一的AppId。
設定檔:
設定檔包含了以上幾乎所有的資訊,包括這個應用的AppId,應用對應的簽署憑證,應用是否開啟了推送功能,應用是開發版本還是發布版本,應用能夠被哪台手機安裝(對於發布版本的應用,是所有手機都可以安裝的)。 驗證、擷取認證的資訊
簽署憑證:尾碼主要為 .p12,同時需要使用者輸入匯入該認證的密碼
在這個簽署憑證裡面,可以獲得UID、認證名稱、認證有效期間。在linux或mac下,使用openssl 來擷取相關的資訊,命令如下:
(1) openssl pkcs12 -in ~/cert.p12 -nodes -passin pass:"my password" | openssl x509 -noout –text
可以輸出所有我們需要的資訊,但是需要進行檢索和解析。
(2) openssl pkcs12 -in ~/cert.p12 -nodes -passin pass:"my password" | openssl x509 -noout –dates
可以輸出認證的有效期間
(3) openssl pkcs12 -in ~/cert.p12 -nodes -passin pass:"my password" | openssl x509 -noout –subject
可以輸出認證的UID和認證名稱
推送認證(可選):尾碼主要為 .p12,同時需要使用者輸入該認證的密碼 在這個簽署憑證裡面,同樣可以獲得UID、認證名稱、認證有效期間、以及是否是推播通知類型的認證。命令同上。 如何判斷此 .p12檔案是推送認證。。。下圖高亮處,後面跟著AppId
設定檔:尾碼為 .mobileprovision
從這個設定檔中可以獲得AppId、有效期間、認證類型,是開發版本還是發布版本等等。方法如下:
(1) 先把這個設定檔轉成xml,再解析,命令:
openssl smime -inform der -verify -noverify -in file.mobileprovision。
(2) xml節點說明:
設定檔產生的日期
<key>ExpirationDate</key><date>2014-10-28T03:19:05Z</date> 設定檔到期的時間 <key>application-identifier</key><string>KZV5N634G4.com.mdby.motan2.testForPush</string> 應用標識符,全球唯一,紅色部分需要在打包時傳給打包程式
就是,我所說的AppId
<key>aps-environment</key><string>development</string><key>aps-environment</key><string>production</string> 判斷該認證是發布版本,還是開發版本,當然,我們可以通過其他的標誌來判斷。<key>UUID</key><string>855C845A-2E51-414F-A29B-837AD1A67F67</string>
是一個唯一識別碼,我們要想在工程中使用這個設定檔,一般是雙擊,然後在xcode 的工程中,就可以選擇這個設定檔了,其實那是系統解析了這個mobileprovision檔案,提取裡面的UUID,用這個UUID重新命名這個mobileprovision檔案,然後將這個檔案放到Mac 系統的~/Library/MobileDevice/Provisioning Profiles/這個目錄下。在Xcode 的工程中,就是預設在這個路徑下尋找可用的mobileprovision檔案。因此我們編譯和打包前,需要通過這個UUID重新命名伺服器端傳過來的mobileprovision檔案,並放到上面那個目錄下,從而在打包命令中直接通過UUID指定設定檔。 推送認證製作
實際上,客戶所上傳的那個.p12尾碼的推送認證,並不能直接用來推送資訊,需要把裡面的認證和私密金鑰同時提取到一個 .pem尾碼的檔案中,利用這個檔案與Apple 伺服器端通訊。步驟如下:
p12檔案中提取認證
openssl pkcs12 -in mykeystore.p12 -clcerts -nokeys -out mycert.pem -passin pass:"mdby2013"
p12檔案中提取私密金鑰
openssl pkcs12 -nocerts -out mykey.pem -in push.p12 -passin pass:"mdby2013" -passout pass:"mdby2013"
合并cert和key
cat PushChatCert.pem PushChatKey.pem > ck.pem 編譯、簽名、打包
0、在低版本的command line 工具中,需要匯入一個參數
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
1、解鎖Mac的鑰匙串
security unlock-keychain -p $1 "~/Library/Keychains/login.keychain"
$1是登入系統鑰匙串的密碼
2、匯入簽署憑證到Mac的鑰匙串
security import /Users/mrghappy/app/mdby.p12 -k ~/Library/Keychains/login.keychain -P "$2" –A
$2是匯入認證的密碼,這個是客戶在匯出他們的簽署憑證時,填寫的密碼 -A 表示這個認證對任意應用可用,有安全風險,需要謹慎,加上這個是為了不要每次打包使用該認證簽名時,總是彈出警告框,要求輸入密碼。
3、查看鑰匙串中是否有該匯入的認證
security find-certificate -a -c "$2" -Z | grep ^SHA-1
$2 是認證的名稱,該命令會列舉出具有這個名稱的系統內的認證。
4、clean項目
xcodebuild clean
5、build項目
xcodebuild-target motan -configuration Release build PLATFORM_NAME=iphoneos BUILDSDK=/Developer-SDK7CODE_SIGN_IDENTITY="$2" PROVISIONING_PROFILE="$3"
其中2變數是簽署憑證對應的認證名稱。2變數是簽署憑證對應的認證名稱。3是設定檔對應的UUID
6、簽名、打包
xcrun -sdk iphoneos PackageApplication -v /Users/mrghappy/app/build/Release-iphoneos/$4.app -o /Users/mrghappy/app/build/Release-iphoneos/$4.ipa --sign "$2" --embed /Users/mrghappy/app/mdby.mobileprovision
其中$4是這個項目的名稱,--sign是指定簽署憑證簽名,--embed 是打包時把設定檔打包進去。
7、當然,我們可以驗證一下打包好的ipa檔案是否正確
codesign -d -vvv --file-list - /Users/mrghappy/app/build/Release-iphoneos/$4.app
8、為了防止鑰匙串中匯入的認證過多,維護困難,我們可以在打包完後,刪除掉
security delete-certificate -c "$2" ~/Library/Keychains/login.keychain