精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 安全套接字編程以及 keytool 使用最佳實踐

開發 后端
利用 Java 的 JSSE(Java Secure Socket Extension)技術,我們可以方便的編寫安全套接字程序,關于 JSSE 的介紹,可以參閱 Oracle 網站提供的 JSSE 指導。程序編寫過程中,我們需要將數字證書應用到代碼中。

概述

利用 Java 的 JSSE(Java Secure Socket Extension)技術,我們可以方便的編寫安全套接字程序,關于 JSSE 的介紹,可以參閱 Oracle 網站提供的 JSSE 指導。程序編寫過程中,我們需要將數字證書應用到代碼中。通常在正式的產品開發中,我們可以支付一定的費用,向正規認證機構,例如:Verisign、Geotrust、Thawte 等申請。

如果只是為了實驗,我們還可以使用 Java 自帶的 keytool 工具來制作證書。keytool 是密鑰和證書管理工具,生成的密鑰或證書,存放在 jks(Java Key Store) 格式的文件里。從用途上來說,jks 格式的文件常用于:

1) 存儲非對稱密鑰對以及數字證書的證書庫;

2) 存儲信任證書列表的信任庫。

注意:不同版本的 Java 自帶的 keytool 命令行參數可能會略有不同。相比于 Java6,在 Java7 中 keytool 工具有如下改動:

-export 選項改名為 -exportcert

-genkey 選項改名為 -genkeypair

-import 選項改名為 – importcert

-keyclone 選項被廢棄

-identitydb 選項被廢棄

-selfcert 選項被廢棄

下面將以 Java7 中的 keytool 為例,對常見的用法進行說明。

使用 keytool 制作證書庫以及信任庫

生成非對稱密鑰以及自簽發證書

命令:keytool -genkeypair -alias TEST_ROOT -keystore test_root.jks

解釋:生成一對密鑰以及一個自簽發證書,其中私鑰和證書以別名 TEST_ROOT 存儲在 test_root.jks 文件中。

注意:使用上述命令時,命令行會交互的需要手動填寫密碼、CN、OU 等信息。也可以直接在命令行指定這些參數,詳情見 參考資料中列出的 keytool 使用幫助。

生成證書請求文件

命令:keytool -certreq -file test_server.csr -alias TEST_SERVER -keystore test_server.jks

解釋:將別名為 TEST_SERVER 的公鑰和一些個人信息從 test_server.jks 文件中導出,作為證書請求文件。

簽發證書

命令:keytool -gencert -infile test_server.csr -outfile test_server.cer -alias TEST_ROOT -keystore TEST_ROOT.jks

解釋:使用別名為 TEST_ROOT 的私鑰為 test_server.csr 簽發證書,并保存到 test_server.cer 文件中。

從 jks 文件中導出證書

命令:keytool -exportcert -alias TEST_ROOT -file test_root.cer -keystore test_root.jks

解釋:從 test_root.jks 文件中導出別名為 TEST_ROOT 的證書并存放在 test_root.cer 文件中。

導入信任證書到 jks 文件

命令:keytool -importcert -alias TEST_ROOT -file test_root.cer -keystore TEST_SERVER.jks

解釋:將證書 test_root.cer 以別名 TEST_ROOT 導入 TEST_SERVER.jks 中。

注意這里的目標 jks 文件里不含有指定的別名,此時的導入條目才會以 trustedCertEntry 信任證書的形式保存。

導入簽發證書到 jks 文件 ( 更新證書 )

命令keytool -importcert -alias TEST_SERVER -file test_server.cer -keystore TEST_SERVER.jks

解釋將證書 test_server.cer 更新到已存在別名 TEST_SERVER 的 TEST_SERVER.jks 文件中

注意這里的命令和上述導入信任證書的命令在形式上完全一樣,但作用不同。

1. 這里的目標 jks 文件里要含有指定的別名,這樣 keytool 工具才會理解命令為更新證書,并以 PrivateKeyEntry 的形式保存。

2. 在更新被簽發證書之前,一定要先將相應的 CA 證書,導入進 jks 文件,否則會報錯“keytool 錯誤 : java.lang.Exception: 無法從回復中建立鏈”。

打印證書內容

命令keytool – printcert – v – file test_server.cer

解釋:將證書 test_server.cer 的內容打印出來

注意:也可以使用 -sslserver ip:port 的參數,直接從網絡上打印出某個 ssl server 提供的證書的內容,詳情見 參考資料中列出的 keytool 使用幫助。

顯示 jks 文件里的內容

命令:keytool – list – v – keystore test_server.jks

解釋:顯示 test_server.jks 里存儲的所有條目

注意:這里會要求提供 jks 文件的密碼,如果不輸入,也可以顯示出所有條目信息,但會提示“存儲在密鑰庫中的信息的完整性尚未得到驗證!”

從 jks 文件刪除條目

命令:keytool -delete -alias TEST_ROOT -keystore test_server.jks

解釋:從 test_server.jks 中刪除別名為 TEST_ROOT 的條目

#p#

安全套接字程序編寫的方法

使用 Java 編寫安全套接字程序,可以遵循一定的方法,如圖 1 所示,展示了相關的各個類之間的關系。其中 Keystore、KeyManagerFactory、TrustManagerFactory、SSLContext 可以稱之為“引擎類”(engine class),對它們指定特定的參數 ( 例如:協議、算法等 ),就可以產生符合我們要求的,用于編程的對象實例。

圖 1. 相關類之間的關系

圖 1. 相關類之間的關系

(注:圖片引自 《 Java™ Secure Socket Extension (JSSE) Reference Guide 》

編程的步驟可以簡單的小結為以下幾步:

1. 使用 Keystore 類將證書庫或信任庫文件加載進來;

2. 使用 KeyManagerFactory 和加載了證書庫的 Keystore 實例,產生 KeyManager 實例數組;

3. 使用 TrustManagerFactory 和加載了信任庫的 Keystore 實例,產生 TrustManager 實例數組;

4. 使用 SSLContext 初始化 KeyManager 實例數組和 TrustManager 實例數組,從而設定好通信的環境。

5. 利用 SSLContext 產生的 SSLSocket 或 SSLServerSocket 進行通信。

在編寫具體程序之前,我們需要利用前文對keytool 工具的知識介紹,準備如下 jks 文件:

1. test_root.jks:該文件中存有自簽發的證書,用作 CA 來簽發證書;

2. test_server_cert.jks:該文件中存有 CA 簽名的證書,用于 SSL/TSL 通信的服務端;

3. test_server_trust.jks:該文件中存有信任客戶端的證書,用于 SSL/TSL 通信的服務端;

4. test_client_cert.jks:該文件中存有 CA 簽名的證書,用于 SSL/TSL 通信的客戶端;

5. test_client_trust.jks:該文件中存有信任服務端的證書,用于 SSL/TSL 通信的客戶端。

假定每個 jks 文件的密碼都設定為“Testpassw0rd”,都存放在“D:”盤下。

通過系統屬性指定證書庫和信任庫

這種編寫方式比較簡單直觀,可以通過給 JVM 傳遞參數,或者在代碼中使用 System.setProperty() 方法,來指定通信需要的 jks 文件。

服務端程序

要運行如清單 1 所示的程序,可以在命令行添加如下虛擬機參數,指定服務端程序要使用的證書庫和密碼:

-Djavax.net.ssl.keyStore="D:/test_server_cert.jks"

-Djavax.net.ssl.keyStorePassword="Testpassw0rd"

注意到程序中 setNeedClientAuth(false),表示不需要驗證客戶端身份。如果這里設置為 true,則我們這里還需要指定信任庫和密碼:

-Djavax.net.ssl.trustStore="D:/test_server_trust.jks"

-Djavax.net.ssl.trustStorePassword="Testpassw0rd"

清單 1. 簡單的 SSL 通信服務端程序

  1. import java.io.BufferedReader;  
  2.  import java.io.IOException;  
  3.  import java.io.InputStreamReader;  
  4.  import java.net.Socket;  
  5.  
  6.  import javax.net.ssl.SSLServerSocket;  
  7.  import javax.net.ssl.SSLServerSocketFactory;  
  8.  import javax.net.ssl.SSLSocket;  
  9.  
  10.   public class Simple_SSLServerSocket{  
  11.   // 定義了監聽端口號 
  12.   private final static int LISTEN_PORT=54321
  13.  
  14.    public static void main(String args[]) throws IOException{  
  15.     SSLServerSocket serverSocket=null;  
  16.     SSLSocket clientSocket=null;  
  17.     // 使用默認方式獲取套接字工廠實例 
  18.     SSLServerSocketFactory ssf=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); 
  19.  
  20.    try{  
  21.       serverSocket=(SSLServerSocket)ssf.createServerSocket(LISTEN_PORT);  
  22.       // 設置不需要驗證客戶端身份 
  23.       serverSocket.setNeedClientAuth(false); 
  24.       System.out.println("SSLServer is listening on "+LISTEN_PORT+" port");  
  25.       // 循環監聽端口,如果有客戶端連入就新開一個線程與之通信 
  26.       while(true){  
  27.         // 接受新的客戶端連接 
  28.         clientSocket=(SSLSocket)serverSocket.accept();  
  29.         ClientConnection clientConnection=new ClientConnection(clientSocket);  
  30.         // 啟動一個新的線程 
  31.         Thread clientThread=new Thread(clientConnection);  
  32.         System.out.println("Client "+clientThread.getId()+" is connected");  
  33.         clientThread.run();  
  34.       }  
  35.     }catch(IOException ioExp){  
  36.       ioExp.printStackTrace();  
  37.     }catch(Exception e){  
  38.       e.printStackTrace();  
  39.     }finally{  
  40.       serverSocket.close();  
  41.     }  
  42.   }  
  43.  }  
  44.  
  45.  class ClientConnection implements Runnable{  
  46.   private Socket clientSocket=null
  47.   
  48.  public ClientConnection(SSLSocket sslsocket){  
  49.     clientSocket=sslsocket;  
  50.   } 
  51.  
  52.   public void run(){  
  53.     BufferedReader reader=null;  
  54.     // 將接收到的來自客戶端的文字打印出來 
  55.     try{  
  56.       reader=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));  
  57.       while(true){  
  58.         String line=reader.readLine();  
  59.         if(line==null){  
  60.           System.out.println("Communication end.");  
  61.           break;  
  62.         }  
  63.         System.out.println("Receive message: "+line);  
  64.       }  
  65.       reader.close();  
  66.       clientSocket.close();  
  67.     }catch(IOException ioExp){  
  68.       ioExp.printStackTrace();  
  69.     }catch(Exception e){  
  70.       e.printStackTrace();  
  71.     }  
  72.   }  
  73.  } 

#p#

客戶端程序

對應于清單 1 所示的服務端程序,清單 2 是客戶端程序,需要在命令行添加如下虛擬機參數,指定信任庫和密碼:

-Djavax.net.ssl.trustStore="D:/test_client_trust.jks"

-Djavax.net.ssl.trustStorePassword="Testpassw0rd"

如果服務端程序 setNeedClientAuth(true) 要求驗證客戶端身份,則我們還需要指定證書庫和密碼:

-Djavax.net.ssl.keyStore="D:/test_client_cert.jks"

-Djavax.net.ssl.keyStorePassword="Testpassw0rd"

清單 2. 簡單的 SSL 通信客戶端程序

  1. import java.io.BufferedReader;  
  2.  import java.io.IOException;  
  3.  import java.io.InputStreamReader;  
  4.  import java.io.OutputStreamWriter;  
  5.  import java.io.Writer;  
  6.  import javax.net.ssl.SSLSocket;  
  7.  import javax.net.ssl.SSLSocketFactory;  
  8.  
  9.  
  10.  public class Simple_SSLSocket{  
  11.   // 定義要連接的服務器名和端口號 
  12.   private static final int DEFAULT_PORT=54321;  
  13.   private static final String DEFAULT_HOST="localhost";  
  14.   public static void main(String args[]){  
  15.     SSLSocket socket=null;  
  16.     // 使用默認的方式獲取工廠實例 
  17.     SSLSocketFactory sf=(SSLSocketFactory)SSLSocketFactory.getDefault(); 
  18.     try{  
  19.       // 連接服務端的端口,完成握手過程 
  20.       socket=(SSLSocket)sf.createSocket(DEFAULT_HOST, DEFAULT_PORT);  
  21.       socket.startHandshake();  
  22.       System.out.println("Connected to "+DEFAULT_HOST+":"+DEFAULT_PORT+" !");  
  23.       // 從控制臺輸入要發送給服務端的文字 
  24.       BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));  
  25.       Writer writer=new OutputStreamWriter(socket.getOutputStream()); 
  26.    // 可以反復向服務端發送消息 
  27.       boolean done=false;  
  28.       while (!done) {  
  29.         System.out.print("Send Message: ");  
  30.         String line=reader.readLine();  
  31.         if (line!=null) {  
  32.           writer.write(line+"\n");  
  33.           writer.flush();  
  34.         }else{  
  35.           done=true;  
  36.         }  
  37.       }  
  38.       socket.close();  
  39.     }catch (Exception e) {  
  40.       System.out.println("Connection failed: "+e);  
  41.       try{  
  42.         socket.close();  
  43.       }catch(IOException ioe){}  
  44.       socket=null;  
  45.     }  
  46.   }  
  47.  } 

通過 SSLContext 指定證書庫和信任庫

前文描述的,通過系統參數指定證書庫和信任庫的方法,雖然簡單易用,但是缺點也是顯而易見的,整個程序的環境都得使用同樣的 jks 文件。如果程序里有不同的 SSL/TSL 通信,則需要使用不同的 jks 文件,該怎么做呢?

可以使用 SSLContext 來指定 jks 文件,只需要把清單 3 的代碼片段替換到清單 1 的“SSLServerSocketFactory ssf”生成處;把清單 4 的代碼片段替換到清單 2 的“SSLSocketFactory sf”生成處,再稍作代碼調整即可。

(注:實際上,在使用 SSLSocketFactory.getDefault() 或者 SSLServerSocketFactory.getDefault() 創建套接字的時候,程序內部已經使用了默認的 context,其參數就是通過系統屬性指定的 )

清單 3. SSLContext 指定證書庫

  1. // 相關的 jks 文件及其密碼定義 
  2.  private final static String CERT_STORE="D:/test_server_cert.jks";  
  3.  private final static String CERT_STORE_PASSWORD="Testpassw0rd"
  4.  // 載入 jks 文件 
  5.  FileInputStream f_certStore=new FileInputStream(CERT_STORE);  
  6.  KeyStore ks=KeyStore.getInstance("jks");  
  7.  ks.load(f_certStore, CERT_STORE_PASSWORD.toCharArray());  
  8.  f_certStore.close();  
  9.  
  10.  // 創建并初始化證書庫工廠 
  11.  String alg=KeyManagerFactory.getDefaultAlgorithm();  
  12.  KeyManagerFactory kmFact=KeyManagerFactory.getInstance(alg);  
  13.  kmFact.init(ks, CERT_STORE_PASSWORD.toCharArray());  
  14.  
  15.  KeyManager[] kms=kmFact.getKeyManagers();  
  16.  
  17.  // 創建并初始化 SSLContext 實例 
  18.  SSLContext context=SSLContext.getInstance("SSL");  
  19.  context.init(kms, nullnull);  
  20.  SSLServerSocketFactory ssf=(SSLServerSocketFactory)context.getServerSocketFactory(); 

清單 4. SSLContext 指定信任庫

  1. // 相關的 jks 文件及其密碼定義 
  2.  private final static String TRUST_STORE="D:/test_client_trust.jks";  
  3.  private final static String TRUST_STORE_PASSWORD="Testpassw0rd"
  4.  
  5. // 載入 jks 文件 
  6.  FileInputStream f_trustStore=new FileInputStream(TRUST_STORE);  
  7.  KeyStore ks=KeyStore.getInstance("jks");  
  8.  ks.load(f_trustStore, TRUST_STORE_PASSWORD.toCharArray());  
  9.  f_trustStore.close();  
  10.  
  11.  // 創建并初始化信任庫工廠 
  12.  String alg=TrustManagerFactory.getDefaultAlgorithm();  
  13.  TrustManagerFactory tmFact=TrustManagerFactory.getInstance(alg);  
  14.  tmFact.init(ks);  
  15.  
  16.  TrustManager[] tms=tmFact.getTrustManagers();  
  17.  
  18.  // 創建并初始化 SSLContext 實例 
  19.  SSLContext context=SSLContext.getInstance("SSL");  
  20.  context.init(null, tms, null);  
  21.  SSLSocketFactory sf=context.getSocketFactory(); 

當然,如果要在服務端或者客戶端同時使用證書庫和信任庫,可將清單 3 和清單 4 的代碼用在同一處 context.init() 的地方。

這里需要說明的是,如果 context.init() 的第一個 KeyManager[] 參數為 null,則表示不提供證書;如果第二個 TrustManager[] 參數為 null,則會尋找系統默認提供的信任庫 ( 例如:JRE 安裝目錄下的 lib/security/cacerts)。

#p#

使用 X509 證書信任管理器

X509TrustManager 接口擴展了 TrustManager 接口,使用 TrustManager 接口,我們已經可以在程序中自定義信任庫了,但如果對方的證書不在信任庫中,則通信會直接宣告失敗。

如果希望能自定義信任庫的一些行為 ( 例如:檢驗對方證書,針對異常做一些處理 ),我們可以使用 X509TrustManager 接口,實現自己的方法。

如清單 5 所示,假定我們要在客戶端程序使用 X509TrustManager,那么就可以在 checkServerTrusted() 函數里做一些事情,檢測到服務端證書異常的話,就可以做一些自己的處理。CheckClientTrusted() 則是用于服務端檢測客戶端的證書情況。

將清單 5 的代碼替換到清單 4 的 TrustManager[] tms 的生成處,并對代碼稍作調整即可。

清單 5. X509TrustManager 的使用

  1. // 使用自定義的 MyTrustManager 產生信任庫 
  2.  TrustManager[] tms=new TrustManager[]{new MyTrustManager()};  
  3. …… 
  4. …… 
  5.  class MyTrustManager implements X509TrustManager{  
  6.   // 相關的 jks 文件及其密碼定義 
  7.   private final static String TRUST_STORE="D:/test_client_trust.jks";  
  8.   private final static String TRUST_STORE_PASSWORD="Testpassw0rd";  
  9.   X509TrustManager xtm; 
  10.    
  11.   public MyTrustManager() throws Exception {  
  12.     // 載入 jks 文件 
  13.     KeyStore ks = KeyStore.getInstance("JKS");  
  14.     ks.load(new FileInputStream(TRUST_STORE),TRUST_STORE_PASSWORD.toCharArray());  
  15.     TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509""SunJSSE");  
  16.     tmf.init(ks); 
  17.     TrustManager[] tms = tmf.getTrustManagers(); 
  18.     // 篩選出 X509 格式的信任證書 
  19.     for (int i = 0; i < tms.length; i++) {  
  20.       if (tms[i] instanceof X509TrustManager) {  
  21.         xtm = (X509TrustManager) tms[i];  
  22.         return;  
  23.       }  
  24.     }  
  25.   } 
  26.   // 服務端檢驗客戶端證書的接口 
  27.   public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException{  
  28.   } 
  29.  // 客戶端檢驗服務端證書的接口 
  30.   public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{  
  31.     try{  
  32.       xtm.checkServerTrusted(chain, authType);  
  33.     }catch(CertificateException excep){  
  34.       System.out.println(excep.getMessage());  
  35.       throw excep;  
  36.     }  
  37.   } 
  38.   // 獲取可接受的發行者 
  39.   public X509Certificate[] getAcceptedIssuers() {  
  40.    //return xtm.getAcceptedIssuers();  
  41.     return null;  
  42.   }  
  43.  } 

注意:

1. 當服務端代碼 setNeedClientAuth(False) 時,客戶端的 MyTrustManager 實現了 X509TrustManager 后,如果 checkServerTrusted() 方法的實現為空,則無論服務端使用什么證書,客戶端都會默認接受;如果要對服務端證書進行檢查,還需要像清單 5 中的代碼片段那樣,捕捉異常并處理。

2.getAcceptedIssuers() 方法通常不需要具體實現,但是當服務端要求檢驗客戶端身份,也即 setNeedClientAuth(True) 時,服務端需也需要具體實現 X509TrustManager,且 getAcceptedIssuers() 方法要如清單 5 中注釋部分代碼那樣實現。

調試 SSL/TSL 程序

打開調試開關觀察通信日志

圖 2 描述了 SSL/TSL 通信的握手過程。在實際編寫程序的時候,可能會在這些環節遇到問題,導致無法通信,排查起來往往令人無從下手。這個時候我們可以將 SSL/TSL 通信的握手日志開關打開,進行觀察。

圖 2.SSL 通信協議握手過程

圖 2.SSL 通信協議握手過程

(注:圖片引自 《Java™ Secure Socket Extension (JSSE) Reference Guide》

打開日志開關的方法同樣是通過設定系統屬性,可以從命令行添加虛擬機參數:

-Djavax.net.debug=ssl,handshake

當然也可以使用 System.setProperty() 方法在代碼中打開該開關。

打開日志開關后,可以搜索“ClientHello”、“ServerHello”等關鍵字;或者搜索“*** ”( 三個星號和一個空格 ) ——這是握手階段每一個步驟日志打印的開始標志。通過閱讀日志來定位問題。更詳細的開關信息,請參閱 JSSE 指導中的“Debugging Utilities”章節:

選擇通信的 Cipher Suites

有的時候為了做實驗,我們會選用特定的 Cipher Suites,我們可以使用 SSLServerSocket 或 SSLSocket 的 getEnabledCipherSuites() 觀察到默認支持的所有加密套件的信息,然后使用 setEnabledCipherSuites() 進行設置。

清單 6 展示了從服務端過濾掉所有的匿名加密套件的代碼。

清單 6. 過濾所有的匿名加密套件

  1. String enabled[]=serverSocket.getEnabledCipherSuites();  
  2. Set<String> filter = new LinkedHashSet<String>();  
  3. for(int i = 0; i < enabled.length; i++) {  
  4. if(enabled[i].indexOf("anon")<0){  
  5. filter.add(enabled[i]);  
  6. }  
  7. }  
  8. serverSocket.setEnabledCipherSuites(filter.toArray(new String[filter.size()])); 

原文鏈接:http://www.ibm.com/developerworks/cn/java/j-lo-socketkeytool/index.html

責任編輯:陳四芳 來源: ibm.com
相關推薦

2011-12-21 09:20:21

2021-02-05 15:20:06

網絡安全套接字命令

2016-09-19 00:13:15

2011-09-14 10:38:39

2014-12-11 09:20:30

TCP

2013-11-05 10:33:25

NETGEAR數字校園

2010-08-13 14:30:51

微軟惡意軟件

2014-11-13 11:46:51

環信

2019-08-22 10:07:37

SSL協議TCP

2021-05-13 07:58:05

HTTPSHTTP安全

2010-10-26 16:26:02

SSL證書Web安全

2010-12-13 13:04:14

金山支付寶

2009-11-26 16:53:42

2011-01-17 23:43:15

2014-12-15 09:28:54

UDP

2022-02-24 07:34:10

SSL協議加密

2009-11-17 15:28:01

2010-04-29 11:42:19

2020-04-29 14:30:35

HTTPHTTPS前端

2010-05-12 15:20:19

IIS 服務器
點贊
收藏

51CTO技術棧公眾號

亚洲1234区| 超碰在线人人干| 狠狠色丁香婷婷综合影院| 欧美色区777第一页| 在线观看成人一级片| 99久久精品国产色欲| 亚洲伦理一区| 色哟哟入口国产精品| 性一交一黄一片| 亚洲欧洲自拍| 中文字幕日韩av资源站| 国产偷久久久精品专区| 一区二区视频播放| 亚洲成人在线| 最近2019中文字幕大全第二页| 三级网站免费看| 亚洲www.| 欧美日韩国产中文精品字幕自在自线| 亚洲一区三区电影在线观看| www.精品久久| 七七婷婷婷婷精品国产| 久久久久久久久久久免费| 波多野在线播放| 国产欧美日韩电影| 欧亚洲嫩模精品一区三区| 成人一区二区免费视频| 在线激情网站| 成人国产精品免费网站| 成人激情视频在线观看| 少妇久久久久久久| 在线国产精品一区| 久久福利视频导航| 午夜黄色福利视频| 奇米狠狠一区二区三区| 亚洲成人999| 一级黄色高清视频| 91精品影视| 精品久久久中文| 日韩极品视频在线观看| 2024最新电影免费在线观看| 国产精品丝袜在线| 欧美大香线蕉线伊人久久| 好男人在线视频www| 国产成人综合在线播放| 成人黄色片网站| 中文字幕理论片| 日韩经典中文字幕一区| 日本午夜人人精品| 五月婷婷亚洲综合| 在线亚洲激情| 97av在线视频| 天天操天天干视频| 亚洲精品日本| 97色在线视频观看| 日韩久久久久久久久| 一区在线免费| 91国内揄拍国内精品对白| 国产中文字字幕乱码无限| 欧美在线资源| 欧美激情精品久久久久久黑人| 欧美老熟妇一区二区三区| 国产精品久久久久无码av| 日韩亚洲欧美中文在线| 久久精品亚洲a| 亚洲国产精品91| 九九精品在线播放| 麻豆一区二区三区精品视频| 激情久久综合| 欧美在线视频免费| 国产寡妇亲子伦一区二区三区四区| 国产精品人人爽人人做我的可爱| 国产91精品久久久久| 免费观看一区二区三区毛片| 国产手机视频一区二区| 国产成人av网址| 一本色道久久综合亚洲| 国产麻豆精品一区二区| 国产精品免费一区二区三区在线观看 | 欧美日韩精品国产| 日本女优爱爱视频| 久久久久久久性潮| 欧美一级视频精品观看| 艳妇乳肉豪妇荡乳xxx| 伊人久久大香线蕉综合网蜜芽| 亚洲色图五月天| 亚洲精品久久久久久国| 亚洲特色特黄| 人人澡人人澡人人看欧美| 自拍偷拍色综合| 国产剧情在线观看一区二区| 国产另类第一区| 精品视频三区| 亚洲青青青在线视频| 男人日女人视频网站| 精品欧美一区二区三区在线观看 | 艹b视频在线观看| 精品91福利视频| 精品在线欧美视频| 婷婷社区五月天| 一本色道88久久加勒比精品| 国产精品青青在线观看爽香蕉| 亚洲av永久纯肉无码精品动漫| 91网址在线看| 最新av网址在线观看| 香蕉伊大人中文在线观看| 欧美美女一区二区在线观看| 亚洲国产精品自拍视频| 99久久婷婷| 日韩av电影在线免费播放| 超碰人人人人人人| 欧美激情在线看| 日韩精品一区在线视频| 午夜精品久久久久久毛片| 亚洲国产日韩欧美综合久久 | 亚洲 国产 欧美 日韩| 欧美经典一区二区| 欧美精品一区二区三区三州| 宅男噜噜噜66国产精品免费| 欧美精品一区男女天堂| 来吧亚洲综合网| 久久午夜av| 国产精品一区二区三区四区五区| 色开心亚洲综合| 疯狂做受xxxx高潮欧美日本| 国产探花在线看| 久久不见久久见免费视频7| 久久久免费高清电视剧观看| 国产巨乳在线观看| 中文字幕高清一区| 日韩视频第二页| 国产日韩三级| 欧美国产日韩一区二区| 国产精品羞羞答答在线| 欧美国产在线观看| 美女网站免费观看视频| 欧美巨大xxxx| 久久久在线观看| 亚洲精品无amm毛片| 亚洲老妇xxxxxx| 亚洲一级片av| 99久久综合| 国产精品三级在线| 岛国视频免费在线观看| 欧美视频中文在线看| 欧美无人区码suv| 亚洲国产片色| 精品国产日本| 成人一级福利| 亚洲精品狠狠操| 成人在线免费看视频| 91香蕉国产在线观看软件| 日韩国产欧美亚洲| 欧美做受69| 国产91精品久久久久久| 免费在线视频一级不卡| 色综合天天综合网国产成人综合天| 精品一区二区三区四区五区六区| 激情欧美日韩| 久久精品二区| 日本综合字幕| 少妇精69xxtheporn| 高潮毛片又色又爽免费| 国产日韩欧美不卡| 日韩一区二区三区久久| 国产精品成人一区二区不卡| 91亚洲精品在线观看| 污视频网站免费在线观看| 欧美大片免费久久精品三p| 久久久久久蜜桃| www.66久久| 久久综合久久色| 欧美3p视频| 亚洲一区二区三区乱码aⅴ| av网址在线免费观看| 日韩女优电影在线观看| 国产成人精品网| 国产精品网站在线观看| 佐山爱在线视频| 最新成人av网站| 日本一区二区久久精品| 日本欧美在线| 久久免费视频在线观看| 色猫av在线| 欧美日韩一区二区三区高清| 欧美日韩大片在线观看| 91在线观看污| 污污网站免费观看| 韩国一区二区三区在线观看| 欧美日韩在线高清| 国产精品一区二区精品视频观看| 国内精品中文字幕| аⅴ资源新版在线天堂| 欧美大片在线观看一区| 无码视频在线观看| 亚洲欧美欧美一区二区三区| 国产国语性生话播放| 精品一区二区三区影院在线午夜 | 中文字幕观看av| 成人高清视频在线观看| 在线免费视频一区| 亚洲三级视频| 色中文字幕在线观看| 日本一道高清一区二区三区| 成人在线播放av| 乡村艳史在线观看| 欧美大秀在线观看| 9i精品一二三区| 亚洲国产精品一区二区久| 在线视频免费观看一区| 精品久久久久久中文字幕一区奶水| 国产成人在线网址| 91亚洲国产成人精品一区二三 | 久草手机在线观看| 亚洲欧美日韩久久| 在哪里可以看毛片| 成人美女在线观看| 17c国产在线| 老司机亚洲精品| 99热亚洲精品| 欧美激情自拍| 免费观看中文字幕| 欧美日韩一二三四| 欧美精品成人一区二区在线观看| 欧美影院视频| 成人欧美在线观看| 日本精品另类| 日韩美女免费视频| 婷婷电影在线观看| 久久久久久久91| 国产激情在线视频| 日韩一区二区av| 国产高清美女一级毛片久久| 日韩国产一区三区| 日韩一区二区三区在线观看视频| 日韩一级黄色大片| 国产伦精品一区二区三区免.费| 欧美视频在线观看一区二区| www.国产毛片| 色婷婷国产精品综合在线观看| 日韩成人高清视频| 性做久久久久久| 国产无遮挡裸体免费视频| 一区二区三区中文字幕电影| 色欲人妻综合网| 亚洲视频在线一区二区| 欧美性猛交xxxx乱大交少妇| 中文字幕不卡一区| jizz日本在线播放| 国产精品三级久久久久三级| 亚洲最大成人综合网| 国产日韩高清在线| 免费看黄色av| 亚洲欧洲日韩女同| 亚洲欧美一区二区三区四区五区| 亚洲色图一区二区| 黄色录像一级片| 樱花草国产18久久久久| 国产乡下妇女做爰视频| 亚洲成人在线免费| 精品美女久久久久| 色94色欧美sute亚洲线路一ni| 69视频免费看| 在线不卡的av| 午夜久久久久久噜噜噜噜| 欧美精品一区二区高清在线观看| 亚洲精品国产一区二| 亚洲激情久久久| 毛片免费在线| 中文字幕亚洲一区在线观看| 免费大片在线观看www| 欧美老肥婆性猛交视频| av免费不卡| 国产成人综合精品| 国产成人久久精品一区二区三区| 91精品久久久久久蜜桃| 国产人妖ts一区二区| 日韩电影在线播放| 亚洲成人精选| 日韩欧美国产免费| 蜜臀久久99精品久久久久久9| aaa一级黄色片| 成人avav在线| 大吊一区二区三区| 亚洲自拍偷拍麻豆| 日韩精品久久久久久免费| 欧美日韩国产一区| 少妇av在线播放| 这里只有精品在线观看| 欧美精品videosex| 国产精品av免费在线观看| 精品国产亚洲一区二区三区大结局| 精品久久久久久一区二区里番| 欧美色女视频| 免费拍拍拍网站| 全国精品久久少妇| 亚洲精品激情视频| 国产精品免费丝袜| 国产精品18p| 欧美裸体一区二区三区| 天天干视频在线观看| 日韩在线精品一区| 天堂资源在线| 国产精品日韩高清| 久久成人综合| 爱福利视频一区二区| 国产在线精品一区在线观看麻豆| 中文字幕xxx| 一区二区三区四区不卡在线 | 日韩一区二区三区电影在线观看| 全色精品综合影院| 欧美激情视频在线免费观看 欧美视频免费一| 国产资源在线观看入口av| 91亚色免费| 99re66热这里只有精品8| 免费无码av片在线观看| 高清久久久久久| 久久国产高清视频| 在线视频中文字幕一区二区| 国产91绿帽单男绿奴| 久久影视电视剧免费网站| 久久久人成影片一区二区三区在哪下载| 超碰97网站| 羞羞色午夜精品一区二区三区| 久久精品午夜福利| 99国产精品久久久久| 欧美成人三级视频| 欧美高清dvd| 日本美女在线中文版| 国产精品久久99久久| 日韩精品a在线观看91| 日韩xxxx视频| 成人免费高清在线观看| 欧美日韩大片在线观看| 日韩午夜精品电影| www在线免费观看视频| 91社区国产高清| 91精品国产成人观看| 日本黄大片一区二区三区| 欧美激情一区二区三区四区 | 青青草97国产精品免费观看无弹窗版| 麻豆国产精品一区| 精品久久久久久久久久久久久| 性一交一乱一色一视频麻豆| 欧美美女18p| 秋霞影院一区| 久久亚洲国产成人精品无码区 | 欧美日韩精品一区二区在线播放| 男女网站在线观看| 国产精品国产自产拍高清av水多| 欧美男gay| 国产免费视频传媒| 国产欧美日韩另类视频免费观看 | av资源中文在线| 国产亚洲精品美女久久久m| 亚洲精品一二| 亚洲av无码国产精品久久| 一本到三区不卡视频| 高清在线观看av| 国产精品视频免费在线观看| 久久一区二区三区电影| 91aaa精品| 亚洲综合免费观看高清完整版| 亚洲黄色在线观看视频| 91国产美女视频| 国产一区二区电影在线观看| 欧美成人黄色网址| 《视频一区视频二区| www.国产黄色| 欧美中文在线免费| 成人羞羞网站入口免费| 国产性生活一级片| 亚洲一区二区三区国产| 午夜视频免费在线| 国产精品久久一| 你懂的国产精品| 中文字幕av网址| 欧美日韩成人在线| 欧美午夜大胆人体| 欧美日韩一区二| 韩国视频一区二区| 国产大片中文字幕| 一区二区三区精品99久久 | 91香蕉视频污在线观看| 日韩欧美一级片| 二区三区不卡| 五月天综合婷婷| 91免费国产在线| 国产又粗又猛又爽又黄的视频一| 国模叶桐国产精品一区| 欧美精品尤物在线观看| 日本少妇一级片| 日本韩国一区二区三区视频| 肉肉视频在线观看| 日本一区二区三区视频在线播放 | 欧美日韩和欧美的一区二区| 手机在线免费av| 色综合久久av| www.日韩精品| 国产精品久久久午夜夜伦鲁鲁| 97视频免费观看|