局域网通过 itms-services(https) 安装企业级 ios 应用
由于iOS13.1要安装企业应用,url必须是https的,不能是http,这就要求我们的服务器要支持https:
itms-services://?action=download-manifest&url=https://example.com/manifest.plist
完成以下操作,即可通过自己的Mac笔记本构建局域网用于下载测试(同一个局域网或者VPN网络下)
注意:正式打包出来的企业ipa包,万万不可放到第三方公网测试网站当成发布的服务器,比如:蒲公英,会导致苹果封号。
实现(Mac):
1、支持https;
2、自建信任证书;
一、配置https
Mac OS X 自带了Apache环境,启动之后,相当于web服务器(外部可以访问到,读取plist文件和ipa包),可以通过在终端(terminal)输入 httpd -v 来查看Apache的版本信息:
$ httpd -v Server version: Apache/2.4.41 (Unix) Server built: Feb 29 2020 02:40:57
启动Apache
在终端输入
sudo apachectl start
就可以启动Apache。
启动后,在浏览器中输入 http://127.0.0.1或http://localhost 如果看到 It Works! 页面,那就说明启动成功了。
测试一下本地ip网络https的链接状态:
先查看本地网络的ip地址,然后在浏览器打开
如果本地不支持https,那就需要配置了。
Apache 启动成功后,站点的根目录为系统级根目录:
/Library/WebServer/Documents 停止Apache: sudo apachectl stop 重启Apache: sudo apachectl restart
开始配置 SSL
1、编辑 /etc/apache2/httpd.conf 文件,删除下列代码前的注释符号 #:
LoadModule ssl_module libexec/apache2/mod_ssl.so Include /private/etc/apache2/extra/httpd-ssl.conf
2、备份文件,只需要执行一次:
sudo cp httpd-ssl.conf httpd-ssl.conf.bak
如果操作出现错误,可以使用命令,恢复备份的 httpd-ssl.conf 文件:
sudo cp httpd-ssl.conf.bak httpd-ssl.conf.conf
编辑 /etc/apache2/extra/httpd-ssl.conf 文件,添加 <VirtualHost>,httpd-ssl.conf 中已经有一条 <VirtualHost> 记录,我们将其注释掉,新建一条:
<VirtualHost *:443> #General setup for the virtual host DocumentRoot "/Library/WebServer/Documents" ServerName 192.168.2.11 //一会创建证书需要用到,填写本地网络ip地址 #SSL Engine Switch: SSLEngine on #Server Certificate: //一会创建的证书的名字,填写相应的名字即可 SSLCertificateFile "/etc/apache2/ssl/ca.crt" #Server Private Key: //一会创建的证书的名字,填写相应的名字即可 SSLCertificateKeyFile "/etc/apache2/ssl/server.key" #SSL Engine Options: <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/Library/WebServer/CGI-Executables"> SSLOptions +StdEnvVars </Directory> </VirtualHost>
3、检查配置文件并重启 Apache,命令行输入 :
$ sudo apachectl -t
可能会提示:
AH00526: Syntax error on line 92 of /private/etc/apache2/extra/httpd-ssl.conf: SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
根据提示,编辑 /etc/apache2/httpd.conf 文件,删除下列这些代码前的注释符号 #
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
4、再次测试,显示 Syntax OK:
sudo apachectl -t
Syntax OK
5、说明测试通过,重启 Apache:
sudo apachectl restart
网页出现It works!,说明https通过
二、生成 Apache 服务器 Https 服务用的自签名证书
iOS7.1 以后, Apple 不再支持 HTTP 方式的 OTA ,所以需要为 Apache 开启 HTTPS 服务,并利用 OpenSSL 制作自签名证书。
证书创建完之后是这个样子的:
创建证书的步骤:
1、生成服务器私钥 server.key
sudo mkdir /private/etc/apache2/ssl cd /private/etc/apache2/ssl sudo openssl genrsa -out server.key 1024
2、生成签署申请
sudo openssl req -new -key server.key -out server.csr
注意:需要完整填写各项信息,注意Common Name必须是服务器 ip 或域名,其他信息可以随意填写。例如我需要把 ipa 安装包放在 192.168.2.11 的内网服务器上,则Common Name就填写 192.168.2.11 。如果这一步漏填信息,可能会导致最后生成的 ca 文件是空的。
3、生成 CA 私钥ca.crt
sudo openssl req -new -x509 -days 365 -key server.key -out ca.crt
填写信息和上面的填写的一样即可,注意Common Name必须填写,这里还是填写192.168.2.11即可。
4、创建文件和文件夹
在 ssl 目录下创建 demoCA 文件夹,然后进入 demoCA ,创建一个 index.txt 和 serial文件,index.txt 为空, serial 内容为01,然后在 demoCA 中再创建一个空文件夹 newcerts
sudo mkdir demoCA && cd demoCA
sudo mkdir newcerts
sudo touch index.txt
sudo touch serial
使用 Xcode 或者 vim 编辑 serial 文件,第一行写入 01 保存即可。
5、签名生成server.crt
执行命令,返回到ssl文件夹下面
cd /private/etc/apache2/ssl
然后执行命令,用ca进行签名生成server.crt
sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile server.key
这一步可能会报如下错误
Using configuration from /private/etc/ssl/openssl.cnf variable lookup failed for ca::default_ca140736040362952: error:0E06D06C:configuration file routines:NCONF_get_string: no value:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/ libressl-22.50.2/libressl/crypto/conf/conf_lib.c:323:group=ca name=default_ca
这是由于/private/etc/ssl/文件夹下缺少 openssl.cnf 的问题,解决办法是拷贝一份,输入命令
cp /usr/local/etc/openssl/openssl.cnf /private/etc/ssl/openssl.cnf
使用Xcode或者vim修改/private/etc/ssl/openssl.cnf文件,这里使用vim直接修改
sudo vim /private/etc/ssl/openssl.cnf
dir = ./demoCA # Where everything is kept 修改为当前你的demoCA路径 dir = /private/etc/apache2/ssl/demoCA
6、修改完成后再执行命令
sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile server.key
7、会提示有效期和生成证书,都输入y即可。
Certificate is to be certified until Nov 10 06:39:36 2019 GMT (365 days) Sign the certificate? [y/n]:y (翻译)证书有效期至11月10日06:39:36 2019 GMT(365天) 1 out of 1 certificate requests certified, commit? [y/n]y 签署的证书吗? (翻译)1 / 1的证书请求被认证,提交?
8、此时我们看到 HTTPS 证书已经生成完成。
三、放置资源文件
进入web服务器:
cd /Library/WebServer/Documents
放置如下:
ipa:xcode打出来的包;
ca.crt:上面创建的自签证书;
icon57:57*57尺寸的图标;
icon512:512*512尺寸的图标;
manifest.plist:xcode打出来的文件之一;
格式:
第一个url:http://192.168.2.11/web/App.ipa 必须对应web服务器里面ipa存放的路径
检测:在浏览器输入,可下载ipa即为成功;
http://192.168.2.11/web/App.ipa
index.html:苹果手机首次安装ipa包,必须先下载安装 ca.crt 证书,然后再点击安装 ipa。 url 中必须填写 https 开头的 plist 文件下载地址,plist 文件中对应 ipa 文件的下载地址。
<html> <head> <meta name="viewport"content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h4>手机首次下载请先"点击安装SSL证书",并根据提示安装信任证书</h4> 在 iOS 10.3 及更高版本中,手动安装包含证书有效负载的描述文件时,这个证书不会自动受 SSL 信任。 当安装通过电子邮件发送或从网站下载的描述文件时,您必须手动开启受 SSL 信任。 要为这个证书开启受 SSL 信任,请前往“设置”>“通用”>“关于本机”>“证书信任设置”。在“针对根证书启用完全信任”下,开启信任这个证书。 <a title="iPhone" href="http://192.168.2.11/web/ca.crt">?点击安装SSL证书?</a> <hr> <a href="itms-services://?action=download-manifest&url=https://192.168.2.11/web/manifest.plist" class="app_link">?点击安装版本?</a> <hr> </body> </html>
检查:在浏览器输入以下网址,看能否下载ca.crt和显示manifest.plist内容,如果都可以,说明没问题。
https://192.168.2.11/web/manifest.plist http://192.168.2.11/web/ca.crt
四、设置证书信任
如果下载 ipa 时出现无法连接到192.168.*.*的错误,则需要手动设置信任。
iOS7.0 以后必须使用 HTTPS 进行,iOS 10 之前的设备,直接安装自签名根证书后就可以安装 iOS 应用,但是在 iOS 10.3 以上的设备上,安装后还需要到“关于本机”那里手动开启信任。