8月份要把服務(wù)遷移到青云上赢笨,負責(zé)搭建 HTTPS 服務(wù)的Daniel苦惱兩天有余五鲫,配置 HTTPS 時一直報告下述問題:
400 Bad Request
The plain HTTP request was sent to HTTPS port
這是什么問題她紫?
這個問題是我們嘗試在云服務(wù)上搭建 HTTPS 時出現(xiàn)的祖今,要清楚復(fù)述這個問題有點復(fù)雜歧斟,各位直接移步看 stackoverflow 上的 Dealing with nginx 400 “The plain HTTP request was sent to HTTPS port” error 這個例子吧紧武,相信你會有很多收獲击你。
以下這段會幫助你理解其實質(zhì):
The error says it all actually. Your configuration tells Nginx to listen on port 80 (HTTP) and use SSL. When you point your browser to http://localhost, it tries to connect via HTTP. Since Nginx expects SSL, it complains with the error.
HTTPS是什么舞丛?
HTTPS: HTTP over TLS, HTTP over SSL, and HTTP Secure.
簡單地說耘子,HTTPS 就是在一條由 SSL/TLS 加密的連接(connection)上傳輸HTTP數(shù)據(jù),目的是防止HTTP內(nèi)容被偷聽和篡改球切。
換言之谷誓,HTTPS在一個不安全的網(wǎng)絡(luò)上創(chuàng)建了一個安全通道。
HTTP數(shù)據(jù)有一個加密和解密的過程吨凑。理解了這一點你就理解了在云上配置的兩種方案捍歪。
我們應(yīng)用HTTPS做什么?
無他鸵钝,就是為了防止內(nèi)容被篡改糙臼。
nginx的配置
一定要熟悉nginx的配置,否則恩商,你會到處亂搜解決方法变逃,不是懷疑這兒配錯了,就是懷疑那兒配錯了怠堪。
搭建負載均衡器
有兩個方案可以實現(xiàn)HTTPS服務(wù)揽乱。方案一就是由負載均衡器(LB = Load Balancer)來實現(xiàn),方案二由后端WebServer來實現(xiàn)粟矿。
方案一:LB實現(xiàn)
請按照青云的 搭建 HTTPS 協(xié)議的負載均衡器指南 的要求進行 HTTPS 協(xié)議搭建凰棉。因為我們使用路由器,情況有些許不同陌粹,要點:
- LB配置HTTPS
將你的服務(wù)器證書的“證書內(nèi)容” 和 “私鑰”配好撒犀,監(jiān)聽HTTPS協(xié)議,443端口掏秩。 - 路由器配置
在路由器上將443映射到后端的80端口(HTTP)或舞。 - 后端nginx配置
這里只需要配置HTTP服務(wù)即可,因為解密數(shù)據(jù)的任務(wù)由LB承擔(dān)了蒙幻,這里自然不需要配置HTTPS了嚷那。
注:Daniel就是折在這里了,他在路由器里將443映射到后端的443 ssl杆煞,路由器過來的數(shù)據(jù)已經(jīng)解密了魏宽,已經(jīng)是plain HTTP request,還要發(fā)送到HTTPS port(443)上决乎,當(dāng)然就會 complain with the error了队询。
方案二:后端WebServer實現(xiàn)
- LB配置TCP
監(jiān)聽TCP協(xié)議,443端口构诚。 - 路由器配置
在路由器上將443映射到后端的443端口(HTTPS)蚌斩。 - 后端nginx配置
按照標準的HTTPS服務(wù)進行配置。如下:
server {
listen 80;
listen 443 ssl;
server_name c.example.com;
ssl_certificate /usr/local/nginx/conf/app/example/example.crt;
ssl_certificate_key /usr/local/nginx/conf/app/example/example.key;
root /home/app/c.example.com/;
location ~ \.(htm|html)$ {
add_header Cache-Control no-store;
expires -1;
}
location / {
index index.html;
}
access_log /home/logs/c.example.com/access.log access;
error_log /home/logs/c.example.com/error.log info;
}
相對于“原始的nginx配置”的改進:
- 80和443在一個 server 里面即可(保持簡單性范嘱、一致性)送膳。
- index里的index.php刪除员魏,因為網(wǎng)站根本不提供php服務(wù)。(不該有的東西一點都不要有叠聋,保持簡單撕阎、簡潔)
- 順序調(diào)整(增強可理解性)。
附:原始的nginx配置
建議
- 請記住盡可能使用谷歌搜索服務(wù)碌补。
- 優(yōu)先查閱以下網(wǎng)站:
為何使用https虏束?
我們使用https的初心是防止HTTP內(nèi)容被篡改,因為做正常CPS業(yè)務(wù)的導(dǎo)航網(wǎng)站常遇到被流氓推廣者強行篡改內(nèi)容從而劫持流量進行跳轉(zhuǎn)的情況厦章。
跳轉(zhuǎn)地址:http://c.example.com => https://c.example.com镇匀。
協(xié)議切換
-
zz
js 負責(zé)跳轉(zhuǎn),js 文件中類似語句https://c.example.com/shopid.html?uid=袜啃,其中https即指明使用https協(xié)議汗侵。js文件位于www網(wǎng)站/$version/toolbar/js/toolbar.js。當(dāng)前3.7和3.9版本在正常維護群发。
-
sm
由軟件提供跳轉(zhuǎn)晰韵,需要修改配置文件 unionmap.xml,軟件重啟后會下載該配置文件的 zip 包(2015-09-07)也物。該配置文件在 http://click.example.com/admin 后臺的商城管理下生成宫屠,當(dāng)下僅點擊生成新的商城聯(lián)盟映射表即可列疗,其他無需操作滑蚯。
注:由于幾經(jīng)演變,事先需修改 db_cashback 的 t_u_union 表:update t_u_union set un_px_url=replace(un_px_url,'https','http'); 而無需通過后臺頁面功能修改任何內(nèi)容抵栈。
-
unionmap.xml.sample