一、Mac OS X 启用 web 服务器
Mac OS X 自带了Apache环境,我们只需要启动它就行了,可以通过在终端(terminal)输入 httpd -v
来查看Apache的版本信息:
$ httpd -v
Server version: Apache/2.4.18 (Unix)
Server built: Feb 20 2016 20:03:19
启动Apache
在终端输入 sudo apachectl start
就可以启动Apache。
启动后,在浏览器中输入 http://127.0.0.1
或http://localhost
如果看到 It Works! 页面:
Apache 就启动成功了,站点的根目录为系统级根目录:
/Library/WebServer/Documents
停止Apache:
sudo apachectl stop
重启Apache:
sudo apachectl restart
二、开启 HTTPS 服务
iOS 7.1 以上的设备部署OTA环境必须使用HTTPS,可以配置Apache开启HTTPS服务。
创建自签名证书
-
首先创建一个ssl目录用来存放证书:
$ cd /etc/apache2/ $ sudo mkdir ssl $ cd ssl
-
创建主机密钥:
$ sudo ssh-keygen -f 192.168.3.112.key Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in 192.168.3.112.key. Your public key has been saved in 192.168.3.112.key.pub. The key fingerprint is: SHA256:bNX90ww2g2GCh38Q/h68JnazkZYtnbkMEb1G5E51QWw root@XXdeiMac.local The key's randomart image is: +---[RSA 2048]----+ | oo.o +o+| | o.o+ B E.| | oo.+ % | | . ..o.* B.| | S .= +.+| | . . X o.| | o & = | | . = B . | | . o | +----[SHA256]-----+ $
执行
sudo ssh-keygen -f 192.168.2.112.key
命令,会被要求提供一个密码用于主机密钥,可以选择任何的密码或直接留空。其中192.168.2.112
是指Mac的内网地址,下同。也可以使用下面的命令创建密钥:
$ sudo openssl genrsa -out 192.168.2.112.key 2048 Generating RSA private key, 2048 bit long modulus ....+++ ....+++ e is 65537 (0x10001) $
-
创建签署申请:
$ sudo openssl req -new -key 192.168.2.112.key -out 192.168.2.112.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:192.168.2.112 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: $
执行 sudo openssl req -new -key 192.168.2.112.key -out 192.168.2.112.csr
命令后,系统会提示输入各项信息,由于这是自签名的证书,除了 Common Name (e.g. server FQDN or YOUR name) []: FQDN( fully qualified domain name)必须是服务器域名或 IP 外,其他都不重要,可以随意填写或一路回车。
-
创建SSL证书:
在生产环境中,我们需要提交证书申请(CSR)文件给证书颁发机构,由证书颁发机构提供SSL证书。
$ sudo openssl x509 -req -days 365 -in 192.168.2.112.csr -signkey 192.168.2.112.key -out 192.168.2.112.crt Signature ok subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=192.168.2.112 Getting Private key $
我们也可以直接通过以下的命令创建证书:
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout 192.168.2.112.key -out 192.168.2.112.crt
-
创建NOPASS密钥:
$ sudo openssl rsa -in 192.168.2.112.key -out 192.168.2.112.nopass.key
到目前为止SSL目录下已经创建了下面一些文件,这些文件将在后面被用到:
$ ls -l -rw-r--r-- 1 root wheel 1180 10 22 13:08 192.168.2.112.crt -rw-r--r-- 1 root wheel 993 10 22 11:58 192.168.2.112.csr -rw------- 1 root wheel 1679 10 22 11:44 192.168.2.112.key -rw-r--r-- 1 root wheel 408 10 22 11:44 192.168.2.112.key.pub -rw-r--r-- 1 root wheel 1679 10 22 13:19 192.168.2.112.nopass.key
配置 SSL
-
编辑
/etc/apache2/httpd.conf
文件,删除下列代码前的注释符号 #:LoadModule ssl_module libexec/apache2/mod_ssl.so Include /private/etc/apache2/extra/httpd-ssl.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.112 #SSL Engine Switch: SSLEngine on #Server Certificate: SSLCertificateFile "/etc/apache2/ssl/192.168.2.112.crt" #Server Private Key: SSLCertificateKeyFile "/etc/apache2/ssl/192.168.2.112.key" #SSL Engine Options: <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/Library/WebServer/CGI-Executables"> SSLOptions +StdEnvVars </Directory> </VirtualHost>
检查配置文件并重启 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
再次测试,显示 Syntax OK:
$ sudo apachectl -t
Syntax OK
说明测试通过,重启 Apache:
$ sudo apachectl restart
此时,就可以使用 HTTPS 访问本地服务了,在浏览器中输入 https://192.168.2.112/ 。
三、使用企业级证书打包生成ipa及plist文件:
打包具体步骤这里就不详述了,主要说一点,打包最后一步中,填写如下manifet.plist文件:
其中,各项都必须填写,URL是指相应文件在web服务器中的URL,比如ipa文件,如果直接放在服务器主目录下,则App URL为 https://192.168.2.112/TESTAPP.ipa 。
各项都填写好,Export ipa成功后,需要将 ipa、两个image文件以及manifest.plist文件放到刚刚填写的URL对应的服务器目录下。
四、为web服务器生成首页文件:index.html :
-
创建一个如下内容的index.html文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>应用名字</title> </head> <body> <h1 style="font-size:40pt">iOS应用OTA安装<h1/> <h1 style="font-size:40pt"> <a title="iPhone" href="itms-services://?action=download-manifest&url=https://192.168.3.112/manifest.plist">点击安装</a> <h1/> <a title="iPhone" href="http://192.168.3.112/192.168.3.112.crt">ssl 证书安装</a> <h1/> </body> </html>
其中,
https://192.168.3.112/manifest.plist
指向打包生成的plist文件,http://192.168.3.112/192.168.3.112.crt
指向服务器中的CA证书,也就是上述生成crt证书,因此,需要将上述生成的crt证书copy到web服务器目录下。 将index.html放到web服务器主目录下。
-
为了使web服务器能够正常的传输plist及ipa文件,需要配置 Web 服务器,设定服务器 MIME 类型,即编辑
/etc/apache2/mime.types
文件,添加如下两种类型:application/octet-stream ipa text/xml plist
打开iPhone或者iPad中的浏览器,输入web服务器地址:
https://192.168.2.112
,如果出现如下内容,说明服务器已搭建成功:
先点击ssl安装证书
安装相应的CA证书,然后在点击点击安装
进行app安装。
五、安装过程中可能遇到的问题及解决方案:
-
显示下载失败:
官方文档中指出三种原因:
1)请确定应用已正确进行签名。测试方法是使用 Apple Configurator 2 将它安装到设备上,然后查看是否发生错误。
2)请确定清单文件的链接是否正确,清单文件是否可供网络用户访问。
3)请确定 .ipa 文件(在清单文件中)的 URL 是否正确,并且该 .ipa 文件是否可供网络用户通过 HTTPS 访问。
-
无法连接到“192.168.3.112”:
1)是否先下载了CA证书
2)CA证书中的服务器与
<a href="itms-services://?action=download-manifest&url=https://192.168.3.112/manifest.plist">Install App</a>
中的url是否匹配,因为点击下载
时,iOS会使用下载下来的CA证书进行验证,只有验证通过才能进行下载安装。比如我就出现这个问题,CA证书中服务器是自己定义的域名,而manifest
中的url用的是IP地址。 -
无法下载应用程序 此时无法安装“XXX”:
1)我出现这个问题的原因是,没有提供Xcode打包时,manifest.plist中指定的两个image,将两个相应的image放到web服务器中后就可以下载安装了。
参考文章:
http://help.apple.com/deployment/ios/#/apda0e3426d7
http://www.jianshu.com/p/35ca63ec0d8e
http://www.jianshu.com/p/d006a34a343f