<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [WCF安全系列]實(shí)例演示:TLS/SSL在WCF中的應(yīng)用[SSL over TCP]

      在接下來的系列文章中我們正是討論關(guān)于身份認(rèn)證的主題。在前面我們已經(jīng)談到了,WCF中的認(rèn)證屬于“雙向認(rèn)證”,既包括服務(wù)對客戶端的認(rèn)證(以下簡稱客戶端認(rèn)證),也包括客戶端對服務(wù)的認(rèn)證(以下簡稱服務(wù)認(rèn)證)。客戶端認(rèn)證和服務(wù)認(rèn)證從本質(zhì)上并沒有什么不同,無非都是被認(rèn)證一方提供相應(yīng)的用戶憑證供對方對自己的身份進(jìn)行驗(yàn)證。我們先來討論服務(wù)認(rèn)證,客戶端認(rèn)證放在后續(xù)的文章中。

      在《從兩種安全模式談起》中,我們對TLS/SSL進(jìn)行了簡單的介紹。我們知道,客戶端和服務(wù)在為建立安全上下文而進(jìn)行的協(xié)商過程中會(huì)驗(yàn)證服務(wù)端的X.509證書如否值得信任。對于服務(wù)證書的驗(yàn)證實(shí)際上可以看成是一種服務(wù)認(rèn)證,或者說TLS/SSL對證書的驗(yàn)證可以看成是WCF服務(wù)認(rèn)證的一個(gè)環(huán)節(jié)。

      目錄
      TLS/SSL與X.509證書
      創(chuàng)建基于TLS/SSL的WCF服務(wù)
          創(chuàng)建X.509證書
          服務(wù)寄宿 
          服務(wù)調(diào)用
          改變證書認(rèn)證模式

      一、TLS/SSL與X.509證書

      TLS/SSL是實(shí)現(xiàn)Transport安全模式的一種主要的方式,但不是唯一方式。對于所有基于HTTP的綁定(主要指BasicHttpBinding、WSHttpBinding和WS2007HttpBinding,而WSDualHttpBinding不支持Transport安全模式),如果選擇了Transport或者M(jìn)ixed安全模式,不論采用怎樣的認(rèn)證方式,底層的實(shí)現(xiàn)總是基于TLS/SSL(HTTPS)。

      而對于NetTcpBinding來說,如果采用Transport安全模式,并且采用非Windows認(rèn)證(客戶端憑證類型選擇None或者Certificate),最終的傳輸安全的實(shí)現(xiàn)也是基于TLS/SSL(SSL Over TCP)。如果選擇Mixed安全模式,不論選擇怎樣的客戶端憑證類型,WCF最終都會(huì)采用TLS/SSL來提供對傳輸安全的實(shí)現(xiàn)。也正是因?yàn)槿绱耍谶@兩種情況下,你總是需要選擇一個(gè)X.509證書作為服務(wù)的憑證。舉個(gè)例子,對于如下的配置,終結(jié)點(diǎn)采用NetTcpBinding綁定,并且選擇Transport安全模式,但是卻采用匿名的認(rèn)證方式(客戶端憑證類型為None)。

         1: <system.serviceModel>
         2:   <bindings>
         3:     <netTcpBinding>
         4:       <binding name="transportTcpBinding">
         5:         <security mode="Transport">
         6:           <transport clientCredentialType="None"/>
         7:         </security>
         8:       </binding>
         9:     </netTcpBinding>      
        10:   </bindings>
        11:   <services>
        12:     <service name="Artech.WcfServices.Services.CalculatorService">
        13:       <endpoint address="net.tcp://127.0.0.1/calculatorservice" 
        14: binding="netTcpBinding" bindingConfiguration="transportTcpBinding" 
        15: contract="Artech.WcfServices.Contracts.ICalculator" />
        16:     </service>
        17:   </services>
        18: </system.serviceModel>

      在對服務(wù)進(jìn)行寄宿時(shí),會(huì)拋出如下圖所示的InvalidOperationException異常,提示“未提供服務(wù)證書。請?jiān)?ServiceCredentials 中指定服務(wù)證書”。

      image

      作為服務(wù)憑證的證書通過服務(wù)行為ServiceCredentials來指定,對于WCF的安全體系來說,ServiceCredentials是個(gè)非常重要的對象,在本章后續(xù)文章中我們將反復(fù)地使用到它。對于服務(wù)憑證的指定,需要使用到ServiceCredentials的只讀屬性ServiceCertificate,該屬性對應(yīng)的類型為X509CertificateRecipientServiceCredential。X509CertificateRecipientServiceCredential對象實(shí)際上是對一個(gè)X509Certificate2對象的封裝,它定義了若干SetCertificate方法重載用以指定一個(gè)X.509證書作為服務(wù)的憑證。ServiceCredentials和X509CertificateRecipientServiceCredential的相關(guān)定義反映在如下所示的代碼片斷中。

         1: public class ServiceCredentials : SecurityCredentialsManager, IServiceBehavior
         2: {
         3:     //其他成員
         4:     public X509CertificateRecipientServiceCredential ServiceCertificate   { get; }
         5: }
         6: public sealed class X509CertificateRecipientServiceCredential
         7: {    
         8:     //其他成員
         9:     public void SetCertificate(string subjectName);
        10:     public void SetCertificate(string subjectName, StoreLocation storeLocation, StoreName storeName);
        11:     public void SetCertificate(StoreLocation storeLocation, StoreName storeName, X509FindType findType, object findValue);
        12:  
        13:     public X509Certificate2 Certificate { get; set; }
        14: }

      如果采用自我寄宿的方式,我們可以通過編程的方式來為寄宿的服務(wù)設(shè)置一個(gè)代表服務(wù)憑證的X.509證書。在下面給出的代碼片斷中,我們?yōu)榉?wù)設(shè)置一個(gè)主體名稱為Jinnan-PC(我的機(jī)器名)的X.509證書,該證書是一個(gè)基于個(gè)人存儲(chǔ)(Personal Store,通過StoreName.My表示)的本機(jī)(StoreLocation.LocalMachine)證書。

         1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
         2: {
         3:     ServiceCredentials serviceCredentials = host.Description.Behaviors.Find<ServiceCredentials>();
         4:     if (null == serviceCredentials)
         5:     {
         6:         serviceCredentials = new ServiceCredentials();
         7:         host.Description.Behaviors.Add(serviceCredentials);
         8:     }
         9:     serviceCredentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "Jinnan-PC");
        10:     host.Open();
        11:     ...
        12: }

      當(dāng)然,我們依舊推薦采用配置的方式進(jìn)行服務(wù)憑證的設(shè)置。對于上面一段設(shè)置服務(wù)證書的代碼,我們可以通過下面的一段配置來代替。

         1: <system.serviceModel>
         2:   ...
         3:   <services>
         4:     <service name="Artech.WcfServices.Services.CalculatorService" behaviorConfiguration="serviceCertificateBehavior">
         5:       <endpoint address="net.tcp://127.0.0.1/calculatorservice" 
         6: binding="netTcpBinding" bindingConfiguration="transportTcpBinding" contract="Artech.WcfServices.Contracts.ICalculator" />
         7:     </service>
         8:   </services>
         9:   <behaviors>
        10:     <serviceBehaviors>
        11:       <behavior name="serviceCertificateBehavior">
        12:         <serviceCredentials>
        13:           <serviceCertificate storeLocation="LocalMachine" storeName="My"   
        14: x509FindType="FindBySubjectName" findValue="Jinnan-PC" />
        15:         </serviceCredentials>
        16:       </behavior>
        17:     </serviceBehaviors>
        18:   </behaviors>
        19: </system.serviceModel>

      對于采用基于TLS/SSL的Transport安全模式,對服務(wù)證書的驗(yàn)證方式會(huì)因?yàn)榻壎愋偷牟煌哂行⌒〉牟町悺?/p>

      二、創(chuàng)建基于TLS/SSL的WCF服務(wù)

      image接下來我們會(huì)通過一個(gè)簡單的例子來演示如何在WCF服務(wù)中使用基于TLS/SSL的Transport安全。該實(shí)例會(huì)涉及兩種不同的綁定類型(WS2007HttpBinding和NetTcpBinding)和寄宿方式(自我寄宿和IIS寄宿)。

      我們還是采用慣用的計(jì)算服務(wù)的例子,演示實(shí)例的解決方式具有右圖所示的結(jié)構(gòu)。Contract和Services為兩個(gè)類庫項(xiàng)目,分別用于定義服務(wù)契約和實(shí)現(xiàn)契約的服務(wù)類型。而Hosting和Client為兩個(gè)控制臺(tái)應(yīng)用,前者用于進(jìn)行服務(wù)寄宿(自我寄宿),后者用于模擬客戶端程序。下面的代碼片斷代碼了分別定義在Contracts和Services項(xiàng)目中的服務(wù)契約接口ICalculator和具體的服務(wù)類型CalculatorService。

         1: using System.ServiceModel;
         2: namespace Artech.WcfServices.Contracts
         3: {
         4:     [ServiceContract(Namespace = "http://www.artech.com/")]
         5:     public interface ICalculator
         6:     {
         7:         [OperationContract]
         8:         double Add(double x, double y);
         9:     }
        10: }
        11:  
        12: using Artech.WcfServices.Contracts;
        13: namespace Artech.WcfServices.Services
        14: {
        15:     public class CalculatorService : ICalculator
        16:     {
        17:         public double Add(double x, double y)
        18:         {
        19:             return x + y;
        20:         }
        21:     }
        22: } 

      創(chuàng)建X.509證書

      由于TLS/SSL需要通過協(xié)商的方式生成一個(gè)用于消息簽名和加密的會(huì)話密鑰,而會(huì)話密鑰的交換依賴一個(gè)X.509證書以確保安全。所以我們首要的任務(wù)是需要得到一個(gè)X.509證書,這樣一個(gè)證書可以直接借助于MakeCert工具,通過命令行的方式創(chuàng)建一個(gè)主體名稱為Jinnan-PC(我個(gè)人的機(jī)器名,你需要替換成你本機(jī)的名稱)的證書。為了方便,我們在測試的時(shí)候傾向于創(chuàng)建自簽名證書,即證書授予者和頒發(fā)者身份合二為一。不過為了演示證書正常的信任鏈,我們不采用這種方式。所以我們需要通過運(yùn)行如下的命令行先創(chuàng)建一個(gè)CA證書。該CA證書本身是自簽名的(對應(yīng)于-r命令行開關(guān))

         1: Makecert -n "CN=RootCA" -r -sv C:\RootCA.pvk C:\RootCA.cer

      上面的命令行在執(zhí)行的過程中,會(huì)彈出兩個(gè)用于輸入密碼的對話框。你需要輸入相應(yīng)的密碼用以包括生成的兩個(gè)文件,一個(gè)是包含私鑰的文件RootCA.pvk,另一個(gè)是證書文件RootCA.cer,它們都保存在C盤根目錄下。

      然后通過如下的命令行創(chuàng)建一個(gè)主題名稱為Jinnan-PC(我的機(jī)器名,你需要換成你的機(jī)器名或者本機(jī)影射的Host Name)的證書,并以上面創(chuàng)建證書對應(yīng)的CA(RootCA)作為該證書的頒發(fā)者(-ic C:\RootCA.cer -iv C:\RootCA.pvk)。該證書最終自動(dòng)保存到本機(jī)(-sr LocalMachine)的個(gè)人存儲(chǔ)區(qū)(-ss My)。而-pe表示證書的私鑰可以被導(dǎo)出。-sky表示密鑰的類型或者作用,具有兩個(gè)選項(xiàng)signature和exchange,前者用于數(shù)字簽名,后者用于加密和密鑰交換,這里選用exchange。

         1: Makecert -n "CN=Jinnan-PC" -ic C:\RootCA.cer -iv C:\RootCA.pvk -sr LocalMachine -ss My -pe -sky exchange

      服務(wù)寄宿

      我們先使用NetTcpBinding作為綁定,在Hosting項(xiàng)目中定義如下的配置。從配置中我們可以看到:寄宿的CalculatorService服務(wù)唯一的終結(jié)點(diǎn)使用了Transport模式的NetTcpBinding綁定。該綁定的客戶端憑證類型為None,意味著接受匿名客戶端。通過命令行生成和存儲(chǔ)的X.509證書通過服務(wù)行為的方式被設(shè)置成寄宿服務(wù)的憑證。

         1: <?xml version="1.0" encoding="utf-8" ?>
         2: <configuration>
         3: <system.serviceModel>
         4:   <bindings>
         5:     <netTcpBinding>
         6:       <binding name="transportTcpBinding">
         7:         <security mode="Transport">
         8:           <transport clientCredentialType="None"/>
         9:         </security>
        10:       </binding>
        11:     </netTcpBinding>      
        12:   </bindings>
        13:   <services>
        14:     <service name="Artech.WcfServices.Services.CalculatorService" behaviorConfiguration="serviceCertificateBehavior">
        15:       <endpoint address="net.tcp://Jinnan-PC/calculatorservice" 
        16: binding="netTcpBinding" bindingConfiguration="transportTcpBinding" 
        17: contract="Artech.WcfServices.Contracts.ICalculator" />
        18:     </service>
        19:   </services>
        20:   <behaviors>
        21:     <serviceBehaviors>
        22:       <behavior name="serviceCertificateBehavior">
        23:         <serviceCredentials>
        24:           <serviceCertificate storeLocation="LocalMachine" storeName="My"  
        25: x509FindType="FindBySubjectName" findValue="Jinnan-PC" />
        26:         </serviceCredentials>
        27:       </behavior>
        28:     </serviceBehaviors>
        29:   </behaviors>
        30: </system.serviceModel>
        31: </configuration>

      通過上面的配置,我們創(chuàng)建的X.509證書通過ServiceCredentials服務(wù)行為被指定為服務(wù)的憑證。此外還有一點(diǎn)值得注意的是:終結(jié)點(diǎn)地址采用了沒有使用localhost和127.0.0.1,而是直接使用了機(jī)器名(Jinnan-PC),至于為什么需要這么做,在后續(xù)的內(nèi)容中你會(huì)找到答案。而對于寄宿服務(wù)的程序,我們力求簡潔,在Main方法中僅僅包括如下的代碼。

         1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
         2: {
         3:     host.Open();
         4:     Console.Read();
         5: }

      服務(wù)調(diào)用

      然后我們在Client項(xiàng)目中定義如下的客戶端配置,用于進(jìn)行服務(wù)調(diào)用的終結(jié)點(diǎn)的NetTcpBinding具有與服務(wù)端相同的配置。客戶端通過如下一段簡單的代碼進(jìn)行服務(wù)的調(diào)用。

         1: <?xml version="1.0" encoding="utf-8" ?>
         2: <configuration>
         3:   <system.serviceModel>
         4:     <bindings>
         5:       <netTcpBinding>
         6:         <binding name="transportTcpBinding">
         7:           <security mode="Transport">
         8:             <transport clientCredentialType="None"/>
         9:           </security>
        10:         </binding>
        11:       </netTcpBinding>
        12:     </bindings>
        13:     <client>
        14:       <endpoint name="calculatorService" address="net.tcp://jinnan-PC/calculatorservice" 
        15: binding="netTcpBinding" bindingConfiguration="transportTcpBinding" 
        16: contract="Artech.WcfServices.Contracts.ICalculator" />
        17:     </client>    
        18:   </system.serviceModel>
        19: </configuration>

      服務(wù)調(diào)用程序:

         1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
         2: {
         3:     ICalculator calculator = channelFactory.CreateChannel();
         4:     Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2)); ;
         5: }
         6: Console.Read();

      完成所有編程和配置工作之后,我們先后啟動(dòng)Hosting和Client這兩個(gè)控制臺(tái)程序,你會(huì)發(fā)現(xiàn)服務(wù)并不能正常地調(diào)用,而是拋出如下圖所示的SecurityNegotiationException異常,提示服務(wù)證書不受信任。

      image

      改變證書認(rèn)證模式

      之所以會(huì)拋出這樣的異常,原因在于:WCF默認(rèn)采用ChainTrust的模式對服務(wù)證書進(jìn)行驗(yàn)證。該認(rèn)證模式要求服務(wù)證書的頒發(fā)機(jī)構(gòu)鏈必須在客戶端的“受信任根證書頒發(fā)機(jī)構(gòu)(Trusted Root Certification Authorities)”。為了解決這個(gè)問題,我們具有如下兩種“解決方案”:

      • 將服務(wù)證書的頒發(fā)機(jī)構(gòu)納入到受信任根證書頒發(fā)機(jī)構(gòu)中。你可以通過MMC的證書管理單元的導(dǎo)出/入功能將頒發(fā)機(jī)構(gòu)的證書(C:\RootCA.cer)導(dǎo)入到受信任根證書頒發(fā)機(jī)構(gòu)存儲(chǔ)區(qū)中。但是不幸的是,由于CA證書是通過MakeCert.exe創(chuàng)建的,即使導(dǎo)入到受信任根證書頒發(fā)機(jī)構(gòu)存儲(chǔ)區(qū),它也不能作為受信任的CA;
      • 通過System.ServiceModel.Description.ClientCredentials這個(gè)終結(jié)點(diǎn)行為改變默認(rèn)的認(rèn)證模式。

      ClientCredentials和之前提到的ServiceCredentials是兩個(gè)相對的“行為”類型,前者是使用在客戶端的終結(jié)點(diǎn)行為,后者則是使用在服務(wù)端的服務(wù)行為。在本章后續(xù)的內(nèi)容中,我們還將不斷的使用到它們。現(xiàn)在我們先看討論一下如何通過ClientCredentials來改變客戶端對服務(wù)證書的認(rèn)證模式。

      首選你可以通過通過ChannelFactory的Credentials屬性得到ClientCredentials對象。ClientCredential具有一個(gè)類型為X509CertificateRecipientClientCredential的ServiceCertificate只讀屬性表示服證書。證書的認(rèn)證行為定義在X509CertificateRecipientClientCredential的Authentication只讀屬性中,該屬性的類型為X509ServiceCertificateAuthentication。我們通過X509ServiceCertificateAuthentication的CertificateValidationMode屬性設(shè)置相應(yīng)的證書認(rèn)證模式。關(guān)于服務(wù)證書認(rèn)證模式涉及到的應(yīng)用編程接口反映在如下所示的代碼片斷中。

         1: public abstract class ChannelFactory 
         2: {    
         3:     //其他成員
         4:     public ClientCredentials Credentials { get; }    
         5: }
         6: public class ClientCredentials : SecurityCredentialsManager, IEndpointBehavior
         7: {
         8:     //其他成員
         9:     public X509CertificateRecipientClientCredential ServiceCertificate { get; }
        10: }
        11:  public sealed class X509CertificateRecipientClientCredential
        12: {    
        13:     //其他成員
        14:     public X509ServiceCertificateAuthentication Authentication { get; }
        15:  }
        16:  public class X509ServiceCertificateAuthentication
        17:  {
        18:      //其他成員
        19:      public X509CertificateValidator CustomCertificateValidator { get; set; }
        20:      public X509CertificateValidationMode CertificateValidationMode { get; set; }
        21:  }

      證書認(rèn)證模式通過枚舉X509CertificateValidationMode表示,它具有如下五個(gè)選項(xiàng):None、PeerTrust、ChainTrust、PeerOrChainTrust和Custom。選擇None意味著無需認(rèn)證,而ChainTrust則要求證書的頒發(fā)機(jī)構(gòu)必須是“受信任根證書頒發(fā)機(jī)構(gòu)”存儲(chǔ)區(qū),而PerTrust要求證書本身(不是CA證書)存在于“受信任的個(gè)人(Trusted People)”存儲(chǔ)區(qū)。如果這些認(rèn)證模式不能滿足你的需求,你還可以選擇Custom。在這種情況下,你需要通過繼承抽象類X509CertificateValidator自定義驗(yàn)證規(guī)則,并將驗(yàn)證邏輯定義在抽象方法Validate中。最終將自定義的X509CertificateValidator賦給X509ServiceCertificateAuthentication的CustomCertificateValidator屬性。X509CertificateValidationMode和X509CertificateValidator的定義如下。

         1: public enum X509CertificateValidationMode
         2:  {
         3:      None,
         4:      PeerTrust,
         5:      ChainTrust,
         6:      PeerOrChainTrust,
         7:      Custom
         8:  }
         9: public abstract class X509CertificateValidator
        10: {
        11:     //其他成員
        12:     public abstract void Validate(X509Certificate2 certificate);    
        13: }

      對于本例來說,我們創(chuàng)建的證書既不再受信任根證書頒發(fā)機(jī)構(gòu)存儲(chǔ)區(qū),也不在受信任的個(gè)人存儲(chǔ)區(qū)。如果我們不愿意自定義X509CertificateValidator,可以通過如下的代碼選擇None模式以避免異常的發(fā)生。

         1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
         2: {
         3:     channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
         4:     ICalculator calculator = channelFactory.CreateChannel();
         5:     Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2)); ;
         6: }
         7: Console.Read();

      我們也可以通過配置的方式來對ClientCredentials這個(gè)終結(jié)點(diǎn)行為進(jìn)行相應(yīng)的設(shè)置,通過上面這段程序?qū)Ψ?wù)證書驗(yàn)證模式的設(shè)置與下面的這段配置在功能上是等效的。

         1: <system.serviceModel>
         2:  ...
         3:   <client>
         4:     <endpoint name="calculatorService" behaviorConfiguration="IgoreSvcCertValidation" 
         5: address="net.tcp://jinnan-PC/calculatorservice" binding="netTcpBinding" bindingConfiguration="transportTcpBinding" 
         6: contract="Artech.WcfServices.Contracts.ICalculator" />
         7:   </client>
         8:   <behaviors>
         9:     <endpointBehaviors>
        10:       <behavior name="IgoreSvcCertValidation">
        11:         <clientCredentials>
        12:           <serviceCertificate>
        13:             <authentication certificateValidationMode="None"/>
        14:           </serviceCertificate>
        15:         </clientCredentials>
        16:       </behavior>
        17:     </endpointBehaviors>
        18:   </behaviors>
        19: </system.serviceModel>

      通過終結(jié)點(diǎn)行為ClientCredentials改變服務(wù)證書認(rèn)證不僅僅可以適用于非HTTPS下的Transport安全模式,同時(shí)適用于Message安全模式。但是當(dāng)我們采用HTTPS的時(shí)候,我們需要采用另外一種改變證書認(rèn)證模式的方式,詳情請關(guān)注下篇。

      posted @ 2011-05-29 14:14  Artech  閱讀(10086)  評論(13)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品视频亚洲二区| 最新国产精品拍自在线观看| 精品无码成人久久久久久| 国产又黄又硬又粗| 精品人妻中文字幕在线| 欧美精品黑人粗大破除| 亚洲国产美女精品久久久| 久久综合综合久久综合| 久久精产国品一二三产品| 精品人妻中文字幕av| 侯马市| 国产精品不卡一区二区久久| 亚洲午夜无码久久久久蜜臀av | 国产精品国语对白一区二区| 精品亚洲国产成人av| 狠狠色噜噜狠狠狠狠色综合久av| 日韩精品福利视频在线观看| 精品无码久久久久久尤物| 永定县| 在线观看中文字幕国产码| 性欧美牲交在线视频| 亚洲日韩av无码一区二区三区| 国产三级精品三级在线看| 精品无码一区在线观看| 国产99视频精品免费专区| 国产日韩精品一区在线不卡| 综合色久七七综合尤物| 亚洲精品麻豆一区二区| AV教师一区高清| 日日噜噜夜夜狠狠久久无码区| 国产精品一区二区三区黄| 黄色亚洲一区二区三区四区| 97se综合| 久久99久国产精品66| 久久精品免视看国产成人| 国偷自产视频一区二区久| 乱老年女人伦免费视频| 西西人体大胆444WWW| 国产成人av电影在线观看第一页 | 国产自拍在线一区二区三区| 国产亚洲精品AA片在线爽|