自建局域網 OTA 服務器

第一步 編輯前的準備

1.1 Mac自帶 Apache 服務器

Mac 自帶 Apache 服務器,咱們在終端輸入sudo apachectl -k start打開網頁輸入localhost,發現網頁會顯示以下:php

It works!

Apache 服務器啓動成功。html

1.2 修改系統文件前先備份

例如須要修改/etc/apache2文件夾下 http.conf 文件web

  1. 切換工做目錄下:

cd /etc/apache2shell

  1. 備份文件,只須要執行一次:

sudo cp httpd.conf httpd.conf.bakapache

  1. 若是操做出現錯誤!可使用命令,恢復備份的 httpd.conf 文件:

sudo cp httpd.conf.bak httpd.confvim

1.3 經過 Xcode 或者 vim 修改系統文件

經過 Xcode 修改比較簡單,將文件脫出到桌面一份,修改後拖回原來的文件夾覆蓋便可。瀏覽器

注意的是,在系統目錄下是不能夠直接用 Xcode 修改的,可將文件複製到桌面上,用 Xcode 打開修改,而後拖入系統目錄下覆蓋便可。bash

經過 vim 修改文件,可直接修改系統文件,修改比較方便。如下修改系統配置文件用到vim,若是不習慣使用vim修改,可以使用 Xcode 編輯修改。服務器

1.4 vim 簡單操做

  1. 例如當前目錄下有一個 httpd.conf 文件,須要修改第 100 行爲 abcdef。
  2. 輸入命令sudo vim httpd.conf
  3. 鼠標滾動或者按上下鍵光標移動到第 100 行,按 i 鍵進入編輯模式 將第 100 行內容刪除並替換爲 abcdef 。
  4. esc鍵退出編輯。
  5. 輸入:wq退出並保存;若是編輯錯誤輸入:q!不保存文件,強制退出vi。

2、配置Apache服務器Http服務

2.1 建立 web 文件夾

咱們在當前用戶根目錄下新建一個web文件夾,而後放入一些文件,如圖所示:網絡

web 文件夾

2.2 編輯 http.conf 文件

  1. 切換工做目錄下:cd /etc/apache2

  2. 備份文件:sudo cp httpd.conf httpd.conf.bak

  3. 用vim編輯httpd.conf文件:sudo vim httpd.conf

  4. 將下面路徑更改成你本身web網頁路徑(約245行)

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents」>

修改成我當前用戶目錄下創建的一個 web 文件夾

DocumentRoot "/Users/lf/web"
<Directory "/Users/lf/web」>
複製代碼
  1. 爲了便於瀏覽 web 文件夾,添加 Indexes 字段
Options FollowSymLinks Multiviews

修改成

Options Indexes FollowSymLinks Multiviews
複製代碼

修改httpd

  1. 將下面的#號註釋去掉,開啓PHP(約177行)
#LoadModule php7_module libexec/apache2/libphp7.so

修改成

LoadModule php7_module libexec/apache2/libphp7.so

較舊的系統爲(#LoadModule php5_module libexec/apache2/libphp5.so)
複製代碼

開啓PHP

  1. 而後按 ESC 鍵退出編輯,輸入:wq保存退出。

  2. 終端中輸入sudo apachectl -k restart重啓 Apache 服務器。

  3. 開啓 apache 服務器.打開瀏覽器,搜索框中輸入127.0.0.1或者localhost就能夠看到咱們以前添加的網絡資源。

開啓HTTP服務成功

2.3 Apache 經常使用操做命令

# 啓動 apache 服務器
sudo apachectl -k start
 # 從新啓動 apache 服務器
sudo apachectl -k restart
 # 關閉 apache 服務器
sudo apachectl -k stop
複製代碼

2.4 重啓時報錯

重啓的時候發現報錯,但不影響使用

ServerName錯誤

AH00558: httpd: Could not reliably determine the server's fully

qualified domain name, using LFdeMacBook-Pro.local. Set the

'ServerName' directive globally to suppress this message
複製代碼

若是想解決此報錯,可再次編輯 httpd.conf 文件

sudo vim httpd.conf

將下面的#號註釋去掉,並修改(約221行)

#ServerName www.example.com:80

修改成

ServerName localhost:80
複製代碼

而後終端輸入下面指令重啓便可。

sudo apachectl -k restart
複製代碼

3、生成 Apache 服務器 Https 服務用的自簽名證書

iOS7.1 之後, Apple 再也不支持 HTTP 方式的 OTA ,因此須要爲 Apache 開啓 HTTPS 服務,並利用 OpenSSL 製做自簽名證書。

3.1 生成服務器私鑰 server.key

sudo mkdir /private/etc/apache2/ssl 

cd /private/etc/apache2/ssl

sudo openssl genrsa -out server.key 1024
複製代碼

生成以下所示文件

服務器私鑰

3.2 生成簽署申請

sudo openssl req -new -key server.key -out server.csr
複製代碼

注意:須要完整填寫各項信息,注意Common Name必須是服務器 ip 或域名,其餘信息能夠隨意填寫。例如我須要把 ipa 安裝包放在 192.168.1.188 的內網服務器上,則Common Name就填寫 192.168.1.188 。若是這一步漏填信息,可能會致使最後生成的 ca 文件是空的。

生成server.csr

3.3 生成 CA 私鑰ca.crt

sudo openssl req  -new -x509 -days 365 -key server.key -out ca.crt
複製代碼

填寫信息和上面的填寫的同樣便可,注意Common Name必須填寫,這裏仍是填寫192.168.1.188便可。

生成ca.crt

3.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 保存便可。

3.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
複製代碼

修改完成後再執行命令

sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile server.key
複製代碼

會提示有效期和生成證書,都輸入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的證書請求被認證,提交?
複製代碼

此時咱們看到 HTTPS 證書已經生成完成。

證書列表

4、配置HTTPS服務

4.1 編輯 httpd.conf 文件

sudo vim /private/etc/apache2/httpd.conf
複製代碼

把如下四行代碼前頭的註釋去掉

LoadModule ssl_module libexec/apache2/mod_ssl.so

LoadModule socache_shmcb_module

libexec/apache2/mod_socache_shmcb.so

Include /private/etc/apache2/extra/httpd-ssl.conf

Include /private/etc/apache2/extra/httpd-vhosts.conf
複製代碼

注意:若是你的 httpd.conf 中缺乏了某行,你能夠自行添加進去便可。

4.2 編輯 httpd-ssl.conf 文件

編輯前先備份 httpd-ssl.conf 文件

cd /private/etc/apache2/extra/ && sudo cp httpd-ssl.conf httpd-ssl.conf.bak

sudo vim /private/etc/apache2/extra/httpd-ssl.conf
複製代碼

把如下兩行代碼的註釋去掉,並編輯爲你的證書路徑

SSLCertificateFile "/private/etc/apache2/server.crt"
SSLCertificateKeyFile "/private/etc/apache2/server.key"

而後修改路徑,改爲你的證書文件路徑

SSLCertificateFile "/private/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/private/etc/apache2/ssl/server.key"
複製代碼

4.3 編輯 httpd-vhosts.conf 文件

編輯前先備份 httpd-vhosts.conf 文件

cd /private/etc/apache2/extra/ && sudo cp httpd-vhosts.conf httpd-vhosts.conf.bak

sudo vim /private/etc/apache2/extra/httpd-vhosts.conf
複製代碼

將 <VirtualHost *:80> 中的第二個修改

<VirtualHost *:80>
    ServerAdmin 192.168.1.188
    DocumentRoot "/Users/lf/web"
    ServerName 192.168.1.188
    ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
    CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
</VirtualHost>
複製代碼

而後在文件末尾添加 443 端口服務

<VirtualHost *:443> 
    SSLEngine on 
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /private/etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /private/etc/apache2/ssl/server.key
    ServerName 192.168.1.188
    DocumentRoot "/Users/lf/web"
</VirtualHost>
複製代碼

注意:

  • SSLCertificateFile 填寫生成的 server.crt
  • SSLCertificateKeyFile 填寫生成的 server.key
  • ServerName 填寫你的 ip
  • DocumentRoot 填寫你的站點路徑

4.4 檢查 Apache 配置

sudo apachectl configtest
複製代碼

若是它提示:Syntax OK,那就完成90%了,若是它提示有錯,那就要根據錯誤提示自行解決了。

我在這個環節遇到了一個錯誤

SSLSessionCache: 'shmcb' session cachenot supported 
(known names: ). Maybe you need toload the appropriate
socache module (mod_socache_shmcb?).
複製代碼

解決辦法以下:

sudo vim /private/etc/apache2/httpd.conf
複製代碼

而後把如下代碼的註釋去掉

LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
複製代碼

去掉註釋後,保存,從新檢查配置,直到成功。

注意: 從網上查找的路徑多是LoadModule socache_shmcb_module modules/mod_socache_shmcb.so, 但個人配置文件中,路徑跟上述的不一致,但結尾都是mod_socache_shmcb.so就對了。

解決方案是參考這篇文章的stackoverflow問答

重啓 Apache 服務sudo apachectl -k restart, 這樣就能夠用 https 訪問本地服務器了。

5、放置資源文件

5.1 網站資源文件

以下圖所示,在/Users/lf/web文件夾下放置的資源以下:

資源文件夾

文件夾名稱可任意取,只要在 index.html 和 plist 文件夾中路徑對應便可。index.html 不要更名字,默認。

  • ca.crt CA證書,將/private/etc/apache2/ssl/ca.crt拷貝一份到當前 web 文件夾下
  • ipa 文件夾,放置 ipa 資源包
  • plist 文件夾,放置 plist 文件
  • index.html 索引網頁,放置連接下載安裝證書和ipa
  • images 文件夾,按照 Xcode 要求放置一個 57×57 和 512×512 的 png 圖片,還沒發現什麼用途。

5.2 放置 ipa 包

APP 打包,導出 ipa 包就不必多說了,能夠導出 Ad Hoc 或者 Development 的 ipa 包,將 ipa 放在放在 web 文件夾下 ipa 文件夾中。

5.3 放置plist文件

想在線安裝,還須要一個 plist 文件,每一個 ipa 包對應一個 plist 文件,將https://192.168.1.188/ipa/LFDev_4.2.1.ipa更改成生成證書時的 ip 或者域名,而後對應 ipa 文件路徑便可,例如這裏的路經是,在當前 web 文件夾下的 ipa 文件夾中,名稱爲 LFDev_4.2.1.ipa 的 ipa 文件。

plist 文件格式以下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>items</key>
   <array>
      <dict>
         <key>assets</key>
         <array>
            <dict>
               <key>kind</key>
               <string>software-package</string>
               <key>url</key>
               <string>https://192.168.1.188/ipa/LFDev_4.2.1.ipa</string>
            </dict>
            <dict>
               <key>kind</key>
               <string>display-image</string>
               <key>url</key>
               <string>https://192.168.1.188/images/image_57×57.png</string>
            </dict>
            <dict>
               <key>kind</key>
               <string>full-size-image</string>
               <key>url</key>
               <string>https://192.168.1.188/images/image_512×512.png</string>
            </dict>
         </array>
         <key>metadata</key>
         <dict>
            <key>bundle-identifier</key>
            <string>com.xxx.yyy</string>
            <key>bundle-version</key>
            <string>4.2.0</string>
            <key>kind</key>
            <string>software</string>
            <key>title</key>
            <string>Cxx</string>
         </dict>
      </dict>
   </array>
</dict>
</plist>
複製代碼
  • bundle-identifier的值com.xxx.yyy更改成你應用的Bundle ID
  • bundle-version的值4.2.0更改成你應用的版本version
  • title的值Cxx更改成你應用的名稱,下載時會彈出安裝提示此名稱

5.4 建立索引下載網頁 index.html

/Users/lf/web文件夾下還須要一個 index.html 文件, 手機首次使用 OTA 安裝,必須先下載安裝 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="https://192.168.1.188/ca.crt">👉點擊安裝SSL證書👈</a>
        <hr>
        <a href="itms-services://?action=download-manifest&url=https://192.168.1.188/plist/LFAdHoc_4.2.0.plist" class="app_link">👉點擊安裝4.2.0生產版本👈</a>
        <hr>
        <a href="itms-services://?action=download-manifest&url=https://192.168.1.188/plist/LFDev_4.2.1.plist" class="app_link">👉點擊安裝4.2.1開發版本👈</a>
        <hr>
        <a href="itms-services://?action=download-manifest&url=https://192.168.1.188/plist/LFVali_4.2.1.plist" class="app_link">👉點擊安裝4.2.1驗證版本👈</a>
        <hr>
    </body>
</html>
複製代碼

若是是想 ipa 放在局域網電腦上面,則將當作打包服務器的電腦 ip 手動設置固定 ip:192.168.1.188,而後手機和電腦鏈接同一個路由器,iphone 的 Safari 瀏覽器中輸入 192.168.1.188 或者 192.168.1.188/index.html 便可,點擊安裝 SSL 證書,而後點擊安裝 ipa 包。

5.5 iOS 10.3 後必須設置證書信任

若是下載 ipa 時出現沒法鏈接到192.168.*.*的錯誤,則須要手動設置信任。

iOS7.0 之後必須使用 HTTPS 進行,iOS 10 以前的設備,直接安裝自簽名根證書後就能夠安裝 iOS 應用,可是在 iOS 10.3 以上的設備上,安裝後還須要到「關於本機」那裏手動開啓信任。

蘋果官網提示,在 iOS 中信任手動安裝的證書描述文件 support.apple.com/zh-cn/HT204…

在 iOS 10.3 及更高版本中,手動安裝包含證書有效負載的描述文件時, 這個證書不會自動受 SSL 信任。 當安裝經過電子郵件發送或從網站下載的描述文件時, 您必須手動開啓受 SSL 信任。 要爲這個證書開啓受 SSL 信任, 請前往「設置」>「通用」>「關於本機」>「證書信任設置」。 在「針對根證書啓用徹底信任」下,開啓信任這個證書。

6、參考資料

http://stackoverflow.com/questions/20127138/apache-2-4-configuration-for-ssl-not-working

相關文章
相關標籤/搜索