HTTPS 原理與實(shí)現(xiàn)

HTTPS 簡(jiǎn)介

在日常互聯(lián)網(wǎng)瀏覽網(wǎng)頁(yè)時(shí),我們接觸到的大多都是 HTTP 協(xié)議,這種協(xié)議是未加密,即明文的。這使得 HTTP 協(xié)議在傳輸隱私數(shù)據(jù)時(shí)非常不安全。因此,瀏覽器鼻祖 Netscape 公司設(shè)計(jì)了 SSL(Secure Sockets Layer) 協(xié)議,用于對(duì) HTTP 協(xié)議傳輸進(jìn)行數(shù)據(jù)加密,即 HTTPS 。

HTTPS 和HTTP 協(xié)議相比提供了:

  • 數(shù)據(jù)完整性:內(nèi)容傳輸經(jīng)過(guò)完整性校驗(yàn)
  • 數(shù)據(jù)隱私性:內(nèi)容經(jīng)過(guò)對(duì)稱加密,每個(gè)連接生成一個(gè)唯一的加密密鑰
  • 身份認(rèn)證:第三方無(wú)法偽造服務(wù)端(客戶端)身份

SSL 目前版本是 3.0,之后升級(jí)為了 TLS(Transport Layer Security) 協(xié)議,TLS 目前為 1.2 版本。如未特別說(shuō)明,SSL 與 TLS 均指同一協(xié)議。

HTTPS 工作原理

網(wǎng)絡(luò)通信(握手過(guò)程)

此圖非常詳盡的描述了 HTTPS 在通訊過(guò)程中的原理,總共分為 8 步。

Https 原理
Https 原理

STEP 1: 客戶端發(fā)起HTTPS 請(qǐng)求

SSL 連接總是由客戶端啟動(dòng),在 SSL 會(huì)話開始時(shí),執(zhí)行 SSL 握手。用戶在瀏覽器里輸入一個(gè)https 網(wǎng)址,然后連接到server 的443 端口。
客戶端發(fā)送以下:

  • 列出客戶端密支持的加密方式列表(以客戶端首選項(xiàng)順序排序),如 SSL 的版本、客戶端支持的加密算法和客戶端支持的數(shù)據(jù)壓縮方法(Hash 算法)。
  • 包含 28 字節(jié)的隨機(jī)數(shù),client_random

以下是 Wireshark 抓包所得

Transmission Control Protocol, Src Port: 28258 (28258), Dst Port: 443 (443), Seq: 1, Ack: 1, Len: 517
    Source Port: 28258
    Destination Port: 443
    [Stream index: 13]
    [TCP Segment Len: 517]
    ......
Secure Sockets Layer
    TLSv1 Record Layer: Handshake Protocol: Client Hello
        // 握手記錄
        Content Type: Handshake (22)
        // 0x0301 可以看出 TLS 是基于 SSL 3.1 構(gòu)建而來(lái)
        Version: TLS 1.0 (0x0301)  
        Length: 512
        Handshake Protocol: Client Hello
            Handshake Type: Client Hello (1)
            Length: 508
            Version: TLS 1.2 (0x0303)
            Random
                GMT Unix Time: Jun 20, 2025 23:30:57.000000000 ?й???????
                // 28 字節(jié)隨機(jī)數(shù) client_random
                Random Bytes: 12154d457c935c162fb8c0062572a5f84639b06289c51bf2...
            Session ID Length: 32
            // 可能為空,如果之前登陸過(guò),則可以恢復(fù)之前的會(huì)話,避免一個(gè)完整的握手過(guò)程
            Session ID: c958100d8b678c0b071b54e977b456c06a233c08b9e2dd42...    
            Cipher Suites Length: 34
            // 密文族,列舉瀏覽器所支持的加密算法清單
            Cipher Suites (17 suites)    
                Cipher Suite: Unknown (0xcca9)
                Cipher Suite: Unknown (0xcca8)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc14)
                Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc13)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
                // 推薦使用
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)    
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
                Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
                Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)
                Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
                Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
                Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
            Compression Methods Length: 1
            Compression Methods (1 method)
                Compression Method: null (0)
            Extensions Length: 401
            Extension: renegotiation_info
                Type: renegotiation_info (0xff01)
                Length: 1
                Renegotiation Info extension
                    Renegotiation info extension length: 0
            Extension: server_name
                Type: server_name (0x0000)
                Length: 36
                Server Name Indication extension
                    Server Name list length: 34
                    Server Name Type: host_name (0)
                    Server Name length: 31
                    // 允許服務(wù)器對(duì)瀏覽器的請(qǐng)求授予相應(yīng)的證書。
                    Server Name: images-cn.ssl-images-amazon.com    
            Extension: Extended Master Secret
                Type: Extended Master Secret (0x0017)
                Length: 0
            Extension: SessionTicket TLS
                Type: SessionTicket TLS (0x0023)
                Length: 192
                Data (192 bytes)
            Extension: signature_algorithms
                Type: signature_algorithms (0x000d)
                Length: 18
                Signature Hash Algorithms Length: 16
                // Hash 算法,用于簽名
                Signature Hash Algorithms (8 algorithms)    
                    Signature Hash Algorithm: 0x0601
                        Signature Hash Algorithm Hash: SHA512 (6)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0603
                        Signature Hash Algorithm Hash: SHA512 (6)
                        Signature Hash Algorithm Signature: ECDSA (3)
                    Signature Hash Algorithm: 0x0501
                        Signature Hash Algorithm Hash: SHA384 (5)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0503
                        Signature Hash Algorithm Hash: SHA384 (5)
                        Signature Hash Algorithm Signature: ECDSA (3)
                    Signature Hash Algorithm: 0x0401
                        Signature Hash Algorithm Hash: SHA256 (4)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0403
                        Signature Hash Algorithm Hash: SHA256 (4)
                        Signature Hash Algorithm Signature: ECDSA (3)
                    Signature Hash Algorithm: 0x0201
                        Signature Hash Algorithm Hash: SHA1 (2)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0203
                        Signature Hash Algorithm Hash: SHA1 (2)
                        Signature Hash Algorithm Signature: ECDSA (3)
            Extension: status_request
                Type: status_request (0x0005)
                Length: 5
                Certificate Status Type: OCSP (1)
                Responder ID list Length: 0
                Request Extensions Length: 0
            Extension: signed_certificate_timestamp
                Type: signed_certificate_timestamp (0x0012)
                Length: 0
                Data (0 bytes)
            Extension: Application Layer Protocol Negotiation
                Type: Application Layer Protocol Negotiation (0x0010)
                Length: 14
                ALPN Extension Length: 12
                ALPN Protocol
                    ALPN string length: 2
                    ALPN Next Protocol: h2
                    ALPN string length: 8
                    ALPN Next Protocol: http/1.1
            Extension: channel_id
                Type: channel_id (0x7550)
                Length: 0
                Data (0 bytes)
            Extension: ec_point_formats
                Type: ec_point_formats (0x000b)
                Length: 2
                EC point formats Length: 1
                Elliptic curves point formats (1)
                    EC point format: uncompressed (0)
            Extension: elliptic_curves
                Type: elliptic_curves (0x000a)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic curves (3 curves)
                    Elliptic curve: Unknown (0x001d)
                    Elliptic curve: secp256r1 (0x0017)
                    Elliptic curve: secp384r1 (0x0018)
            Extension: Padding
                Type: Padding (0x0015)
                Length: 77
                Padding Data: 000000000000000000000000000000000000000000000000...
                    Padding length: 0
                    Padding Data: <MISSING>

STEP 2: 服務(wù)端的配置

采用HTTPS 協(xié)議的服務(wù)器必須要有一套數(shù)字證書,可以自己制作,也可以向組織申請(qǐng)。區(qū)別就是自己頒發(fā)的證書需要客戶端驗(yàn)證通過(guò),才可以繼續(xù)訪問(wèn),而使用受信任的公司申請(qǐng)的證書則不會(huì)彈出提示頁(yè)面。這套證書其實(shí)就是一對(duì)公鑰和私鑰。
** 如果對(duì)公鑰和私鑰不太理解,可以想象成一把鑰匙和一個(gè)鎖頭,只是全世界只有你一個(gè)人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個(gè)鎖把重要的東西鎖起來(lái),然后發(fā)給你,因?yàn)橹挥心阋粋€(gè)人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來(lái)的東西。** 客戶端和服務(wù)器至少必須支持一個(gè)公共密碼對(duì),否則握手失敗。服務(wù)器一般選擇最大的公共密碼對(duì)。

STEP 3: 傳送證書

服務(wù)器端返回以下:

  • 服務(wù)器端選出的一套加密算法和 Hash 算法
  • 服務(wù)器生成的隨機(jī)數(shù) server_random
  • SSL 數(shù)字證書(服務(wù)器使用帶有 SSLX.509 V3 數(shù)字證書),這個(gè)證書包含網(wǎng)站地址,公鑰 public_key ,證書的頒發(fā)機(jī)構(gòu),過(guò)期時(shí)間等等。
Transmission Control Protocol, Src Port: 443 (443), Dst Port: 28258 (28258), Seq: 1, Ack: 518, Len: 137
    Source Port: 443
    Destination Port: 28258
    [Stream index: 13]
    [TCP Segment Len: 137]
    Sequence number: 1    (relative sequence number)
    [Next sequence number: 138    (relative sequence number)]
    Acknowledgment number: 518    (relative ack number)
    Header Length: 20 bytes
    Flags: 0x018 (PSH, ACK)
    ......
Secure Sockets Layer
    TLSv1 Record Layer: Handshake Protocol: Server Hello
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 81
        Handshake Protocol: Server Hello
            Handshake Type: Server Hello (2)
            Length: 77
            Version: TLS 1.0 (0x0301)
            Random
                GMT Unix Time: Mar  1, 2090 17:07:25.000000000 ?й???????
                // 28 字節(jié)的隨機(jī)數(shù) server_random
                Random Bytes: 903945ed14db8e4151d651814ed7067c0e9c115d94ff6af7...    
            Session ID Length: 32
            Session ID: c958100d8b678c0b071b54e977b456c06a233c08b9e2dd42...
            // 加密族中,服務(wù)器最終選擇了這個(gè)。意味著服務(wù)器之后會(huì)使用 RSA 公鑰加密算法來(lái)區(qū)分證書簽名和交換密鑰,通過(guò) 3DES 加密算法來(lái)加密數(shù)據(jù),通過(guò) SHA 算法來(lái)校驗(yàn)信息
            Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)    
            Compression Method: null (0)
            Extensions Length: 5
            Extension: renegotiation_info
                Type: renegotiation_info (0xff01)
                Length: 1
                Renegotiation Info extension
                    Renegotiation info extension length: 0
    TLSv1 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
        Content Type: Change Cipher Spec (20)
        Version: TLS 1.0 (0x0301)
        Length: 1
        Change Cipher Spec Message
            [Expert Info (Note/Sequence): This session reuses previously negotiated keys (Session resumption)]
                [This session reuses previously negotiated keys (Session resumption)]
                [Severity level: Note]
                [Group: Sequence]
    TLSv1 Record Layer: Handshake Protocol: Encrypted Handshake Message
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 40
        Handshake Protocol: Encrypted Handshake Message

STEP 4: 客戶端解析證書

這部分工作是由客戶端的TLS 來(lái)完成的。

  1. 首先會(huì)驗(yàn)證證書是否有效,這是對(duì)服務(wù)端的一種認(rèn)證,比如頒發(fā)機(jī)構(gòu),過(guò)期時(shí)間等等,如果發(fā)現(xiàn)異常,則會(huì)彈出一個(gè)警告框,提示證書存在問(wèn)題。
  2. 如果證書沒(méi)有問(wèn)題,那么瀏覽器根據(jù)步驟 3 的 server_random 生成一個(gè)隨機(jī)值 premaster_secret (前 2 個(gè)字節(jié)是協(xié)議版本號(hào),后 46 字節(jié)是用在對(duì)稱加密密鑰的隨機(jī)數(shù)字)和 master_secret 。 master_secret 的生成需要 premaster_key ,并需要 client_randomserver_random 作為種子
    master_secret = PRF(pre_master_secret, "master secret", client_random + server_random)
    
    現(xiàn)在,各方面已經(jīng)有了主密鑰 master_secret ,根據(jù)協(xié)議約定,我們需要利用PRF 生成這個(gè)會(huì)話中所需要的各種密鑰,稱之為“密鑰塊”(Key Block ):
    key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);
    密鑰塊用于構(gòu)成以下密鑰:
    client_write_MAC_secret[SecurityParameters.hash_size]
    server_write_MAC_secret[SecurityParameters.hash_size]
    client_write_key[SecurityParameters.key_material_length]
    server_write_key[SecurityParameters.key_material_length]
    client_write_IV[SecurityParameters.IV_size]
    server_write_IV[SecurityParameters.IV_size]
    
    這是由系列 Hash 值組成,它將作為數(shù)據(jù)加解密相關(guān)的Key Material ,包含六部分內(nèi)容,分別是用于校驗(yàn)一致性的密鑰,用于對(duì)稱內(nèi)容加解密的密鑰,以及初始化向量,客戶端和服務(wù)器端各一份。其中,write MAC key ,就是session secret 或者說(shuō)是session keyClient write MAC key 是客戶端發(fā)數(shù)據(jù)的session secretServer write MAC secret 是服務(wù)端發(fā)送數(shù)據(jù)的session keyMAC(Message Authentication Code) ,是一個(gè)數(shù)字簽名,用來(lái)驗(yàn)證數(shù)據(jù)的完整性,可以檢測(cè)到數(shù)據(jù)是否被串改。然后用證書公鑰 public_key 對(duì)該隨機(jī)值進(jìn)行加密。就好像上面說(shuō)的,把隨機(jī)值用鎖頭鎖起來(lái),這樣除非有鑰匙,不然看不到被鎖住的內(nèi)容。
  3. Hash 握手信息,用第3步返回約定好的 Hash 算法對(duì)握手信息取 Hash 值,然后用隨機(jī)數(shù)加密“握手消息+握手消息 Hash 值(簽名)”

STEP 5: 傳送加密信息

客戶端發(fā)送以下:

  • 客戶端發(fā)送公鑰 public_key 加密的 premaster secret 。目的就是讓服務(wù)端得到這個(gè)隨機(jī)值,以后客戶端和服務(wù)端的通信就可以通過(guò)這個(gè)隨機(jī)值來(lái)進(jìn)行加密解密了。

STEP 6: 服務(wù)端解密信息

服務(wù)端用私鑰 private_key 解密后,得到了客戶端傳過(guò)來(lái)的隨機(jī)值 premaster_secret(私鑰),又由于服務(wù)器在步驟 1 中收到的 client_random ,所以服務(wù)器根據(jù)相同的生成算法,在相同輸入?yún)?shù)的情況下,得到相同的 master_secret 。然后把內(nèi)容通過(guò)該值進(jìn)行對(duì)稱加密。
所謂對(duì)稱加密就是,將信息和私鑰通過(guò)某種算法混合在一起,這樣除非知道私鑰,不然無(wú)法獲取內(nèi)容,而正好客戶端和服務(wù)端都知道這個(gè)私鑰,所以只要加密算法夠彪悍,私鑰夠復(fù)雜,數(shù)據(jù)就夠安全。

STEP 7: 傳輸加密后的信息

服務(wù)器端返回以下:
將被 premaster_key 對(duì)稱加密的信息返回客戶端,客戶端可還原

STEP 8: 客戶端解密信息

客戶端用之前生成的私鑰解密服務(wù)段傳過(guò)來(lái)的信息,于是獲取了解密后的內(nèi)容。整個(gè)過(guò)程第三方即使監(jiān)聽到了數(shù)據(jù),也束手無(wú)策。

SSL/TLS

TCP/IP協(xié)議棧中TLS各子協(xié)議和HTTP的關(guān)系
TCP/IP協(xié)議棧中TLS各子協(xié)議和HTTP的關(guān)系

HTTPS 可以認(rèn)為是 HTTP + TLS。TLS 是傳輸層加密協(xié)議TLS 協(xié)議本身又是由 record 協(xié)議傳輸?shù)模瑀ecord 協(xié)議的格式如下圖


general-format-of-all-TLS-records
general-format-of-all-TLS-records

TLS 協(xié)議主要有五種類型 Content Type:
Content types

Hex Dec Type
0x14 20 加密消息確認(rèn)協(xié)議 ChangeCipherSpec
0x15 21 報(bào)警協(xié)議 Alert
0x16 22 握手協(xié)議 Handshake
0x17 23 應(yīng)用數(shù)據(jù)層協(xié)議 Application
0x18 24 心跳協(xié)議 Heartbeat

加密方式

加密算法一般分為對(duì)稱加密與非對(duì)稱加密。

對(duì)稱加密

客戶端與服務(wù)器使用相同的密鑰對(duì)消息進(jìn)行加密
優(yōu)點(diǎn):

  • 加密強(qiáng)度高,很難被破解
  • 計(jì)算量小,僅為非對(duì)稱加密計(jì)算量的 0.1%

缺點(diǎn):

  • 無(wú)法安全的生成和管理密鑰
  • 服務(wù)器管理大量客戶端密鑰復(fù)雜

非對(duì)稱加密

非對(duì)稱指加密與解密的密鑰為兩種密鑰。服務(wù)器提供公鑰,客戶端通過(guò)公鑰對(duì)消息進(jìn)行加密,并由服務(wù)器端的私鑰對(duì)密文進(jìn)行解密。

優(yōu)點(diǎn):安全

缺點(diǎn)

  • 性能低下,CPU 計(jì)算資源消耗巨大,一次完全的 TLS 握手,密鑰交換時(shí)的非對(duì)稱加密解密占了整個(gè)握手過(guò)程的 90% 以上。而對(duì)稱加密的計(jì)算量只相當(dāng)于非對(duì)稱加密的 0.1%,因此如果對(duì)應(yīng)用層使用非對(duì)稱加密,性能開銷過(guò)大,無(wú)法承受。
  • 非對(duì)稱加密對(duì)加密內(nèi)容長(zhǎng)度有限制,不能超過(guò)公鑰的長(zhǎng)度。比如現(xiàn)在常用的公鑰長(zhǎng)度是 2048 位,意味著被加密消息內(nèi)容不能超過(guò) 256 字節(jié)。

HTTPS 下的加密

HTTPS一般使用的加密與HASH算法如下:

  • 非對(duì)稱加密算法:RSADSA/DSS
  • 對(duì)稱加密算法:AESRC43DES
  • HASH算法:MD5SHA1SHA256

其中非對(duì)稱加密算法用于在握手過(guò)程中加密生成的密碼,對(duì)稱加密算法用于對(duì)真正傳輸?shù)臄?shù)據(jù)進(jìn)行加密,而HASH算法用于驗(yàn)證數(shù)據(jù)的完整性。由于瀏覽器生成的密碼是整個(gè)數(shù)據(jù)加密的關(guān)鍵,因此在傳輸?shù)臅r(shí)候使用了非對(duì)稱加密算法對(duì)其加密。非對(duì)稱加密算法會(huì)生成公鑰和私鑰,公鑰只能用于加密數(shù)據(jù),因此可以隨意傳輸,而網(wǎng)站的私鑰用于對(duì)數(shù)據(jù)進(jìn)行解密,所以網(wǎng)站都會(huì)非常小心的保管自己的私鑰,防止泄漏。
TLS握手過(guò)程中如果有任何錯(cuò)誤,都會(huì)使加密連接斷開,從而阻止了隱私信息的傳輸。正是由于HTTPS非常的安全,攻擊者無(wú)法從中找到下手的地方,于是更多的是采用了假證書的手法來(lái)欺騙客戶端,從而獲取明文的信息,但是這些手段都可以被識(shí)別出來(lái)

關(guān)于證書

證書需要申請(qǐng),并由專門的數(shù)字證書認(rèn)證機(jī)構(gòu) CA 通過(guò)非常嚴(yán)格的審核之后頒發(fā)的電子證書,證書是對(duì)服務(wù)器端的一種認(rèn)證。頒發(fā)的證書同時(shí)會(huì)產(chǎn)生一個(gè)私鑰和公鑰。私鑰有服務(wù)器自己保存,不可泄露,公鑰則附帶在證書的信息中,可以公開。證書本身也附帶一個(gè)證書的電子簽名,這個(gè)簽名用來(lái)驗(yàn)證證書的完整性和真實(shí)性,防止證書被篡改。此外證書還有個(gè)有效期。
證書包含以下信息:

  • 使用者的公鑰值。
  • 使用者標(biāo)識(shí)信息(如名稱和電子郵件地址)。
  • 有效期(證書的有效時(shí)間)。
  • 頒發(fā)者標(biāo)識(shí)信息。
  • 頒發(fā)者的數(shù)字簽名,用來(lái)證明使用者的公鑰和使用者的標(biāo)識(shí)符信息之間的綁定的有效性。

參考資料

[1] Wiki 關(guān)于 Transport Layer Security 的介紹,https://en.wikipedia.org/wiki/Transport_Layer_Security
[2] 大型網(wǎng)站的 HTTPS 實(shí)踐(一)—— HTTPS 協(xié)議和原理 http://op.baidu.com/2015/04/https-s01a01/
[3] SSL工作原理 https://www.wosign.cn/Basic/howsslwork.htm
[4] SSL/TLS協(xié)議運(yùn)行機(jī)制的概述 http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
[5] HTTPS工作原理,貓尾博客,https://cattail.me/tech/2015/11/30/how-https-works.html
[6] HTTPS那些事(一)HTTPS原理,曉風(fēng)殘?jiān)拢?a target="_blank" rel="nofollow">http://www.guokr.com/post/114121/
[7] HTTPS證書生成原理和部署細(xì)節(jié),小胡子哥,http://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容