本文地址 <a >Jimliu寫字的地方</a> 歡迎到訪碱工!
原文地址: <a >How to set up stress-free SSL on an OS X development machine
Raw
</a>
在Web開發(fā)中降低復(fù)雜性(讀惹迮:壓力)的最佳方法之一是最小化您的開發(fā)和生產(chǎn)環(huán)境之間的差異恨诱。在嘗試在本地計算機和生產(chǎn)環(huán)境中統(tǒng)一SSL方法后,我找到了一個工作流程跋涣,使得協(xié)議在所有環(huán)境保持相同养距。
大多數(shù)工作流程做出以下妥協(xié):
在服務(wù)器環(huán)境使用https矾端,在開發(fā)環(huán)境使用http。
這是非常煩人的,因為它使環(huán)境不一致悼粮,并且協(xié)議選擇泄漏到堆棧拇泣。例如,當(dāng)使用cookie的安全標志時矮锈,Web應(yīng)用程序需要了解底層協(xié)議霉翔。如果你沒有得到這個,你的HTTP開發(fā)服務(wù)器將無法讀取它寫的cookies苞笨,或者更糟糕的是债朵,你的HTTPS生產(chǎn)服務(wù)器可以通過不安全的連接傳遞敏感的cookie。
在本地使用生產(chǎn)環(huán)境SSL證書
SSL憑證不應(yīng)輕易傳遞瀑凝,理想情況下應(yīng)僅存在于被認證的機器上序芦。此外,即使使用通配符證書粤咪,提出一個方案谚中,將開發(fā)主機和生產(chǎn)主機放在同一命名空間下有一些奇怪的情況(如果生產(chǎn)應(yīng)用程序是從myproject.com提供,開發(fā)應(yīng)用程序從哪里提供寥枝? )
完全放棄HTTPS
如果在2013年宪塔,這是沒錯的。
所以我的方法是分一下四步:
1.解決所有開發(fā)工作的頂級域名囊拜;
2.為每個項目創(chuàng)建通配符SSL證書某筐;
3.告訴OS X信任證書,避免HTTPS警告冠跷;
4.使用https南誊;
下面我們開始
如果你還沒有安裝homebrew那么請先安裝
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
解決域名解析到項目
將域名解析到本地最常用的方法是修改hosts,可是你卻需要給每一個你正在開發(fā)的項目添加一條解析記錄
先做一點小工作蜜托,我們就可以給我們所有的項目綁定域名而不去動我們的hosts抄囚。
<a >Dnsmasq</a>一個輕量級的DNS轉(zhuǎn)發(fā)器,可以幫我們完成這些工作橄务。
brew install dnsmasq
mkdir -pv $(brew --prefix)/etc
sudo cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
sudo mkdir -pv /etc/resolver
一旦安裝并運行幔托,我們需要選擇我們想要解決的TLD到我們的本地。 OS X保留.local TLD仪糖,許多開發(fā)人員使用.dev柑司,但我喜歡使用名稱作為TLD的想法,以便在同一項目的其他開發(fā)人員的上下文中更容易地推理我的本地環(huán)境锅劝。所以我要讓Dnsmasq在本地解析以我的OS X用戶ID結(jié)尾的所有主機(也稱為短名稱攒驰,以及在終端中鍵入whoami時得到的結(jié)果)。因為我的用戶id是jed故爵,這意味著從apple.jed到zebras.jed到apple.zebras.jed的一切將解析為127.0.0.1玻粪。
所有以下shell腳本假設(shè)您使用您的用戶標識作為您的頂級域名隅津,但感覺通過替換$(whoami)與您選擇的TLD相應(yīng)地更改它們。
echo "address=/.$(whoami)/127.0.0.1" | sudo tee -a $(brew --prefix)/etc/dnsmasq.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolver/$(whoami)
現(xiàn)在我們需要驗證我們安裝的Dnsmasq是否生效劲室。
cd /Applications
sleep 1 && open "http://some.domain.$(whoami):9520" &
python -m SimpleHTTPServer 9520
這應(yīng)該打開一瀏覽器伦仍,顯示您的應(yīng)用程序文件夾的內(nèi)容,如下所示:
不過如果出錯很洋,瀏覽器會告訴我們找不到DNS:
如果出現(xiàn)這種情況充蓝,我們需要去重啟機器,或者檢查我們的安裝步驟喉磁。
為每個項目創(chuàng)建通配符SSL證書
現(xiàn)在我們的DNS配置已經(jīng)生效谓苟,下一步就是為域名創(chuàng)建通配符證書。
首先协怒,我們創(chuàng)建一個與我們項目名稱相同的文件夾涝焙。
mkdir ~/Desktop/myproject && cd $_
接下來,讓我們創(chuàng)建一個臨時配置文件孕暇,使用openssl來創(chuàng)建我們的證書仑撞。
cat > openssl.cnf <<-EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = *.${PWD##*/}.$(whoami)
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.${PWD##*/}.$(whoami)
DNS.2 = ${PWD##*/}.$(whoami)
EOF
openssl req \
-new \
-newkey rsa:2048 \
-sha1 \
-days 3650 \
-nodes \
-x509 \
-keyout ssl.key \
-out ssl.crt \
-config openssl.cnf
rm openssl.cnf
現(xiàn)在我們在項目目錄中有兩個文件:ssl.key,用于簽名證書的私鑰和證書本身的ssl.crt妖滔。
到這時候我們已經(jīng)基本做完了配置本地https的所有工作隧哮,不過這里還有一個問題。
我們嘗試通過HTTPS從此域提供的任何內(nèi)容獲得IMMA-LET-YOU-FINISHed通過類似上面的可怕消息铛楣,警告我們所提供的證書不受信任近迁。這個消息因瀏覽器而異,您可能會想繼續(xù)前進簸州,忽略它,但這不是一個好習(xí)慣歧譬,而且很可能導(dǎo)致開發(fā)復(fù)雜性岸浑。
避免https警告,我們需要告訴OS X信任這個證書
由于我們的證書是自簽名的瑰步,因此當(dāng)我們的HTTPS網(wǎng)站使用它時矢洲,我們會收到警告。我們需要使用Keychain Access來告訴OS X缩焦。
1.在Keychain Access打開證書
open /Applications/Utilities/Keychain\ Access.app ssl.crt
2.點擊 Don't Trust.
3.選擇新導(dǎo)入的證書读虏,它應(yīng)顯示在證書列表的底部,然后單擊[i]按鈕.
4.在彈出窗口中袁滥,單擊信任左側(cè)的?按鈕盖桥,并選擇使用此證書時始終信任.
使用簡單的HTTPS
現(xiàn)在OS X知道我們的自簽名證書是合法的,讓我們啟動一個HTTPS服務(wù)器题翻,以確保一切正常揩徊。你可以使用Apache或Nginx或任何你喜歡的,但在這里我們將使用nodejs:
sleep 1 && open "https://myproject.$(whoami):8443" &
sleep 1 && open "https://subdomain.myproject.$(whoami):8443" &
node <<-EOF
var https = require("https")
var fs = require("fs")
var options = {
key: fs.readFileSync("ssl.key"),
cert: fs.readFileSync("ssl.crt")
}
var server = https.createServer(options, function(req, res) {
res.writeHead(200, {"Content-Type": "text/plain"})
res.end("It worked!\n")
})
server.listen(8443, console.log)
EOF
就像你看到的,頂級域名和子域名都生效塑荒。
請注意熄赡,這將滿足Chrome和Safari,但由于Firefox不會從OS X繼承相同的Keychain Access齿税,它會告訴你證書是不受信任的彼硫。在這種情況下,單擊我了解風(fēng)險凌箕,然后添加例外...拧篮,然后提示時確認安全異常。
完:)