亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

淺析Android系統中HTTPS通信的實現

2019-11-26 15:02:15
字體:
來源:轉載
供稿:網友

前言
最近有一個跟HTTPS相關的問題需要解決,因此花時間學習了一下Android平臺HTTPS的使用,同時也看了一些HTTPS的原理,這里分享一下學習心得。

HTTPS原理
HTTPS(Hyper Text Transfer Protocol Secure),是一種基于SSL/TLS的HTTP,所有的HTTP數據都是在SSL/TLS協議封裝之上進行傳輸的。HTTPS協議是在HTTP協議的基礎上,添加了SSL/TLS握手以及數據加密傳輸,也屬于應用層協議。所以,研究HTTPS協議原理,最終就是研究SSL/TLS協議。
SSL/TLS協議作用
不使用SSL/TLS的HTTP通信,就是不加密的通信,所有的信息明文傳播,帶來了三大風險:
1. 竊聽風險:第三方可以獲知通信內容。
2. 篡改風險:第三方可以修改通知內容。
3. 冒充風險:第三方可以冒充他人身份參與通信。
SSL/TLS協議是為了解決這三大風險而設計的,希望達到:
1. 所有信息都是加密傳輸,第三方無法竊聽。
2. 具有校驗機制,一旦被篡改,通信雙方都會立刻發現。
3. 配備身份證書,防止身份被冒充。
基本的運行過程
SSL/TLS協議的基本思路是采用公鑰加密法,也就是說,客戶端先向服務器端索要公鑰,然后用公鑰加密信息,服務器收到密文后,用自己的私鑰解密。但是這里需要了解兩個問題的解決方案。
1. 如何保證公鑰不被篡改?
解決方法:將公鑰放在數字證書中。只要證書是可信的,公鑰就是可信的。
2. 公鑰加密計算量太大,如何減少耗用的時間?
解決方法:每一次對話(session),客戶端和服務器端都生成一個“對話密鑰”(session key),用它來加密信息。由于“對話密鑰”是對稱加密,所以運算速度非??欤掌鞴€只用于加密“對話密鑰”本身,這樣就減少了加密運算的消耗時間。
因此,SSL/TLS協議的基本過程是這樣的:
1. 客戶端向服務器端索要并驗證公鑰。
2. 雙方協商生成“對話密鑰”。
3. 雙方采用“對話密鑰”進行加密通信。
上面過程的前兩布,又稱為“握手階段”。
握手階段的詳細過程

2015731144521263.png (599×662)

握手階段”涉及四次通信,需要注意的是,“握手階段”的所有通信都是明文的。
客戶端發出請求(ClientHello)
首先,客戶端(通常是瀏覽器)先向服務器發出加密通信的請求,這被叫做ClientHello請求。在這一步中,客戶端主要向服務器提供以下信息:
1. 支持的協議版本,比如TLS 1.0版
2. 一個客戶端生成的隨機數,稍后用于生成“對話密鑰”。
3. 支持的加密方法,比如RSA公鑰加密。
4. 支持的壓縮方法。
這里需要注意的是,客戶端發送的信息之中不包括服務器的域名。也就是說,理論上服務器只能包含一個網站,否則會分不清應用向客戶端提供哪一個網站的數字證書。這就是為什么通常一臺服務器只能有一張數字證書的原因。
服務器回應(ServerHello)
服務器收到客戶端請求后,向客戶端發出回應,這叫做ServerHello。服務器的回應包含以下內容:
1. 確認使用的加密通信協議版本,比如TLS 1.0版本。如果瀏覽器與服務器支持的版本不一致,服務器關閉加密通信。
2. 一個服務器生成的隨機數,稍后用于生成“對話密鑰”。
3. 確認使用的加密方法,比如RSA公鑰加密。
4. 服務器證書。
除了上面這些信息,如果服務器需要確認客戶端的身份,就會再包含一項請求,要求客戶端提供“客戶端證書”。比如,金融機構往往只允許認證客戶連入自己的網絡,就會向正式客戶提供USB密鑰,里面就包含了一張客戶端證書。
客戶端回應
客戶端收到服務器回應以后,首先驗證服務器證書。如果證書不是可信機構頒發,或者證書中的域名與實際域名不一致,或者證書已經過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通信。
如果證書沒有問題,客戶端就會從證書中取出服務器的公鑰。然后,向服務器發送下面三項消息。
1. 一個隨機數。該隨機數用服務器公鑰加密,防止被竊聽。
2. 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發送。
3. 客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項通常也是前面發送的所有內容的hash值,用來供服務器校驗。
上面第一項隨機數,是整個握手階段出現的第三個隨機數,又稱“pre-master key”。有了它以后,客戶端和服務器就同時有了三個隨機數,接著雙方就用事先商定的加密方法,各自生成本次會話所用的同一把“會話密鑰”。
服務器的最后回應
服務器收到客戶端的第三個隨機數pre-master key之后,計算生成本次會話所用的“會話密鑰”。然后,向客戶端最后發送下面信息。
1. 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發送。
2. 服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發生的所有內容的hash值,用來供客戶端校驗。
握手結束
至此,整個握手階段全部結束。接下來,客戶端與服務器進入加密通信,就完全是使用普通的HTTP協議,只不過用“會話密鑰”加密內容。

服務器基于Nginx搭建HTTPS虛擬站點
之前一篇文章詳細介紹了在服務器端如何生成SSL證書,并基于Nginx搭建HTTPS服務器,鏈接:Nginx搭建HTTPS服務器

Android實現HTTPS通信
由于各種原因吧,這里使用HttpClicent類講解一下Android如何建立HTTPS連接。代碼demo如下。
MainActivity.java

   

 package com.example.photocrop;      import java.io.BufferedReader;   import java.io.InputStreamReader;      import org.apache.http.HttpResponse;   import org.apache.http.HttpStatus;   import org.apache.http.StatusLine;   import org.apache.http.client.HttpClient;   import org.apache.http.client.methods.HttpPost;   import org.apache.http.client.methods.HttpUriRequest;      import android.app.Activity;   import android.os.AsyncTask;   import android.os.Bundle;   import android.os.AsyncTask.Status;   import android.text.TextUtils;   import android.util.Log;   import android.view.View;   import android.widget.Button;   import android.widget.TextView;      public class MainActivity extends Activity {     private Button httpsButton;     private TextView conTextView;        private CreateHttpsConnTask httpsTask;        @Override     protected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       setContentView(R.layout.activity_main);          httpsButton = (Button) findViewById(R.id.create_https_button);       httpsButton.setOnClickListener(new View.OnClickListener() {            @Override         public void onClick(View v) {           runHttpsConnection();         }       });          conTextView = (TextView) findViewById(R.id.content_textview);       conTextView.setText("初始為空");     }        private void runHttpsConnection() {       if (httpsTask == null || httpsTask.getStatus() == Status.FINISHED) {         httpsTask = new CreateHttpsConnTask();         httpsTask.execute();       }     }        private class CreateHttpsConnTask extends AsyncTask<Void, Void, Void> {       private static final String HTTPS_EXAMPLE_URL = "自定義";       private StringBuffer sBuffer = new StringBuffer();          @Override       protected Void doInBackground(Void... params) {         HttpUriRequest request = new HttpPost(HTTPS_EXAMPLE_URL);         HttpClient httpClient = HttpUtils.getHttpsClient();         try {           HttpResponse httpResponse = httpClient.execute(request);           if (httpResponse != null) {             StatusLine statusLine = httpResponse.getStatusLine();             if (statusLine != null                 && statusLine.getStatusCode() == HttpStatus.SC_OK) {               BufferedReader reader = null;               try {                 reader = new BufferedReader(new InputStreamReader(                     httpResponse.getEntity().getContent(),                     "UTF-8"));                 String line = null;                 while ((line = reader.readLine()) != null) {                   sBuffer.append(line);                 }                  } catch (Exception e) {                 Log.e("https", e.getMessage());               } finally {                 if (reader != null) {                   reader.close();                   reader = null;                 }               }             }           }            } catch (Exception e) {           Log.e("https", e.getMessage());         } finally {            }            return null;       }          @Override       protected void onPostExecute(Void result) {         if (!TextUtils.isEmpty(sBuffer.toString())) {           conTextView.setText(sBuffer.toString());         }       }        }   } 

HttpUtils.java

   

package com.example.photocrop;      import org.apache.http.HttpVersion;   import org.apache.http.client.HttpClient;   import org.apache.http.conn.ClientConnectionManager;   import org.apache.http.conn.scheme.PlainSocketFactory;   import org.apache.http.conn.scheme.Scheme;   import org.apache.http.conn.scheme.SchemeRegistry;   import org.apache.http.conn.ssl.SSLSocketFactory;   import org.apache.http.impl.client.DefaultHttpClient;   import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;   import org.apache.http.params.BasicHttpParams;   import org.apache.http.params.HttpProtocolParams;   import org.apache.http.protocol.HTTP;      import android.content.Context;         public class HttpUtils {     public static HttpClient getHttpsClient() {       BasicHttpParams params = new BasicHttpParams();       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);       HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);       HttpProtocolParams.setUseExpectContinue(params, true);              SchemeRegistry schReg = new SchemeRegistry();       schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));       schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));              ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params, schReg);              return new DefaultHttpClient(connMgr, params);     }          public static HttpClient getCustomClient() {       BasicHttpParams params = new BasicHttpParams();       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);       HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);       HttpProtocolParams.setUseExpectContinue(params, true);              SchemeRegistry schReg = new SchemeRegistry();       schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));       schReg.register(new Scheme("https", MySSLSocketFactory.getSocketFactory(), 443));              ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params, schReg);              return new DefaultHttpClient(connMgr, params);     }          public static HttpClient getSpecialKeyStoreClient(Context context) {       BasicHttpParams params = new BasicHttpParams();       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);       HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);       HttpProtocolParams.setUseExpectContinue(params, true);              SchemeRegistry schReg = new SchemeRegistry();       schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));       schReg.register(new Scheme("https", CustomerSocketFactory.getSocketFactory(context), 443));              ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params, schReg);              return new DefaultHttpClient(connMgr, params);     }   } 

activity_main.xml

   

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical">        <Button       android:id="@+id/create_https_button"       android:layout_width="match_parent"       android:layout_height="wrap_content"       android:text="@string/hello_world"       android:textSize="16sp" />        <TextView       android:id="@+id/content_textview"       android:layout_width="match_parent"       android:layout_height="wrap_content"       android:gravity="center"       android:textSize="16sp" />      </LinearLayout> 

Android使用DefaultHttpClient建立HTTPS連接,關鍵需要加入對HTTPS的支持:

  schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 

加入對HTTPS的支持,就可以有效的建立HTTPS連接了,例如“https://www.google.com.hk”了,但是訪問自己基于Nginx搭建的HTTPS服務器卻不行,因為它使用了不被系統承認的自定義證書,會報出如下問題:No peer certificate。
使用自定義證書并忽略驗證的HTTPS連接方式
解決證書不被系統承認的方法,就是跳過系統校驗。要跳過系統校驗,就不能再使用系統標準的SSL SocketFactory了,需要自定義一個。然后為了在這個自定義SSL SocketFactory里跳過校驗,還需要自定義一個TrustManager,在其中忽略所有校驗,即TrustAll。

   

package com.example.photocrop;      import java.io.IOException;   import java.net.Socket;   import java.net.UnknownHostException;   import java.security.KeyManagementException;   import java.security.KeyStore;   import java.security.KeyStoreException;   import java.security.NoSuchAlgorithmException;   import java.security.UnrecoverableKeyException;   import java.security.cert.CertificateException;   import java.security.cert.X509Certificate;      import javax.net.ssl.SSLContext;   import javax.net.ssl.TrustManager;   import javax.net.ssl.X509TrustManager;   import org.apache.http.conn.ssl.SSLSocketFactory;      public class MySSLSocketFactory extends SSLSocketFactory {     SSLContext sslContext = SSLContext.getInstance("TLS");        public MySSLSocketFactory(KeyStore truststore)         throws NoSuchAlgorithmException, KeyManagementException,         KeyStoreException, UnrecoverableKeyException {       super(truststore);       TrustManager tm = new X509TrustManager() {            @Override         public X509Certificate[] getAcceptedIssuers() {           return null;         }            @Override         public void checkServerTrusted(X509Certificate[] chain,             String authType) throws CertificateException {            }            @Override         public void checkClientTrusted(X509Certificate[] chain,             String authType) throws CertificateException {            }       };          sslContext.init(null, new TrustManager[] { tm }, null);     }        @Override     public Socket createSocket() throws IOException {       return sslContext.getSocketFactory().createSocket();     }        @Override     public Socket createSocket(Socket socket, String host, int port,         boolean autoClose) throws IOException, UnknownHostException {       return sslContext.getSocketFactory().createSocket(socket, host, port,           autoClose);     }        public static SSLSocketFactory getSocketFactory() {       try {         KeyStore trustStore = KeyStore.getInstance(KeyStore             .getDefaultType());         trustStore.load(null, null);         SSLSocketFactory factory = new MySSLSocketFactory(trustStore);         return factory;       } catch (Exception e) {         e.getMessage();         return null;       }     }   } 

同時,需要修改DefaultHttpClient的register方法,改為自己構建的sslsocket:

 

  public static HttpClient getCustomClient() {     BasicHttpParams params = new BasicHttpParams();     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);     HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);     HttpProtocolParams.setUseExpectContinue(params, true);          SchemeRegistry schReg = new SchemeRegistry();     schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));     schReg.register(new Scheme("https", MySSLSocketFactory.getSocketFactory(), 443));          ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params, schReg);          return new DefaultHttpClient(connMgr, params);   } 

這樣就可以成功的訪問自己構建的基于Nginx的HTTPS虛擬站點了。
缺陷:
不過,雖然這個方案使用了HTTPS,客戶端和服務器端的通信內容得到了加密,嗅探程序無法得到傳輸的內容,但是無法抵擋“中間人攻擊”。例如,在內網配置一個DNS,把目標服務器域名解析到本地的一個地址,然后在這個地址上使用一個中間服務器作為代理,它使用一個假的證書與客戶端通訊,然后再由這個代理服務器作為客戶端連接到實際的服務器,用真的證書與服務器通訊。這樣所有的通訊內容都會經過這個代理,而客戶端不會感知,這是由于客戶端不校驗服務器公鑰證書導致的。

使用自定義證書建立HTTPS連接
為了防止上面方案可能導致的“中間人攻擊”,我們可以下載服務器端公鑰證書,然后將公鑰證書編譯到Android應用中,由應用自己來驗證證書。
生成KeyStore

要驗證自定義證書,首先要把證書編譯到應用中,這需要使用keytool工具生產KeyStore文件。這里的證書就是指目標服務器的公鑰,可以從web服務器配置的.crt文件或.pem文件獲得。同時,你需要配置bouncycastle,我下載的是bcprov-jdk16-145.jar,至于配置大家自行google就好了。

  keytool -importcert -v -trustcacerts -alias example -file www.example.com.crt -keystore example.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /home/wzy/Downloads/java/jdk1.7.0_60/jre/lib/ext/bcprov-jdk16-145.jar -storepass pw123456 

運行后將顯示證書內容并提示你是否確認,輸入Y回車即可。

生產KeyStore文件成功后,將其放在app應用的res/raw目錄下即可。
使用自定義KeyStore實現連接
思路和TrushAll差不多,也是需要一個自定義的SSLSokcetFactory,不過因為還需要驗證證書,因此不需要自定義TrustManager了。

   

 package com.example.photocrop;      import java.io.IOException;   import java.io.InputStream;   import java.security.KeyManagementException;   import java.security.KeyStore;   import java.security.KeyStoreException;   import java.security.NoSuchAlgorithmException;   import java.security.UnrecoverableKeyException;      import org.apache.http.conn.ssl.SSLSocketFactory;      import android.content.Context;      public class CustomerSocketFactory extends SSLSocketFactory {        private static final String PASSWD = "pw123456";        public CustomerSocketFactory(KeyStore truststore)         throws NoSuchAlgorithmException, KeyManagementException,         KeyStoreException, UnrecoverableKeyException {       super(truststore);     }        public static SSLSocketFactory getSocketFactory(Context context) {       InputStream input = null;       try {         input = context.getResources().openRawResource(R.raw.example);         KeyStore trustStore = KeyStore.getInstance(KeyStore             .getDefaultType());            trustStore.load(input, PASSWD.toCharArray());            SSLSocketFactory factory = new CustomerSocketFactory(trustStore);            return factory;       } catch (Exception e) {         e.printStackTrace();         return null;       } finally {         if (input != null) {           try {             input.close();           } catch (IOException e) {             e.printStackTrace();           }           input = null;         }       }     }      } 

同時,需要修改DefaultHttpClient的register方法,改為自己構建的sslsocket:

 

  public static HttpClient getSpecialKeyStoreClient(Context context) {     BasicHttpParams params = new BasicHttpParams();     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);     HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);     HttpProtocolParams.setUseExpectContinue(params, true);          SchemeRegistry schReg = new SchemeRegistry();     schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));     schReg.register(new Scheme("https", CustomerSocketFactory.getSocketFactory(context), 443));          ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params, schReg);          return new DefaultHttpClient(connMgr, params);   } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品第七十二页| 成人天堂噜噜噜| 亚洲欧美日韩成人| 亚洲福利在线观看| 亚洲free性xxxx护士白浆| 亚洲综合视频1区| 国产精品扒开腿做爽爽爽男男| 一区二区三区视频免费在线观看| 亚洲第一在线视频| 欧美日韩一区二区三区| 亚洲精品成人久久久| 亚洲美女喷白浆| 国产精品久久久久免费a∨| 尤物九九久久国产精品的分类| 91夜夜揉人人捏人人添红杏| 精品亚洲男同gayvideo网站| 亚洲国产精品yw在线观看| 国产成人精品免费久久久久| 亚洲精品电影在线| 国产欧美在线视频| 欧美不卡视频一区发布| 欧美福利小视频| 98视频在线噜噜噜国产| 精品一区二区三区电影| 8x拔播拔播x8国产精品| 欧美乱人伦中文字幕在线| 色噜噜国产精品视频一区二区| 97成人在线视频| 91视频免费在线| 久久亚洲精品国产亚洲老地址| 中文字幕日韩欧美在线| 日韩av电影免费观看高清| 91丝袜美腿美女视频网站| 1769国内精品视频在线播放| 成人久久久久久久| 国产欧美精品日韩精品| 国产精品国语对白| 91超碰中文字幕久久精品| 日韩有码在线观看| 91福利视频在线观看| 欧美激情欧美激情在线五月| 97av在线播放| 色在人av网站天堂精品| 97精品国产97久久久久久| 久久精品一本久久99精品| 亚洲视频777| 欧美一级bbbbb性bbbb喷潮片| 亚洲欧美激情四射在线日| 91系列在线观看| 精品女厕一区二区三区| 8x海外华人永久免费日韩内陆视频| 国产精品久久久一区| 欧美福利在线观看| 亚洲最大福利视频网站| 夜夜躁日日躁狠狠久久88av| 国产精品久久久久久久久免费看| 国产精品91久久| 成人免费淫片视频软件| 国产精品久久久久国产a级| 久久综合久久88| 久久影视电视剧免费网站清宫辞电视| 国产黑人绿帽在线第一区| 久久青草精品视频免费观看| 啪一啪鲁一鲁2019在线视频| 2019中文字幕免费视频| 2021久久精品国产99国产精品| 欧美日韩国产黄| 欧美激情网友自拍| 久久精品色欧美aⅴ一区二区| 欧美日韩黄色大片| 性欧美xxxx视频在线观看| 一区二区三区四区视频| 日韩av电影在线免费播放| 欧美最猛性xxxxx亚洲精品| 色妞色视频一区二区三区四区| 亚洲免费电影在线观看| 欧美激情videos| 久久男人av资源网站| 国产成人极品视频| 日本欧美一二三区| 91免费在线视频网站| 精品久久久视频| 亚洲a在线观看| 91九色视频在线| 少妇激情综合网| 超碰97人人做人人爱少妇| 欧美日韩激情网| 久久99精品视频一区97| 亚洲一区二区三区在线免费观看| 国产精品大片wwwwww| 日韩在线播放av| 国产亚洲人成网站在线观看| 国产精品18久久久久久首页狼| 久久99青青精品免费观看| 精品欧美国产一区二区三区| 久久久久亚洲精品成人网小说| 91精品国产网站| 亚洲第一天堂av| 久久久久久久久久久免费| 啊v视频在线一区二区三区| 国产成人精品免费视频| 亚洲国产精品大全| 韩国精品久久久999| 中国china体内裑精亚洲片| 在线丨暗呦小u女国产精品| 日韩欧美中文字幕在线观看| 久久艳片www.17c.com| 456国产精品| 国产精品igao视频| 久久久久北条麻妃免费看| 亚洲精品720p| 狠狠做深爱婷婷久久综合一区| 国产精品偷伦视频免费观看国产| 青青草国产精品一区二区| 5566成人精品视频免费| 日韩免费观看av| 久久综合伊人77777蜜臀| 欧美电影免费在线观看| 亚洲a中文字幕| 91免费的视频在线播放| 国产69精品久久久久久| 久久亚洲精品中文字幕冲田杏梨| 96pao国产成视频永久免费| 国产精品第一区| 日韩经典中文字幕在线观看| 超碰97人人做人人爱少妇| 成人免费观看49www在线观看| 亚洲精品中文字幕女同| 九九久久精品一区| 黑人巨大精品欧美一区二区| 亚洲第一福利在线观看| 精品久久久国产精品999| 国产精品视频免费观看www| 欧美激情在线有限公司| 亚洲第一视频在线观看| 欧美电影免费播放| 成人在线视频福利| 高跟丝袜一区二区三区| 91久久精品国产91久久性色| 国产精品男女猛烈高潮激情| 中文字幕精品—区二区| 少妇高潮 亚洲精品| 亚洲国产欧美一区二区三区同亚洲| 中文字幕国内精品| 久久天天躁狠狠躁夜夜av| 国产精品九九九| 成人午夜激情免费视频| 欧美肥婆姓交大片| 欧美日韩中文字幕日韩欧美| 精品毛片网大全| 亚洲高清色综合| 亚洲japanese制服美女| 久久久91精品国产一区不卡| 51精品在线观看| 国产精品视频一区国模私拍| 国产精品视频在线观看| 欧美激情一区二区三级高清视频| 国产欧美精品va在线观看| 欧美极品少妇与黑人| 欧美大片免费观看| 全亚洲最色的网站在线观看| 一本大道香蕉久在线播放29| 亚洲美女又黄又爽在线观看| 91精品国产91久久久久久不卡|