自从升级了ios 7.1,原来使用http方式的ota已经不行了。苹果真是蛋疼。经过一天的摸索,终于搞定了!下面介绍具体步骤。[以下步骤在mac os x 10.9.3 环境测试通过]
1.打开 /etc/apache2/httpd.conf 取消掉Include /private/etc/apache2/extra/httpd-ssl.conf 前面的注释符号#
2. 生成自签名的CA证书和服务器证书
2.1 生成自签名的CA证书
cd /etc/apache2
sudo openssl genrsa -des3 -out myownca.key 2048
2.2 申请x509标准签署证书.(下面的步骤生成了有效期10年的CA证书文件myownca.crt,这个过程会让你填一些基本信息,国家城市,公司名,网站名等,因为是自签署,随便填就行了)
sudo openssl req -new -x509 -days 3650 -key myownca.key -out myownca.crt
2.3 现在有了CA证书了,就可以用它来为我们的网站颁发ssl证书了。同制作CA证书一样,生成server key和证书。 因为在默认情况下,/private/etc/apache2/extra/httpd-ssl.conf 已经配置好了key的名字和证书的名字,所以下面的步骤中请不要修改生成的key文件的名字,如果修改请把在extra/httpd-ssl.conf中相应的文件路径和名字也修改
sudo openssl genrsa -des3 -out server.key 2048
2.4 生成了密钥server.key后,根据它生成csr证书文件
运行下面命令,会让你填写一些基本信息, 这里面要注意了Common Name的值要和你的域名一致,否则后面客户端浏览器验证域名不正确通不过的。我填写的是192.168.x.xxx, 因此如果你的主机的局域网ip变了的话,就需要重新颁发下证书了。所以建议直接在路由或交换上把你的主机设置为固定ip.
sudo openssl req -new -key server.key -out server.csr
2.5下面就用CA证书来签署服务器证书了:
sudo openssl x509 -req -in server.csr -out server.crt -sha1 -CA myownca.crt -CAkey myownca.key -CAcreateserial -days 3650
3 部署到Apache
3.1 在生成server.key的过程中,可能对这个文件设置了密码,如果直接部署,那么以后启动apache的时候都要输入这个密码,但是一般我们都开机自动启动apache,手动启动多麻烦,可以把这个文件转换一下,省去输入密码步骤:
sudo cp server.key server.key.insecure
sudo openssl rsa -in server.key.insecure -out server.key
3.2 重启apache服务器
sudo apachectl restart
这样 https://localhost/ 这样就可以访问了(会报证书警告)。 如果用 https://localhost:443 会被自动跳转到 https://localhost
因为这里CA证书使我们自己创建的,在手机里面没有我们的根证书,用手机safari还是不能访问,需要通过邮件把该根证书myownca.crt发送到测试手机上, 测试手机必须通过iPhone自带的Mail客户端接收该邮件并点击该证书myownca.crt进行安装。安装或者删除证书时提示输入的密码为手机解锁密码。
1.打开 /etc/apache2/httpd.conf 取消掉Include /private/etc/apache2/extra/httpd-ssl.conf 前面的注释符号#
2. 生成自签名的CA证书和服务器证书
2.1 生成自签名的CA证书
cd /etc/apache2
sudo openssl genrsa -des3 -out myownca.key 2048
2.2 申请x509标准签署证书.(下面的步骤生成了有效期10年的CA证书文件myownca.crt,这个过程会让你填一些基本信息,国家城市,公司名,网站名等,因为是自签署,随便填就行了)
sudo openssl req -new -x509 -days 3650 -key myownca.key -out myownca.crt
2.3 现在有了CA证书了,就可以用它来为我们的网站颁发ssl证书了。同制作CA证书一样,生成server key和证书。 因为在默认情况下,/private/etc/apache2/extra/httpd-ssl.conf 已经配置好了key的名字和证书的名字,所以下面的步骤中请不要修改生成的key文件的名字,如果修改请把在extra/httpd-ssl.conf中相应的文件路径和名字也修改
sudo openssl genrsa -des3 -out server.key 2048
2.4 生成了密钥server.key后,根据它生成csr证书文件
运行下面命令,会让你填写一些基本信息, 这里面要注意了Common Name的值要和你的域名一致,否则后面客户端浏览器验证域名不正确通不过的。我填写的是192.168.x.xxx, 因此如果你的主机的局域网ip变了的话,就需要重新颁发下证书了。所以建议直接在路由或交换上把你的主机设置为固定ip.
sudo openssl req -new -key server.key -out server.csr
2.5下面就用CA证书来签署服务器证书了:
sudo openssl x509 -req -in server.csr -out server.crt -sha1 -CA myownca.crt -CAkey myownca.key -CAcreateserial -days 3650
3 部署到Apache
3.1 在生成server.key的过程中,可能对这个文件设置了密码,如果直接部署,那么以后启动apache的时候都要输入这个密码,但是一般我们都开机自动启动apache,手动启动多麻烦,可以把这个文件转换一下,省去输入密码步骤:
sudo cp server.key server.key.insecure
sudo openssl rsa -in server.key.insecure -out server.key
3.2 重启apache服务器
sudo apachectl restart
这样 https://localhost/ 这样就可以访问了(会报证书警告)。 如果用 https://localhost:443 会被自动跳转到 https://localhost
如果在手机上的safari访问我们的服务器 https://192.168.x.xxx,会有一个框跳出来‘Cann't Verify Server Identify’,此时一定要点cancel。否则safari就会把这个网站加入到一个ssl异常列表,即便是你的ssl证书有问题,下一次你访问这个站点,safari也不会发出警告,只有General->Reset-Reset All settings来重置IpHone了。。
因为这里CA证书使我们自己创建的,在手机里面没有我们的根证书,用手机safari还是不能访问,需要通过邮件把该根证书myownca.crt发送到测试手机上, 测试手机必须通过iPhone自带的Mail客户端接收该邮件并点击该证书myownca.crt进行安装。安装或者删除证书时提示输入的密码为手机解锁密码。
4. Export adhoc 版的ipa
创建Adhoc Discribution Provision Profile,并勾选相应的手机udid。然后在Xcode导出ipa时勾选Save for Enterprise Distribution并填写如下信息
Application URL:https://192.168.x.xx/xx/xx.ipa
Title: XXXX
根据目录里的文件自动创建adhoc app下载列表的php代码:
记得替换192.168.x.xx为你自己的ip:
<html>
<head>
<style type="text/css">
html,body {
padding: 0;
margin: 0;
width: 100%;
height: 100%;
font-family: Helvetica;
border: 0px solid red;
}
h1 {
margin-top: 20px;
text-align: center;
}
#apps_container {
width: 90%;
margin: 0 auto;
border: 0px solid blue;
}
#apps_container table {
border: 1px solid green;
border-radius: 10px;
width: 100%;
}
#apps_container td {
border-top:1px solid green;
}
.app_title_container {
margin-left: 20px;
margin-right: 2px;
margin-top: 25px;
margin-bottom: 25px;
line-height: 30px;
font-size: 30px;
font-weight: bold;
}
.app_install_button {
margin-left: 2px;
margin-right: 20px;
margin-top: 25px;
margin-bottom: 25px;
text-align: right;
line-height: 30px;
font-size: 30px;
}
</style>
</head>
<body>
<h1>Adhoc applications</h1>
<div id="apps_container">
<table cellspacing="0">
<?php
function getFileList( $dir )
{
$fileArray = array();
if( is_dir($dir) )
{
$handle = opendir($dir);
if( $handle )
{
while( ($file = readdir($handle)) )
{
if( $file != '.' && $file != '..' && $file != ".DS_Store")
{
array_push($fileArray, $file);
}
}
closedir( $handle );
}
}
return $fileArray;
}
$fileArray = getFileList(".");
$firstRow = true;
for ($i=0; $i < count($fileArray); $i++)
{
$fileName = $fileArray[$i];
if (stristr($fileName, ".plist"))
{
$extraStyle = "";
if ($firstRow) {
$extraStyle = ' style="border-width:0;" ';
$firstRow = false;
}
$install_link = '<a href="itms-services://?action=download-manifest&url=https://192.168.x.xx/ios/' . $fileName . '">';
$install_link = $install_link . "Install APP" . "</a>";
// Find a .plist file.
$appName = str_ireplace(".plist", ".ipa", $fileName);
echo "<tr>";
echo " <td " . $extraStyle . ">";
echo " <div class='app_title_container'>" . $appName . "</div>";
echo " </td>";
echo " <td " . $extraStyle . ">";
echo " <div class='app_install_button'>" . $install_link . "</div>";
echo " </td>";
echo "</tr>";
}
}
?>
</table>
</div>
</body>
</html>