這兩天In House簽名的時候,提示SSL證書過期了。又折騰了一把iOS In House方式發布。這裡開一篇文章記錄一下過去折騰In House的經過,未來再修改也更新在這裡。
最早在12年的時候,我們寫了一個重簽名的shell腳本
IPA="xxx.ipa" APPNAME="xxx.app" PROVISION="embedded.mobileprovision" CERTIFICATE="xxx" #must be in keychain, such as"iPhone Distribution: Tencent Co.,Ltd" rm -rf Payload rm -rf resigned.ipa unzip -q "$IPA" # remove the signature rm -rf Payload/*.app/_CodeSignature Payload/*.app/CodeResources # replace the provision rm -rf Payload/*.app/embedded.mobileprovision cp "$PROVISION" Payload/$APPNAME/embedded.mobileprovision # sign with the new certificate /usr/bin/codesign -f -s "$CERTIFICATE" --resource-rules Payload/*.app/ResourceRules.plist --entitlements game.plist Payload/*.app # zip it back up zip -qr resigned.ipa Payload rm -rf Payload
中間隨著iOS版本升級和XCode升級,間或小修改細節。每次XCode升級,必須下載安裝對應的command line tools。
iOS 7.1更新之後,蘋果做了一個大的調整,通過Safari安裝的時候,會提示“無法安裝應用程序 因為證書無效”。stackoverflow上看到必須把plist放到https服務器上,最簡單的就是丟到dropbox之類的雲存儲上,但是國內訪問可能會受限制。我就在我們內網服務器(apache)上自己生成了一下ssl證書,讓服務器支持https訪問,下面是詳細步驟。
1. 加載ssl動態庫;打開conf/httpd.conf,去掉LoadModule ssl_module modules/mod_ssl.so前的注釋即可;
2. 配置ssl;打開httpd-ssl.conf,我的配置示例如下:
SSLSessionCache "shmcb:logs/ssl.scache(512000)" Listen 442 #端口,為了防止端口沖突,我改成了442# General setup for the virtual host DocumentRoot "D:/programs/xampp-win32-1.8.1-VC9/htdocs"#服務器根目錄 ServerName 192.168.1.221#服務器名,必須是ip地址或域名 ServerAdmin webmaster@localhost#這個是郵箱地址,可以隨意填 ErrorLog "logs/error.log" CustomLog "logs/access.log" combined SSLEngine on SSLCertificateFile "conf/ssl.crt/server.crt"#之後生成的證書的路徑 SSLCertificateKeyFile "conf/ssl.key/server.key"#之後生成的密鑰的路徑
3. 打開cmd,到.../apache/bin目錄,運行以下命令生成服務器的私鑰
openssl genrsa -out server.key 1024
4. 生成簽署申請,Common Name必須是服務器ip或域名,其余都可以為空
openssl req -new -out server.csr -key server.key -config ..\conf\httpd-ssl.cnf
5. 生成CA私鑰
openssl genrsa -out ca.key 1024
6. 生成CA證書,Common Name必須是服務器ip或域名,其余都可以為空;為免過期,有效期我設為了10年
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config ..\conf\httpd-ssl.cnf7. 在當前目錄創建目錄demoCA,在裡面創建1. 空目錄newcerts,2. 空文件index.txt, 3,文件serial,用文本編輯器打開,填01;
8. 用CA為服務器簽署證書
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config ..\conf\openssl.cnf9. 將server.crt復制到目錄conf/ssl.crt/,將server.key復制到目錄conf/ssl.key/。
10. 重啟apache,然後可以在浏覽器輸入https://localhost:442測試。
11. 修改html文件中的plist鏈接
itms-services://?action=download-manifest&url=https://192.168.1.221:442/down/dev/xxx.plist然後,應該就可以在手機浏覽器上在線安裝了。
update 2014.12.24
中間有一段時間我沒有做過In House發布,此間我的Mac升級到了10.10,Xcode升級到了6.1.1。前天簽名的時候提示“--resource-rules has been deprecated in max os x >= 10.10”,簽完名放到服務器上,在線安裝的時候,最後一刻提示“無法下載應用程序 此時無法安裝xxx”。
在簽名的腳本裡把--resource-rules那裡注釋掉也不行。後來在stackoverflow上看到如下的解決方案,經過測試是可以的:
點工程 > Targets > Select your target > Build Settings > Code Signing Resource Rules Path
添加 $(SDKROOT)/ResourceRules.plist