項(xiàng)目需求是:滿足測試人員在ios設(shè)備上切換應(yīng)用的新舊版本他去。
作為企業(yè)級(jí)應(yīng)用陨收,常見的分發(fā)方式是通過瀏覽器訪問plist文件。但這面臨一個(gè)最關(guān)鍵的問題:蘋果會(huì)驗(yàn)證存放plist的服務(wù)是否有正規(guī)CA頒發(fā)的SSL證書窝爪。
申請StartSSL證書
誠然顾画,第一反應(yīng)是去申請一個(gè)免費(fèi)的CA SSL證書,搜索一陣了解到StartCom是少數(shù)提供免費(fèi)證書的CA機(jī)構(gòu)巷帝。
于是筆者先在百度云購買了個(gè)便宜的域名忌卤,域名解析到內(nèi)網(wǎng)IP,然后用該域名去StartCom申請了個(gè)DV SSL證書楞泼,具體步驟參考Startssl 現(xiàn)在就啟用 HTTPS驰徊,免費(fèi)的笤闯!
申請速度很快,拿到證書后棍厂,筆者配置到內(nèi)網(wǎng)的Nginx代理颗味,具體配置暫時(shí)不表,因?yàn)榕渫臧l(fā)現(xiàn)瀏覽器顯示警告牺弹,并沒有按預(yù)期那樣有綠色小鎖浦马。點(diǎn)開瀏覽器詳細(xì)信息,發(fā)現(xiàn)瀏覽器不信任StartCom的中級(jí)證書(Chrome)张漂,筆者換成Safari捐韩,同樣不信任...
懷著疑惑調(diào)查一番,發(fā)現(xiàn)坑爹了..原來StartCom因?yàn)椴灰?guī)范操作鹃锈,16年9月后被Chrome、Safari瞧预、Mozilla等瀏覽器封殺(僅限未來一年頒發(fā)的免費(fèi)DV證書屎债,個(gè)中瓜葛似乎牽扯到360)。
其他證書機(jī)構(gòu)
- Lets Encrypt 垢油, 這是網(wǎng)上推薦最多的盆驹,但其頒發(fā)方式不適用我們這種內(nèi)網(wǎng)的服務(wù)器,只好作罷滩愁。
- 百度云躯喇, 因?yàn)槭孪仍诎俣仍谱粤擞蛎餍钥聪缕涮峁┑拿赓M(fèi)證書硝枉,然后就呵呵了廉丽,先是我注冊的pw后綴域名不被其合作CA機(jī)構(gòu)認(rèn)可,然后百度云只支持SSL證書部署在其云服務(wù)器上妻味,需30天后才允許導(dǎo)出正压。
- 騰訊云,騰訊云的免費(fèi)DV證書由TrustAsia提供责球,申請成功后可以導(dǎo)出焦履,但注冊域名的時(shí)候也需要注意是否被CA認(rèn)可。
自簽名證書
其實(shí)雏逾,一直是自己陷入了思維困境嘉裤,自以為plist文件必須放在有正規(guī)SSL證書的服務(wù)上,事實(shí)上栖博,如果ios設(shè)備里信任某個(gè)根證書屑宠,Safari自然會(huì)信任其簽發(fā)的其他證書,也就意味著笛匙,完全可以使用自簽發(fā)的證書去配置內(nèi)網(wǎng)服務(wù)侨把。
openssl生成證書
Mac OS自帶該模塊犀变,linux也可以下載openssl相應(yīng)模塊
-
openssl genrsa -des3 -out server.key 2048
, 生成私鑰 -
openssl req -new -key server.key -out server.csr
證書簽名請求, 需要依次輸入國家秋柄,地區(qū)获枝,城市,組織骇笔,組織單位省店,Common Name和Email。其中Common Name笨触,可以寫自己的名字或者域名懦傍,如果要支持https,Common Name應(yīng)該與域名保持一致芦劣,否則會(huì)引起瀏覽器警告粗俱。 -
cp server.key server.key.org
,openssl rsa -in server.key.org -out server.key
, 刪除私鑰中的密碼虚吟,在創(chuàng)建私鑰的過程中寸认,由于必須要指定一個(gè)密碼。而這個(gè)密碼會(huì)帶來一個(gè)副作用串慰,那就是在每次啟動(dòng)Nginx服務(wù)時(shí)偏塞,都會(huì)要求輸入密碼,這顯然非常不方便邦鲫。要?jiǎng)h除私鑰中的密碼 openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Nginx配置證書
具體Nginx環(huán)境搭建就不講了灸叼,記得編譯的時(shí)候加上http-ssl-module;
nginx.conf配置:
upstream nodejs {
server localhost:3100
}
server {
listen 8100 ssl;
ssl on;
server_name domainName
ssl_certificate path/to/server.crt
ssl_certificate_key path/to/server.key
location / {
proxy_pass http://localhost:3100;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /public {
root /usr/local/var/www;
}
}
我這里代理的是Nodejs服務(wù)器,ssl默認(rèn)端口是443庆捺,因內(nèi)網(wǎng)封了這個(gè)端口古今,所以隨便改了個(gè)其他不沖突的端口,server_name填你綁定的域名疼燥。
參考iOS適配HTTPS沧卢,創(chuàng)建一個(gè)自簽名的SSL證書(x509)具體步驟
設(shè)備安裝證書
設(shè)備未安裝證書前,Safari打開Nginx服務(wù)地址醉者,會(huì)彈出不信任的警告框但狭,并提供我們?nèi)齻€(gè)操作選擇,這時(shí)候撬即,不能點(diǎn)擊繼續(xù)并接受立磁。這種操作只是讓Safari添加一個(gè) SSL例外 :防止Safari對(duì)此站點(diǎn)做出的警告提示。實(shí)際上并不會(huì)將證書安裝到iOS中剥槐,以成為可信任的證書唱歧。同臺(tái)設(shè)備的其它程序在連接該站點(diǎn)時(shí)仍然會(huì)失敗。
筆者這里安裝證書采用郵件方式,具體可參考在iOS上使用自簽名的SSL證書
plist部署
Nginx代理的nodejs服務(wù)只負(fù)責(zé)接受每個(gè)應(yīng)用版本對(duì)應(yīng)的plist文件颅崩,具體的ipa還放在原h(huán)ttp服務(wù)器上几于,省去原服務(wù)端接口轉(zhuǎn)Https可能帶來的麻煩
p.s: plist中ipa的獲取路徑里最好不要包含中文字符,會(huì)出現(xiàn)無法安裝情況沿后。
后續(xù)
在使用自簽發(fā)證書不久沿彭,在騰訊云申請的證書下來了,(因?yàn)槲野哑脚_(tái)自動(dòng)生成的TXT解析記錄刪除了尖滚,導(dǎo)致審核一直沒過喉刘,這里夸下騰訊的服務(wù),對(duì)反饋的處理很快)漆弄。將Nginx之前配的自簽發(fā)證書替換為騰訊云提供的Nginx證書后睦裳,設(shè)備不安裝證書也可以直接獲取plist了~