了解https
HTTPS 是以安全為目標的 HTTP 通道,即 HTTP 下加入 SSL 加密層。HTTPS 不同於 HTTP 的端口,HTTP默認端口為80,HTTPS默認端口為443。
SSL 證書是一種數字證書,它使用 Secure Socket Layer
協議在瀏覽器和 Web 服務器之間建立一條安全通道,從而實現:
- 數據信息在客戶端和服務器之間的加密傳輸,保證雙方傳遞信息的安全性,不可被第三方竊聽;
- 用戶可以通過服務器證書驗證他所訪問的網站是否真實可靠。
獲取SSL證書
正式使用的話肯定是付錢由CA機構給頒發合法證書;部分CA機構也提供免費證書。
可申請的CA機構舉例:
1、阿里雲
2、StartSSL
具體申請步驟請自行查閱。
內部使用可以自己生成SSL證書(這個用戶訪問會提示證書無效或過期,存在安全隱患等等,內部人用直接信任繼續訪問即可使用),一般情況下用不到。
內部生成SSL證書步驟:
# 生成一個RSA密鑰
$ openssl genrsa -des3 -out ssltest.key 1024
# 拷貝一個不需要輸入密碼的密鑰文件
$ openssl rsa -in ssltest.key -out ssltest_nopass.key
# 生成一個證書請求
$ openssl req -new -key ssltest.key -out ssltest.csr
# 自己簽發證書
$ openssl x509 -req -days 365 -in ssltest.csr -signkey ssltest.key -out ssltest.crt
第3步是生成證書請求,會提示輸入省份、城市、域名信息等,重要的是,email一定要是你的域名后綴的。這樣就有一個 csr
文件了,提交給 ssl 提供商的時候就是這個 csr
文件。
當然我這里並沒有向證書提供商申請,而是在第4步自己簽發了證書。到這里證書就生成成功到目標目錄下,名字為ssltest.crt
,還有ssltest_nopass.key
,名字可以根據自己需要在生成的時候進行修改。
服務器啟用https
以nginx服務器示例。我們只需要在自己網站的配置文件nginx.conf中的server端增加以下配置;
listen 443 ssl;
# ssl on;
ssl_certificate /etc/nginx/ssltest.crt;
ssl_certificate_key /etc/nginx/ssltest_nopass.key;
完整示例:
server {
listen 443 ssl;
listen 80;
server_name 52fhy.com www.52fhy.com;
index index.php index.html index.htm;
root /www/52fhy.com/;
#ssl on;
ssl_certificate_key /usr/local/nginx/conf/52fhy.com.key;
ssl_certificate /usr/local/nginx/conf/1_52fhy.com_bundle.crt;
if ($scheme = http) {
# rewrite ^(.*)$ https://$host$1 permanent;
}
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
access_log /usr/local/nginx/log/access/52fhy.com.log;
}
注意:這個
ssl on
我本來是加上的,但是發現這樣http就不能訪問了,去掉后且listen 443 ssl
能同時支持http和https。listen 443 ssl
表示僅443端口使用ssl。
重啟之后網站就可以用https訪問啦,同時還支持http訪問。
常見問題
網頁引入的站外資源加載不了
例如頁面引入了百度地圖的資源,打開控制台發現使用https后加載不了,直接block了。
原因是覽器默認是不允許在 https 里面引用 http 資源的。
解決辦法是將http://
改成相對協議//
。具體使用方法為:
<img src="//domain.com/img/logo.png">
簡而言之,就是將URL的協議(http、https)去掉,只保留//
及后面的內容。這樣,在使用https的網站中,瀏覽器會通過https
請求URL,否則就通過http
發送請求。
當然,如果站外鏈接的資源不支持https還是加載不了的。這時候可以采用其它方法,如使用 iframe,或者使用nginx方向代理將https轉向http。
參考
1、圖解https協議 - - 博客頻道 - CSDN.NET
http://blog.csdn.net/yufaw/article/details/8515889
2、https 頁面中引入 http 資源的解決方式 - 大前端 - SegmentFault
https://segmentfault.com/a/1190000004200361?utm_source=Weibo