溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何基于Mac OS和Linux進(jìn)行HTTP/2工具及應(yīng)用

發(fā)布時(shí)間:2021-12-27 14:35:21 來(lái)源:億速云 閱讀:223 作者:柒染 欄目:云計(jì)算

今天就跟大家聊聊有關(guān)如何基于Mac OS和Linux進(jìn)行HTTP/2工具及應(yīng)用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

由于不同環(huán)境過(guò)于復(fù)雜,下面僅基于Mac OS和Linux來(lái)講解工具及應(yīng)用。

一.HTTP/2環(huán)境搭建所需軟件概覽

需要安裝的軟件為(Mac用戶請(qǐng)使用homebrew來(lái)安裝,括號(hào)里都是Mac的安裝方式)

  • curl (brew install nghttp2 —with-nghttp2)
    Linux安裝
    wget https://curl.haxx.se/download/curl-7.48.0.tar.gz
    tar xvf curl-7.48.0.tar.gz && cd curl-7.48.0
    然后輸入以下命令,exit一次再進(jìn)入然后版本是7.48就成功了:

    $ ./configure --with-nghttp2=/usr/local --with-ssl
    $ make
    $ sudo make install
    $ ldconfig
    $ usr/local/bin/curl -V


  • nghttp2 (brew install nghttp2)
    安裝網(wǎng)址

    sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \
    zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \
    libjemalloc-dev cython python3-dev python-setuptools


    上面是安裝依賴,之后就可以編譯了:

    $ autoreconf -i
    $ automake
    $ autoconf
    $ ./configure
    $ make
    $ sudo make install
    nginx (brew install nginx —devel)


  • nginx (brew install nginx —devel)
    Linux安裝
    vim到/etc/apt/sources.list
    增加以下兩行,其中$codename自行去該網(wǎng)站查詢,比如Ubuntu 14.04 是 trusty;

    deb http://nginx.org/packages/mainline/ubuntu/ $codename nginx
    deb-src http://nginx.org/packages/mainline/ubuntu/ $codename nginx


    然后sudo apt-get update && sudo apt-get install nginx就可以裝最新支持HTTP2的nginx啦;

  • apache (brew install httpd24 —with-http2)[本文重點(diǎn)講解nginx]
    Linux安裝

    二.證書

    1.自簽發(fā)

    打開(kāi)提供的Demo文件,terminal打開(kāi)/keys路徑,輸入./ca.sh http2test.com,也可以生成其他域名或泛域名(.xx.com).注意:也可以不用生成證書,直接使用keys文件下提供的http2test.com證書;
    Let’s Encrypt
    打開(kāi)Let’s Encrypt的官網(wǎng),這里講解如果已經(jīng)啟動(dòng)nginx的情況下,如何簽發(fā)證書。
    步驟:

  • 首先需要把代碼克隆下來(lái):git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt

  • 然后./letsencrypt-auto --help會(huì)執(zhí)行一些初始化工作,并且顯示支持的命令;

  • 比如我的web目錄在~/www下,此步驟需要已搭建好服務(wù)器,并且可以通過(guò)example.com訪問(wèn)~/www里的內(nèi)容,如果是動(dòng)態(tài)網(wǎng)站,需要在nginx層設(shè)置一個(gè)映射,將/.well-known/acme-challenge映射到剛設(shè)置好的目錄,也就是~/www。

    location /.well-known/acme-challenge {   
    root /home/$username/www;
    }


  • (需要nginx已經(jīng)裝好,沒(méi)裝好的完成下面的nginx部分后再回來(lái)設(shè)置)那么./letsencrypt-auto certonly --webroot -w ~/www -d example.com,example.com是你希望申請(qǐng)證書的域名,然后證書下發(fā)成功。

  • 然后在nginx中設(shè)置證書信息

    ssl_certificate      /etc/letsencrypt/live/$example.com/fullchain.pem;  
    ssl_certificate_key  /etc/letsencrypt/live/$example.com/privkey.pem;


  • 然后sudo nginx -t && sudo nginx -s reload就可以看到啦

三、基本工具

  • curl
    curl的基本用法是:
    curl -v -o /dev/null --http2 http://nghttp2.org
    這里輸入的是HTTP而不是HTTPS是因?yàn)?,這里會(huì)采用HTTP2的ClearText模式,使用101 改變協(xié)議協(xié)商升級(jí)為HTTP2協(xié)議。

Connected to nghttp2.org (106.186.112.116) port 80 (#0)> GET / HTTP/1.1> Host: nghttp2.org
> User-Agent: curl/7.48.0> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h3c
> HTTP2-Settings: AAMAAABkAAQAAP__>
< HTTP/1.1 101 Switching Protocols
< Connection: Upgrade
< Upgrade: h3c
* Received 101* Using HTTP2, server supports multi-use* Connection state changed (HTTP/2 confirmed)
* TCP_NODELAY set
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=21* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2.0 200< date:Sun, 10 Apr 2016 16:52:43 GMT
< content-type:text/html
< content-length:6646< last-modified:Sun, 03 Apr 2016 06:53:14 GMT
< etag:"5700bdda-19f6"< link:</stylesheets/screen.css>; rel=preload; as=stylesheet
< accept-ranges:bytes
< x-backend-header-rtt:0.000625< server:nghttpx nghttp2/1.10.0-DEV
< via:2 nghttpx
< x-frame-options:SAMEORIGIN
< x-xss-protection:1; mode=block
< x-content-type-options:nosniff
<

現(xiàn)在的大多數(shù)網(wǎng)站,都是通過(guò)302跳轉(zhuǎn)到HTTPS網(wǎng)站來(lái)協(xié)商升級(jí)的,例如我廠的QQ郵箱;

Connected to mail.qq.com (183.60.15.162) port 80 (#0)
> GET / HTTP/1.1
> Host: mail.qq.com> User-Agent: curl/7.48.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h3c
> HTTP2-Settings: AAMAAABkAAQAAP__>
< 
HTTP/1.1 302 Found
< Server: TWS
< Connection: close
< Date: Sun, 10 Apr 2016 16:58:48 GMT
< Content-Type: text/html; charset=GB18030
< Location: https://mail.qq.com/cgi-bin/loginpage
< Content-Length: 0
<
  • nghttp
    官方文檔,安裝nghttp2后有配套的nghttp 客戶端、nghttpd 服務(wù)器、nghttpx 反向代理、h3load 負(fù)載測(cè)試等工具。
    輸入命令nghttp -nv https://nghttp2.org(n代表不輸出,v代表詳細(xì)信息):
    結(jié)果列出了連接過(guò)程中的HTTP2各個(gè)Stream信息,例如SETTINGS Frame,HEADER Frame等,也可以帶上參數(shù):

[  0.170] Connected
The negotiated protocol: h3
[  0.732] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
          (dep_stream_id=0, weight=201, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
          (dep_stream_id=0, weight=101, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
          (dep_stream_id=0, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
          (dep_stream_id=7, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
          (dep_stream_id=3, weight=1, exclusive=0)
[  0.732] send HEADERS frame <length=36, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: https
          :authority: nghttp2.org
          accept: */*
          accept-encoding: gzip, deflate
          user-agent: nghttp2/1.9.1
[  0.891] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.891] recv (stream_id=13) :method: GET
[  0.891] recv (stream_id=13) :scheme: https
[  0.892] recv (stream_id=13) :path: /stylesheets/screen.css
[  0.892] recv (stream_id=13) :authority: nghttp2.org
[  0.892] recv (stream_id=13) accept-encoding: gzip, deflate
[  0.892] recv (stream_id=13) user-agent: nghttp2/1.9.1
[  0.892] recv PUSH_PROMISE frame <length=47, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0, promised_stream_id=2)
[  0.892] recv (stream_id=13) :status: 200
[  0.892] recv (stream_id=13) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.892] recv (stream_id=13) content-type: text/html
[  0.892] recv (stream_id=13) content-length: 6646
[  0.892] recv (stream_id=13) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.892] recv (stream_id=13) etag: "5700bdda-19f6"
[  0.892] recv (stream_id=13) link: </stylesheets/screen.css>; rel=preload; as=stylesheet
[  0.892] recv (stream_id=13) accept-ranges: bytes
[  0.892] recv (stream_id=13) x-backend-header-rtt: 0.000663
[  0.892] recv (stream_id=13) strict-transport-security: max-age=31536000
[  0.892] recv (stream_id=13) server: nghttpx nghttp2/1.10.0-DEV
[  0.892] recv (stream_id=13) via: 2 nghttpx
[  0.892] recv (stream_id=13) x-frame-options: SAMEORIGIN
[  0.892] recv (stream_id=13) x-xss-protection: 1; mode=block
[  0.892] recv (stream_id=13) x-content-type-options: nosniff
[  0.892] recv HEADERS frame <length=266, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0)
          ; First response header
[  0.893] recv DATA frame <length=6646, flags=0x01, stream_id=13>
          ; END_STREAM
[  0.893] recv (stream_id=2) :status: 200
[  0.893] recv (stream_id=2) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.893] recv (stream_id=2) content-type: text/css
[  0.893] recv (stream_id=2) content-length: 39082
[  0.893] recv (stream_id=2) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.893] recv (stream_id=2) etag: "5700bdda-98aa"
[  0.893] recv (stream_id=2) accept-ranges: bytes
[  0.893] recv (stream_id=2) x-backend-header-rtt: 0.000427
[  0.893] recv (stream_id=2) strict-transport-security: max-age=31536000
[  0.893] recv (stream_id=2) server: nghttpx nghttp2/1.10.0-DEV
[  0.893] recv (stream_id=2) via: 2 nghttpx
[  0.893] recv (stream_id=2) x-frame-options: SAMEORIGIN
[  0.893] recv (stream_id=2) x-xss-protection: 1; mode=block
[  0.893] recv (stream_id=2) x-content-type-options: nosniff
[  0.893] recv (stream_id=2) x-http2-push: 1
[  0.893] recv HEADERS frame <length=62, flags=0x04, stream_id=2>
          ; END_HEADERS
          (padlen=0)
          ; First push response header
[  1.407] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.563] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
          (window_size_increment=33412)
[  1.740] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.741] recv DATA frame <length=6314, flags=0x01, stream_id=2>
          ; END_STREAM
[  1.741] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
          (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])

[  0.170] Connected
The negotiated protocol: h3
[  0.732] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
          (dep_stream_id=0, weight=201, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
          (dep_stream_id=0, weight=101, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
          (dep_stream_id=0, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
          (dep_stream_id=7, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
          (dep_stream_id=3, weight=1, exclusive=0)
[  0.732] send HEADERS frame <length=36, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: https
          :authority: nghttp2.org
          accept: */*
          accept-encoding: gzip, deflate
          user-agent: nghttp2/1.9.1
[  0.891] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.891] recv (stream_id=13) :method: GET
[  0.891] recv (stream_id=13) :scheme: https
[  0.892] recv (stream_id=13) :path: /stylesheets/screen.css
[  0.892] recv (stream_id=13) :authority: nghttp2.org
[  0.892] recv (stream_id=13) accept-encoding: gzip, deflate
[  0.892] recv (stream_id=13) user-agent: nghttp2/1.9.1
[  0.892] recv PUSH_PROMISE frame <length=47, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0, promised_stream_id=2)
[  0.892] recv (stream_id=13) :status: 200
[  0.892] recv (stream_id=13) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.892] recv (stream_id=13) content-type: text/html
[  0.892] recv (stream_id=13) content-length: 6646
[  0.892] recv (stream_id=13) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.892] recv (stream_id=13) etag: "5700bdda-19f6"
[  0.892] recv (stream_id=13) link: </stylesheets/screen.css>; rel=preload; as=stylesheet
[  0.892] recv (stream_id=13) accept-ranges: bytes
[  0.892] recv (stream_id=13) x-backend-header-rtt: 0.000663
[  0.892] recv (stream_id=13) strict-transport-security: max-age=31536000
[  0.892] recv (stream_id=13) server: nghttpx nghttp2/1.10.0-DEV
[  0.892] recv (stream_id=13) via: 2 nghttpx
[  0.892] recv (stream_id=13) x-frame-options: SAMEORIGIN
[  0.892] recv (stream_id=13) x-xss-protection: 1; mode=block
[  0.892] recv (stream_id=13) x-content-type-options: nosniff
[  0.892] recv HEADERS frame <length=266, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0)
          ; First response header
[  0.893] recv DATA frame <length=6646, flags=0x01, stream_id=13>
          ; END_STREAM
[  0.893] recv (stream_id=2) :status: 200
[  0.893] recv (stream_id=2) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.893] recv (stream_id=2) content-type: text/css
[  0.893] recv (stream_id=2) content-length: 39082
[  0.893] recv (stream_id=2) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.893] recv (stream_id=2) etag: "5700bdda-98aa"
[  0.893] recv (stream_id=2) accept-ranges: bytes
[  0.893] recv (stream_id=2) x-backend-header-rtt: 0.000427
[  0.893] recv (stream_id=2) strict-transport-security: max-age=31536000
[  0.893] recv (stream_id=2) server: nghttpx nghttp2/1.10.0-DEV
[  0.893] recv (stream_id=2) via: 2 nghttpx
[  0.893] recv (stream_id=2) x-frame-options: SAMEORIGIN
[  0.893] recv (stream_id=2) x-xss-protection: 1; mode=block
[  0.893] recv (stream_id=2) x-content-type-options: nosniff
[  0.893] recv (stream_id=2) x-http2-push: 1
[  0.893] recv HEADERS frame <length=62, flags=0x04, stream_id=2>
          ; END_HEADERS
          (padlen=0)
          ; First push response header
[  1.407] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.563] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
          (window_size_increment=33412)
[  1.740] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.741] recv DATA frame <length=6314, flags=0x01, stream_id=2>
          ; END_STREAM
[  1.741] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
          (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])

還有這些參數(shù):

-v : 顯示詳細(xì)信息
-n : 不輸出請(qǐng)求返回?cái)?shù)據(jù)內(nèi)容
-t : 請(qǐng)求超時(shí)設(shè)置
-w : 設(shè)置初始窗口大小
-a : 解析頁(yè)面獲取頁(yè)面上的資源
-H : 給請(qǐng)求增加特定頭部信息,例如: -H':method:PUT'-p: 設(shè)置請(qǐng)求權(quán)重 
--no-dep : 不發(fā)送依賴信息
  • nghttpd
    官方文檔,使用nghttpd,可以架設(shè)一個(gè)簡(jiǎn)易的支持HTTP2的服務(wù)器。打開(kāi)附件中的示例文件,在路徑demos/nghttp/里有一個(gè)run.sh(需要以管理員權(quán)限執(zhí)行)

    $ cd demos/nghttp
    $ sudo ./run.sh [server-push]

    就可以執(zhí)行提供的shell腳本,第三個(gè)參數(shù)server-push是可選的,如果不需要server-push功能,直接sudo ./run.sh就可以了,在本地設(shè)置好host 127.0.0.1 http2test.com后,就可以在本地瀏覽器中訪問(wèn)了,路徑是https://http2test.com/examples/dashboard/。由于自簽的證書不被信任,需要安裝公鑰keys/*.crt文件并信任(Mac中需要打開(kāi)keychain這個(gè)軟件,然后找到剛安裝的證書,改為總是信任),安裝信任后,打開(kāi)Chrome就不會(huì)提示警告了;
    如果需要開(kāi)啟server-push功能,輸入指令sudo ./run.sh server-push,shell腳本里設(shè)置了-p/examples/dashboard/=/examples/dashboard/d3.js,當(dāng)請(qǐng)求路徑/examples/dashboard/時(shí),就推送/examples/dashboard/d3.js文件。

四、服務(wù)器準(zhǔn)備

  • nginx
    nginx的conf文件里的設(shè)置,設(shè)置完后需要sudo nginx -s reload,由于nginx的ngx_http_v2_module模塊是替代以前的ngx_http_spdy_module,故開(kāi)啟HTTP2支持后,就無(wú)法同時(shí)開(kāi)啟SPDY支持:

    server {        
    listen       443 ssl http2;        
    server_name  http2test.com; 
    
    ssl_certificate      $證書地址;        
    ssl_certificate_key  $證書私鑰地址;  
    
    ssl_session_cache    shared:SSL:1m;        
    ssl_session_timeout  5m; 
    
    ssl_ciphers  HIGH:!aNULL:!MD5;        
    ssl_prefer_server_ciphers  on;   
    
    location / {            
    root   $靜態(tài)文件地址;            
    index  index.html index.htm;
        }
    }


  • h3o
    這里引入下Server Push的概念,在上一篇概念篇有介紹道,Server Push就是,當(dāng)請(qǐng)求時(shí),服務(wù)器同時(shí)將其它文件也推送過(guò)來(lái),HTTP2的說(shuō)明中,并沒(méi)有規(guī)定Server Push具體的實(shí)現(xiàn)策略,這個(gè)可由服務(wù)器和客戶端自主決定:

  • Jetty:jetty通過(guò)referrer建立了一個(gè)依賴模型,該模型可以應(yīng)用在CDN里,方便配置;

  • h3o:通過(guò)Cookie實(shí)現(xiàn)了cache aware server push——可感知緩存的服務(wù)器推送。第一次推送時(shí),服務(wù)器端set-cookie,將要推送的路徑+etag存入一個(gè)集合,通過(guò)算法生產(chǎn)指紋編碼為base64存入cookie,之后通過(guò)cookie來(lái)判斷是否需要推送該文件;
    這里著重介紹h3o,為什么h3o要這么做呢?因?yàn)榱髁烤褪清X啊。。??蛻舳私邮盏椒?wù)器端發(fā)送的PUSHPROMISE Frame后,可以通過(guò)是否發(fā)送RST Frame來(lái)拒絕掉服務(wù)器推送的文件,但是在這個(gè)過(guò)程中,服務(wù)器推送的文件可能已經(jīng)發(fā)送一部分過(guò)來(lái)了,如果客戶端決定不接收服務(wù)器推送的文件,那么之前發(fā)送的部分就是浪費(fèi)掉的流量,h3o就是為了解決這個(gè)問(wèn)題;在設(shè)置好h3o后,我們來(lái)看看第一次訪問(wèn)的結(jié)果:

    讓我們來(lái)看看第二次訪問(wèn)的結(jié)果:

    可以看到,第二次訪問(wèn)時(shí),并沒(méi)有PUSHPROMISE Frame了,也就是說(shuō),服務(wù)器不再推送文件了。

五.開(kāi)發(fā)準(zhǔn)備

  • wireshark
    這里講解基本的wireshark使用,由于大多數(shù)的HTTP2都是基于Over TLS版,也就是需要解密才能看到正確的HTTP2包內(nèi)容;wireshark提供了兩個(gè)方式:
    使用SSLKEYLOGFILE,使得wireshark可以使用Firefox/Chrome的解密信息
    首先在wireshark的Preferences -> Protocol -> SSL配置一個(gè)可讀的文件地址,然后在環(huán)境變量,例如Mac是~/.bashprofile

    export SSLKEYLOGFILE=$剛配置的地址
    source     ~/.bashprofile


    通過(guò)Terminal打開(kāi)Firefox或Chrome,這樣才能使用環(huán)境變量SSLKEYLOGFILE
    open -a Google\ Chrome
    該方法的局限是,只能在電腦上抓包使用,并且只能使用Chrome和Firefox;
    還有一個(gè)方法是配置RSA私鑰,不過(guò)這種辦法的局限是多種加密方式不支持,并且該方法必須紀(jì)錄完整的TLS握手過(guò)程,所以建議打開(kāi)瀏覽器訪問(wèn)前就已經(jīng)開(kāi)始監(jiān)聽(tīng);
    配置好解密方式后,使用瀏覽器打開(kāi)剛跑起來(lái)的HTTP2 Demo,https://http2test.com/examples/dashboard/,然后再篩選出輸入http2并回車,就可以看到篩選的HTTP2包。

  • fiddler
    fiddler解密HTTPS采用的是中間人攻擊的方法,客戶端訪問(wèn)到fiddler代理服務(wù)器,然后fiddler代理服務(wù)器再模擬客戶端訪問(wèn)到網(wǎng)站。那么,需要安裝Fiddler的根認(rèn)證證書,同時(shí)啟用HTTPS解密功能。

    對(duì)于Fiddler來(lái)說(shuō),對(duì)于每個(gè)機(jī)器其實(shí)下發(fā)的其實(shí)是不同的根證書,所以,一定要通過(guò)Fiddler的配置網(wǎng)頁(yè)來(lái)安裝證書(配置代理后,打開(kāi)網(wǎng)站http://ipv4.fiddler:8888,然后點(diǎn)擊圖中的FiddlerRoot Certificate來(lái)下載安裝)

    針對(duì)iOS及部分高版本的Android,證書中的部分信息是必要的,有兩個(gè)辦法。
    (1) 采用如圖所示的設(shè)置(iOS 9親測(cè)可用),
    (2) 安裝使用Fiddler CertMaker插件
    然后需要介紹的一個(gè)點(diǎn)是FiddlerScript,這是一個(gè)很強(qiáng)大的功能。如果需要將以前調(diào)試HTTP的方法在HTTPS同樣適用,需要有這些設(shè)置。,然后之后我也會(huì)繼續(xù)更新Fiddler調(diào)試部分的內(nèi)容,請(qǐng)收藏哦。在Willow的rule里設(shè)置HTTPS -> HTTP; HTTPS -> File; 都是可以生效的。
    如果需要HTTPS -> HTTPS 或者 HTTPS -> HTTP,可以采用上面鏈接的方法,也可以設(shè)置oSession["x-replywithtunnel"] = "FakeTunnel"。

    if (oSession.HostnameIs("app.yourdomain.com"))
    {    // Handle CONNECT Tunnels
    if (oSession.HTTPMethodIs("CONNECT"))
    {
        oSession["x-replywithtunnel"] = "FakeTunnel";        return;
    }
    
    oSession.fullUrl = "http://somedomain:someport" + oSession.PathAndQuery;
    }


六.SSL/TLS部分小貼士

1.活用證書,提高性能

首先來(lái)看本地搭建的HTTPS服務(wù):

第一個(gè)情況是,同一個(gè)IP,但是域名不同,同時(shí),使用的證書也不同:第一張圖顯示的域名是http2test.com,第二張圖顯示的域名是http2.icese7en.com,他們使用的證書也是不同的,可以看到TCP Stream這一列,具有不同的序號(hào)(相同序號(hào)表明他們使用的是同一個(gè)TCP連接)

第二個(gè)情況是,同一個(gè)IP,域名不同,但是使用的證書是相同的:第一張圖的域名是cdn1.http2test.com,第二張圖的域名是cdn2.http2test.com,他們使用的證書(第三張圖)是泛域名*.http2test.com,他們的TCP Stream序號(hào)都是30,復(fù)用同一條TCP連接



那么,如果域名不同,甚至都不是子域名的方式,也可以通過(guò)這一個(gè)點(diǎn)去優(yōu)化嗎?是可以的,通過(guò)證書里的subjectAltName,我們可以在證書里管理多個(gè)不同域名,例如google的證書:

不過(guò)這樣證書很貴就是了 - -

2.SSL/TLS提高安全

HSTS——HTTP嚴(yán)格傳輸協(xié)議
HSTS主要是為了改善以下幾個(gè)問(wèn)題:

  • 沒(méi)辦法知道一個(gè)網(wǎng)站是否支持TLS:例如第一次連接時(shí),如果沒(méi)有指定協(xié)議名,會(huì)優(yōu)先采用http協(xié)議,有安全隱患。而開(kāi)啟HSTS后,第一次(之前訪問(wèn)過(guò)該域名)之后的訪問(wèn)瀏覽器會(huì)自動(dòng)強(qiáng)制使用HTTPS訪問(wèn);

  • 對(duì)證書問(wèn)題的寬容:未開(kāi)啟HSTS時(shí),如果證書有問(wèn)題,客戶端只會(huì)提示警告,而不是禁止訪問(wèn),開(kāi)啟HSTS后,會(huì)被禁止訪問(wèn);

  • mixed-content問(wèn)題:開(kāi)啟HSTS后,一個(gè)HTTPS頁(yè)面上的同域名下的非HTTPS資源會(huì)自動(dòng)升級(jí)為HTTPS訪問(wèn);

要開(kāi)啟HSTS,只需要服務(wù)器端在返回頭中返回(不支持IP)

Strict-Transport-Security: max-age=31536000 [; includeSubDomains] [; preload]
# includeSubDomains 可以開(kāi)啟子域名的HSTS功能# 不過(guò)需要評(píng)估這么做的是否會(huì)有負(fù)面影響

在max-age指定的時(shí)間內(nèi),瀏覽器都自動(dòng)以HTTPS訪問(wèn)。如果需要關(guān)閉HSTS,返回max-age=0就可以了。

注意

  • HSTS的第一次訪問(wèn)仍然具有被挾持的危險(xiǎn),可通過(guò)HSTS preload來(lái)減輕影響(需要申請(qǐng)加入各瀏覽器的preload-list);

  • HSTS時(shí)間是基于本地時(shí)間計(jì)算的,如果客戶端時(shí)間被篡改,可能會(huì)造成HSTS策略被失效繞過(guò)。

  • 引用自關(guān)于啟用 HTTPS 的一些經(jīng)驗(yàn)分享(一)

    只要你不能確保永遠(yuǎn)提供 HTTPS 服務(wù),就不要啟用。因?yàn)橐坏?HSTS 生效,你再想把網(wǎng)站重定向?yàn)?HTTP,之前的老用戶會(huì)被無(wú)限重定向,唯一的辦法是換新域名

CSP——內(nèi)容安全政策
CSP是一個(gè)聲明式的安全機(jī)制,原本的目的是防止XSS跨站腳本攻擊。例如,CSP可以完全禁止內(nèi)聯(lián)的Javascript代碼的執(zhí)行,控制哪些外聯(lián)的Javascript文件可以被執(zhí)行。

Content-Security-Policy: default-src 'self'; img-src *; script-src scripts.example.com
上面的CSP策略是,默認(rèn)允許本源的資源的訪問(wèn),允許所有URL的圖片顯示,外鏈腳本只允許來(lái)自于scripts.example.com的文件執(zhí)行;

Content-Security-Policy: default-src https: 'unsafe-inline' 'unsafe-eval'; connect-src https:
上面的CSP策略是,默認(rèn)允許來(lái)自于任何URL的資源,只要它是安全的HTTPS,同時(shí)開(kāi)啟了內(nèi)聯(lián)JS和eval的執(zhí)行(默認(rèn)是被CSP禁止的),connect-src設(shè)定了Ajax請(qǐng)求只能請(qǐng)求HTTPS;(部分開(kāi)啟內(nèi)聯(lián)JS的執(zhí)行可參考Content Security Policy Level 2 介紹)

CSP上報(bào)
使用report-uri指令,違反CSP策略的行為都會(huì)被上報(bào)到該CGI

看完上述內(nèi)容,你們對(duì)如何基于Mac OS和Linux進(jìn)行HTTP/2工具及應(yīng)用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI