国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用了這么久,你真的真的明白HttpClient的實現原理了嗎?

開發 后端
HTTP是一個傳輸內容有可讀性的公開協議,客戶端與服務器端的數據完全通過明文傳輸。在這個背景之下,整個依賴于Http協議的互聯網數據都是透明的,這帶來了很大的數據安全隱患。

 一、背景

HTTP是一個傳輸內容有可讀性的公開協議,客戶端與服務器端的數據完全通過明文傳輸。在這個背景之下,整個依賴于Http協議的互聯網數據都是透明的,這帶來了很大的數據安全隱患。想要解決這個問題有兩個思路:

  1.  C/S端各自負責,即客戶端與服務端使用協商好的加密內容在Http上通信
  2.  C/S端不負責加解密,加解密交給通信協議本身解決

第一種在現實中的應用范圍其實比想象中的要廣泛一些。雙方線下交換密鑰,客戶端在發送的數據采用的已經是密文了,這個密文通過透明的Http協議在互聯網上傳輸。

服務端在接收到請求后,按照約定的方式解密獲得明文。這種內容就算被劫持了也不要緊,因為第三方不知道他們的加解密方法。然而這種做法太特殊了,客戶端與服務端都需要關心這個加解密特殊邏輯。

第二種C/S端可以不關心上面的特殊邏輯,他們認為發送與接收的都是明文,因為加解密這一部分已經被協議本身處理掉了。

從結果上看這兩種方案似乎沒有什么區別,但是從軟件工程師的角度看區別非常巨大。因為第一種需要業務系統自己開發響應的加解密功能,并且線下要交互密鑰,第二種沒有開發量。

HTTPS是當前最流行的HTTP的安全形式,由NetScape公司首創。在HTTPS中,URL都是以https://開頭,而不是http://。使用了HTTPS時,所有的HTTP的請求與響應在發送到網絡上之前都進行了加密,這是通過在SSL層實現的。

二、加密方法

通過SSL層對明文數據進行加密,然后放到互聯網上傳輸,這解決了HTTP協議原本的數據安全性問題。一般來說,對數據加密的方法分為對稱加密與非對稱加密。

2.1 對稱加密

對稱加密是指加密與解密使用同樣的密鑰,常見的算法有DES與AES等,算法時間與密鑰長度相關。

對稱密鑰最大的缺點是需要維護大量的對稱密鑰,并且需要線下交換。加入一個網絡中有n個實體,則需要n(n-1)個密鑰。

2.2 非對稱加密

非對稱加密是指基于公私鑰(public/private key)的加密方法,常見算法有RSA,一般而言加密速度慢于對稱加密。

對稱加密比非對稱加密多了一個步驟,即要獲得服務端公鑰,而不是各自維護的密鑰。

整個加密算法建立在一定的數論基礎上運算,達到的效果是,加密結果不可逆。即只有通過私鑰(private key)才能解密得到經由公鑰(public key)加密的密文。

在這種算法下,整個網絡中的密鑰數量大大降低,每個人只需要維護一對公司鑰即可。即n個實體的網絡中,密鑰個數是2n。

其缺點是運行速度慢。

2.3 混合加密

周星馳電影《食神》中有一個場景,黑社會火并,爭論撒尿蝦與牛丸的底盤劃分問題。食神說:“真是麻煩,摻在一起做成撒尿牛丸那,笨蛋!”

對稱加密的優點是速度快,缺點是需要交換密鑰。非對稱加密的優點是不需要交互密鑰,缺點是速度慢。干脆摻在一起用好了。

混合加密正是HTTPS協議使用的加密方式。先通過非對稱加密交換對稱密鑰,后通過對稱密鑰進行數據傳輸。

由于數據傳輸的量遠遠大于建立連接初期交換密鑰時使用非對稱加密的數據量,所以非對稱加密帶來的性能影響基本可以忽略,同時又提高了效率。

三、HTTPS握手

可以看到,在原HTTP協議的基礎上,HTTPS加入了安全層處理:

  1.  客戶端與服務端交換證書并驗證身份,現實中服務端很少驗證客戶端的證書
  2.  協商加密協議的版本與算法,這里可能出現版本不匹配導致失敗
  3.  協商對稱密鑰,這個過程使用非對稱加密進行
  4.  將HTTP發送的明文使用3中的密鑰,2中的加密算法加密得到密文
  5.  TCP層正常傳輸,對HTTPS無感知

四、HttpClient對HTTPS協議的支持

4.1 獲得SSL連接工廠以及域名校驗器

作為一名軟件工程師,我們關心的是“HTTPS協議”在代碼上是怎么實現的呢?探索HttpClient源碼的奧秘,一切都要從HttpClientBuilder開始。 

  1. public CloseableHttpClient build() {  
  2.         //省略部分代碼  
  3.         HttpClientConnectionManager connManagerCopy = this.connManager;  
  4.         //如果指定了連接池管理器則使用指定的,否則新建一個默認的  
  5.         if (connManagerCopy == null) {  
  6.             LayeredConnectionSocketFactory sslSocketFactoryCopy = this.sslSocketFactory;  
  7.             if (sslSocketFactoryCopy == null) {  
  8.                 //如果開啟了使用環境變量,https版本與密碼控件從環境變量中讀取  
  9.                 final String[] supportedProtocols = systemProperties ? split(  
  10.                         System.getProperty("https.protocols")) : null;  
  11.                 final String[] supportedCipherSuites = systemProperties ? split(  
  12.                         System.getProperty("https.cipherSuites")) : null;  
  13.                 //如果沒有指定,使用默認的域名驗證器,會根據ssl會話中服務端返回的證書來驗證與域名是否匹配  
  14.                 HostnameVerifier hostnameVerifierCopy = this.hostnameVerifier; 
  15.                  if (hostnameVerifierCopy == null) {  
  16.                     hostnameVerifierCopy = new DefaultHostnameVerifier(publicSuffixMatcherCopy);  
  17.                 }  
  18.                 //如果制定了SslContext則生成定制的SSL連接工廠,否則使用默認的連接工廠  
  19.                 if (sslContext != null) {  
  20.                     sslSocketFactoryCopy = new SSLConnectionSocketFactory(  
  21.                             sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifierCopy);  
  22.                 } else {  
  23.                     if (systemProperties) {  
  24.                         sslSocketFactoryCopy = new SSLConnectionSocketFactory(  
  25.                                 (SSLSocketFactory) SSLSocketFactory.getDefault(),  
  26.                                 supportedProtocols, supportedCipherSuites, hostnameVerifierCopy);  
  27.                     } else {  
  28.                         sslSocketFactoryCopy = new SSLConnectionSocketFactory(  
  29.                                 SSLContexts.createDefault(),  
  30.                                 hostnameVerifierCopy);  
  31.                     }  
  32.                 }  
  33.             }  
  34.             //將Ssl連接工廠注冊到連接池管理器中,當需要產生Https連接的時候,會根據上面的SSL連接工廠生產SSL連接  
  35.             @SuppressWarnings("resource")  
  36.             final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(  
  37.                     RegistryBuilder.<ConnectionSocketFactory>create()  
  38.                         .register("http", PlainConnectionSocketFactory.getSocketFactory())  
  39.                         .register("https", sslSocketFactoryCopy)  
  40.                         .build(),  
  41.                     null,  
  42.                     null,  
  43.                     dnsResolver,  
  44.                     connTimeToLive,  
  45.                     connTimeToLiveTimeUnit != null ? connTimeToLiveTimeUnit : TimeUnit.MILLISECONDS);  
  46.             //省略部分代碼  
  47.     }  

上面的代碼將一個Ssl連接工廠SSLConnectionSocketFactory創建,并注冊到了連接池管理器中,供之后生產Ssl連接使用。連接池的問題參考:http://www.cnblogs.com/kingszelda/p/8988505.html

這里在配置SSLConnectionSocketFactory時用到了幾個關鍵的組件,域名驗證器HostnameVerifier以及上下文SSLContext。

其中HostnameVerifier用來驗證服務端證書與域名是否匹配,有多種實現,DefaultHostnameVerifier采用的是默認的校驗規則,替代了之前版本中的BrowserCompatHostnameVerifier與StrictHostnameVerifier。NoopHostnameVerifier替代了AllowAllHostnameVerifier,采用的是不驗證域名的策略。

注意,這里有一些區別,BrowserCompatHostnameVerifier可以匹配多級子域名,"*.foo.com"可以匹配"a.b.foo.com"。StrictHostnameVerifier不能匹配多級子域名,只能到"a.foo.com"。

而4.4之后的HttpClient使用了新的DefaultHostnameVerifier替換了上面的兩種策略,只保留了一種嚴格策略及StrictHostnameVerifier。因為嚴格策略是IE6與JDK本身的策略,非嚴格策略是curl與firefox的策略。即默認的HttpClient實現是不支持多級子域名匹配策略的。

SSLContext存放的是和密鑰有關的關鍵信息,這部分與業務直接相關,非常重要,這個放在后面單獨分析。

4.2 如何獲得SSL連接

如何從連接池中獲得一個連接,這個過程之前的文章中有分析過,這里不做分析,參考連接:

http://www.cnblogs.com/kingszelda/p/8988505.html

在從連接池中獲得一個連接后,如果這個連接不處于establish狀態,就需要先建立連接。

DefaultHttpClientConnectionOperator部分的代碼為: 

  1. public void connect(  
  2.             final ManagedHttpClientConnection conn,  
  3.             final HttpHost host,  
  4.             final InetSocketAddress localAddress,  
  5.             final int connectTimeout,  
  6.             final SocketConfig socketConfig,  
  7.             final HttpContext context) throws IOException {  
  8.         //之前在HttpClientBuilder中register了http與https不同的連接池實現,這里lookup獲得Https的實現,即SSLConnectionSocketFactory   
  9.         final Lookup<ConnectionSocketFactory> registry = getSocketFactoryRegistry(context);  
  10.         final ConnectionSocketFactory sf = registry.lookup(host.getSchemeName());  
  11.         if (sf == null) {  
  12.             throw new UnsupportedSchemeException(host.getSchemeName() +  
  13.                     " protocol is not supported");  
  14.         }  
  15.         //如果是ip形式的地址可以直接使用,否則使用dns解析器解析得到域名對應的ip  
  16.         final InetAddress[] addresses = host.getAddress() != null ? 
  17.                  new InetAddress[] { host.getAddress() } : this.dnsResolver.resolve(host.getHostName());  
  18.         final int port = this.schemePortResolver.resolve(host);  
  19.         //一個域名可能對應多個Ip,按照順序嘗試連接  
  20.         for (int i = 0; i < addresses.length; i++) {  
  21.             final InetAddress address = addresses[i];  
  22.             final boolean last = i == addresses.length - 1;  
  23.             //這里只是生成一個socket,還并沒有連接  
  24.             Socket sock = sf.createSocket(context);  
  25.             //設置一些tcp層的參數 
  26.              sock.setSoTimeout(socketConfig.getSoTimeout());  
  27.             sock.setReuseAddress(socketConfig.isSoReuseAddress());  
  28.             sock.setTcpNoDelay(socketConfig.isTcpNoDelay());  
  29.             sock.setKeepAlive(socketConfig.isSoKeepAlive());  
  30.             if (socketConfig.getRcvBufSize() > 0) { 
  31.                  sock.setReceiveBufferSize(socketConfig.getRcvBufSize());  
  32.             }  
  33.             if (socketConfig.getSndBufSize() > 0) {  
  34.                 sock.setSendBufferSize(socketConfig.getSndBufSize());  
  35.             }  
  36.             final int linger = socketConfig.getSoLinger();  
  37.             if (linger >= 0) {  
  38.                 sock.setSoLinger(true, linger);  
  39.             }  
  40.             conn.bind(sock);  
  41.             final InetSocketAddress remoteAddress = new InetSocketAddress(address, port);  
  42.             if (this.log.isDebugEnabled()) {  
  43.                 this.log.debug("Connecting to " + remoteAddress);  
  44.             }  
  45.             try {  
  46.                 //通過SSLConnectionSocketFactory建立連接并綁定到conn上  
  47.                 sock = sf.connectSocket(  
  48.                         connectTimeout, sock, host, remoteAddress, localAddress, context);  
  49.                 conn.bind(sock);  
  50.                 if (this.log.isDebugEnabled()) {  
  51.                     this.log.debug("Connection established " + conn);  
  52.                 }  
  53.                 return;  
  54.             }   
  55.             //省略一些代碼  
  56.         }  
  57.     } 

在上面的代碼中,我們看到了是建立SSL連接之前的準備工作,這是通用流程,普通HTTP連接也一樣。SSL連接的特殊流程體現在哪里呢?

SSLConnectionSocketFactory部分源碼如下: 

  1. @Override  
  2.     public Socket connectSocket(  
  3.             final int connectTimeout,  
  4.             final Socket socket,  
  5.             final HttpHost host,  
  6.             final InetSocketAddress remoteAddress,  
  7.             final InetSocketAddress localAddress,  
  8.             final HttpContext context) throws IOException {  
  9.         Args.notNull(host, "HTTP host");  
  10.         Args.notNull(remoteAddress, "Remote address");  
  11.         final Socket sock = socket != null ? socket : createSocket(context);  
  12.         if (localAddress != null) {  
  13.             sock.bind(localAddress);  
  14.         }  
  15.         try {  
  16.             if (connectTimeout > 0 && sock.getSoTimeout() == 0) {  
  17.                 sock.setSoTimeout(connectTimeout);  
  18.             }  
  19.             if (this.log.isDebugEnabled()) {  
  20.                 this.log.debug("Connecting socket to " + remoteAddress + " with timeout " + connectTimeout);  
  21.             }  
  22.             //建立連接  
  23.             sock.connect(remoteAddress, connectTimeout);  
  24.         } catch (final IOException ex) {  
  25.             try {  
  26.                 sock.close();  
  27.             } catch (final IOException ignore) {  
  28.             }  
  29.             throw ex;  
  30.         }  
  31.         // 如果當前是SslSocket則進行SSL握手與域名校驗  
  32.         if (sock instanceof SSLSocket) {  
  33.             final SSLSocket sslsock = (SSLSocket) sock;  
  34.             this.log.debug("Starting handshake");  
  35.             sslsock.startHandshake();  
  36.             verifyHostname(sslsock, host.getHostName());  
  37.             return sock;  
  38.         } else {  
  39.             //如果不是SslSocket則將其包裝為SslSocket  
  40.             return createLayeredSocket(sock, host.getHostName(), remoteAddress.getPort(), context);  
  41.         }  
  42.     }  
  43.     @Override  
  44.     public Socket createLayeredSocket(  
  45.             final Socket socket,  
  46.             final String target,  
  47.             final int port,  
  48.             final HttpContext context) throws IOException {  
  49.             //將普通socket包裝為SslSocket,socketfactory是根據HttpClientBuilder中的SSLContext生成的,其中包含密鑰信息  
  50.         final SSLSocket sslsock = (SSLSocket) this.socketfactory.createSocket(  
  51.                 socket,  
  52.                 target,  
  53.                 port,  
  54.                 true);  
  55.         //如果制定了SSL層協議版本與加密算法,則使用指定的,否則使用默認的  
  56.         if (supportedProtocols != null) {  
  57.             sslsock.setEnabledProtocols(supportedProtocols);  
  58.         } else {  
  59.             // If supported protocols are not explicitly set, remove all SSL protocol versions 
  60.             final String[] allProtocols = sslsock.getEnabledProtocols();  
  61.             final List<String> enabledProtocols = new ArrayList<String>(allProtocols.length);  
  62.             for (final String protocol: allProtocols) {  
  63.                 if (!protocol.startsWith("SSL")) {  
  64.                     enabledProtocols.add(protocol);  
  65.                 }  
  66.             }  
  67.             if (!enabledProtocols.isEmpty()) {  
  68.                 sslsock.setEnabledProtocols(enabledProtocols.toArray(new String[enabledProtocols.size()]));  
  69.             }  
  70.         }  
  71.         if (supportedCipherSuites != null) {  
  72.             sslsock.setEnabledCipherSuites(supportedCipherSuites);  
  73.         }  
  74.         if (this.log.isDebugEnabled()) { 
  75.              this.log.debug("Enabled protocols: " + Arrays.asList(sslsock.getEnabledProtocols()));  
  76.             this.log.debug("Enabled cipher suites:" + Arrays.asList(sslsock.getEnabledCipherSuites()));  
  77.         }  
  78.         prepareSocket(sslsock);  
  79.         this.log.debug("Starting handshake");  
  80.         //Ssl連接握手  
  81.         sslsock.startHandshake();  
  82.         //握手成功后校驗返回的證書與域名是否一致  
  83.         verifyHostname(sslsock, target);  
  84.         return sslsock; 
  85.      } 

可以看到,對于一個SSL通信而言。首先是建立普通socket連接,然后進行ssl握手,之后驗證證書與域名一致性。之后的操作就是通過SSLSocketImpl進行通信,協議細節在SSLSocketImpl類中體現,但這部分代碼jdk并沒有開源,感興趣的可以下載相應的openJdk源碼繼續分析。

五、本文總結

  1.  https協議是http的安全版本,做到了傳輸層數據的安全,但對服務器cpu有額外消耗
  2.  https協議在協商密鑰的時候使用非對稱加密,密鑰協商結束后使用對稱加密
  3.  有些場景下,即使通過了https進行了加解密,業務系統也會對報文進行二次加密與簽名
  4.  HttpClient在build的時候,連接池管理器注冊了兩個SslSocketFactory,用來匹配http或者https字符串
  5.  https對應的socket建立原則是先建立,后驗證域名與證書一致性
  6.  ssl層加解密由jdk自身完成,不需要httpClient進行額外操作 

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2021-11-08 10:00:19

require前端模塊

2021-07-21 10:10:14

require前端代碼

2019-11-27 10:54:43

Tomcat連接數線程池

2019-12-04 12:33:48

程序員技術設計

2018-06-08 10:12:10

Web緩存體系服務器

2022-01-25 12:41:31

ChromeResponse接口

2022-02-08 13:39:35

LinuxUNIX系統

2024-12-10 13:00:00

C++引用

2018-01-31 10:24:45

熱插拔原理服務器

2019-08-05 15:05:35

2021-05-28 06:16:28

藍牙Wi-FiNFC

2020-12-01 10:18:16

RabbitMQ

2013-07-15 16:55:45

2020-02-15 15:33:55

Python如何運作

2020-06-29 08:32:21

高并發程序員流量

2022-04-07 08:20:22

typeinterface前端

2020-09-18 06:39:18

hashMap循環數據

2009-05-18 10:57:35

.NETString特性

2022-06-22 13:06:48

物聯網數字化轉型

2021-08-18 15:23:42

SDNSD-WAN軟件定義網絡
點贊
收藏

51CTO技術棧公眾號

国产精品白丝av嫩草影院| 亚洲青涩在线| 一本一道波多野结衣一区二区| 无码专区aaaaaa免费视频| 在线欧美日韩| 亚洲综合在线中文字幕| 狠狠做六月爱婷婷综合aⅴ| 欧美日韩电影在线观看| 色狠狠一区二区三区| 亚洲视频日韩精品| 亚洲美女炮图| 亚洲色图第一页| 国产欧美一区二区三区精品酒店| 欧美人伦禁忌dvd放荡欲情| 日韩私人影院| 色婷婷精品大视频在线蜜桃视频 | 欧美手机视频| 96精品视频在线| 一区二区三区四区高清视频| 久久久国产一区二区三区| 外国成人毛片| 久久久亚洲影院| 亚洲动漫精品| 91在线观看免费高清| 国内在线观看一区二区三区| 国产精品久久久久久久久久久久冷 | 成人爽a毛片免费啪啪动漫| 日韩欧美一区电影| 超碰aⅴ人人做人人爽欧美| 亚洲天堂网站在线观看视频| 黄色精品视频| 97高清免费视频| 欧美mv日韩| 精品视频高清无人区区二区三区| 亚洲一区成人| 99久久99久久精品| 国产日韩欧美高清在线| 116极品美女视频在线观看| 欧美日韩国产页| 中文字幕有码在线视频| 在线一区二区日韩| 日本午夜精品| 精品国产一区二区三区四区精华| 激情欧美一区二区| 欧美三级午夜理伦三级富婆| 午夜电影一区二区三区| 秋霞在线视频| 久久久久久久久91| 日韩一区电影| 日韩av影视| ww久久中文字幕| 伪装者在线观看完整版免费| 亚洲国产精品久久91精品| 伊人www22综合色| 999国产在线| 国产成+人+日韩+欧美+亚洲| 男人的天堂网av| 精品国偷自产国产一区| 97品白浆高清久久久久久| 国产区一区二区| av在线播放不卡| 国产精品久久久久一区二区国产| 亚洲国产三级网| 国产剧情在线观看一区| 26uuu成人| 亚洲国产精品欧美一二99| 麻豆蜜桃在线| 日韩免费av片在线观看| 日本免费新一区视频| 九七影院理伦片| 亚洲精品久久久久中文字幕二区| 香蕉视频一区二区三区| 日本一区美女| 亚洲免费av观看| 成人动漫一区| 91手机视频在线观看| 99这里只有久久精品视频| av中文字幕一区二区三区| 久久99国产精品自在自在app| 国产日韩欧美| 日本成人免费| 亚洲欧美激情另类校园| 午夜精品999| 成人在色线视频在线观看免费大全 | 91欧美极品| 午夜精品一区二区三区在线观看| 悠悠色在线精品| 成人在线中文| 麻豆久久久9性大片| 亚洲欧美一区二区三区极速播放| 一区二区三区四区日本视频| 91亚洲国产精品| 波多野结衣在线| 国产一区免费观看| 韩国欧美一区二区| 免费白浆视频| 亚洲男人7777| 欧美一区久久| 成人黄色一区二区| 欧美一区二区三区在线观看视频| 777久久精品| 在线看视频不卡| 色综合久久久久久久久| 欧美成人午夜视频| 亚洲精品国产成人久久av盗摄| av大片在线看| 国产精品素人视频| 欧美一级鲁丝片| 国产精品自拍首页| 亚洲一二三区不卡| av在线播放一区| 亚洲欧美成人一区| 欧美在线看片a免费观看| 禁果av一区二区三区| 中文字幕网av| 色系列之999| 国产精品亚洲一区二区三区妖精| 免费黄色在线观看| 亚洲最大的免费| 欧美四级在线| 国产精品亚洲视频在线观看| 91一区二区在线| 写真福利精品福利在线观看| 日韩欧美一区二区视频在线播放| 欧美性xxxxxxxx| 欧美日韩亚洲一区三区| 三级无遮挡在线观看| 成人福利视频网| 一区二区三区在线观看动漫| 加勒比色老久久爱综合网| 欧美成人黑人猛交| 欧美日韩福利在线观看| 久久女同精品一区二区| 麻豆久久一区| 国产freexxxx性播放麻豆 | 日韩理论电影中文字幕| www.日本xxxx| 精品国产网站地址| 91一区二区三区在线观看| 欧美成人福利| 成年人视频网站免费观看| 欧美国产高跟鞋裸体秀xxxhd| 国产日产欧美一区| 丝袜美腿一区二区三区动态图| www.大网伊人| 国产精品视频99| 欧美图区在线视频| 午夜影院日韩| 亚洲永久av| 日韩视频在线免费看| 久久久久中文字幕2018| 亚洲激情五月婷婷| 亚洲精品国产成人影院| av网页在线| 永久免费精品视频网站| 色婷婷久久一区二区| 国产精品乱码一区二区三区软件| 视频国产一区| h视频在线免费| 日本久久高清视频| 久久久久国产精品免费| 亚洲一区在线电影| 噜噜噜在线观看免费视频日韩| 中文在线免费视频| 丰满少妇在线观看| 国产极品jizzhd欧美| 欧美性淫爽ww久久久久无| 蜜桃传媒麻豆第一区在线观看| 中韩乱幕日产无线码一区| 九色在线91| 国产欧美日韩亚洲| 国产亚洲精品一区二区| 国产精品久久综合| 红桃视频国产精品| 日韩中文影院| 超碰在线中文| 一区二区三区不卡在线| 欧美激情精品久久久久久变态| 欧美色播在线播放| 激情综合五月婷婷| 日韩精品亚洲aⅴ在线影院| 日韩精品成人av| 成年人视频观看| av在线亚洲男人的天堂| 亚洲午夜未删减在线观看| 亚洲国产日韩av| 国产在线精品一区二区不卡了| 蜜桃一区二区三区在线| 国模私拍视频在线播放| 青青草国产精品视频| 亚洲精品欧美在线| 精品国产一区二区三区久久久狼 | 97久久超碰福利国产精品…| 日韩欧美在线视频日韩欧美在线视频 | 日本精品福利视频| 国产精品成人播放| 日韩极品精品视频免费观看| 亚洲激情五月婷婷| 国产福利91精品一区二区三区| 国产精品久久久久久|