这两天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 <VirtualHost _default_:442> # General setup for the virtual host DocumentRoot "D:/programs/xampp-win32-1.8.1-VC9/htdocs"#服务器根目录 ServerName 192.168.1.221#服务器名,必须是ip地址或域名 ServerAdmin [email protected]#这个是邮箱地址,可以随意填 ErrorLog "logs/error.log" <IfModule log_config_module> CustomLog "logs/access.log" combined </IfModule> SSLEngine on SSLCertificateFile "conf/ssl.crt/server.crt"#之后生成的证书的路径 SSLCertificateKeyFile "conf/ssl.key/server.key"#之后生成的密钥的路径 </VirtualHost>
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.cnf
7. 在当前目录创建目录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.cnf
9. 将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