<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    (轉(zhuǎn))應(yīng)用程序簽名

    Posted on 2010-11-23 15:34 啥都寫點(diǎn) 閱讀(307) 評(píng)論(0)  編輯  收藏 所屬分類: Android

    概述

    Android系統(tǒng)要求,所有的程序經(jīng)過(guò)數(shù)字簽名后才能安裝。Android系統(tǒng)使用這個(gè)證書來(lái)識(shí)別應(yīng)用程序的作者,并且建立程序間的信任關(guān)系。證書不是用于用戶控制哪些程序可以安裝。證書不需要授權(quán)中心來(lái)簽名:Android應(yīng)用程序上使用自己簽名的證書是完全允許且普遍的。

    理解Android應(yīng)用程序簽名有以下幾個(gè)重要點(diǎn):

    ·           所有的應(yīng)用程序都必須簽名。系統(tǒng)不會(huì)安裝任何一個(gè)不簽名的程序。

    ·           你可以使用自己的證書來(lái)簽名。不需要任何授權(quán)中心。

    ·           當(dāng)你要為最終用戶發(fā)布你的應(yīng)用程序的時(shí)候,你必須簽入一個(gè)合適的密鑰。你不可以發(fā)布程序的時(shí)候還使用SDK工具簽入的Debug Key

    ·           系統(tǒng)只在安裝應(yīng)用程序的時(shí)候檢測(cè)證書的有效期。如果應(yīng)用程序在安裝之后證書失效了,那么,應(yīng)用程序還是可以正常工作。

    ·           你可以使用標(biāo)準(zhǔn)工具——KeytoolJarsigner——生成Key并簽名apk文件。

    ·           一旦你為應(yīng)用程序簽名了,一定要使用zipalign工具來(lái)優(yōu)化最終的APK包。

    Android系統(tǒng)不會(huì)安裝和運(yùn)行沒有正確簽名的應(yīng)用程序。這條規(guī)則適用于任何運(yùn)行Android系統(tǒng)的地方,不管是真機(jī)還是模擬器。正是由于這個(gè)原因,你必須在模擬器或真機(jī)上運(yùn)行/調(diào)試程序之前對(duì)程序進(jìn)行簽名。

    當(dāng)你調(diào)試應(yīng)用程序時(shí),Android SDK工具替你對(duì)應(yīng)用程序進(jìn)行了簽名。EclipseADT插件和Ant編譯工具都提供了兩種簽名模式——Debug模式和Release模式。

    ·           當(dāng)開發(fā)和測(cè)試時(shí),你可以使用Debug模式。在Debug模式下,編譯工具使用內(nèi)嵌在JDK中的Keytool工具來(lái)創(chuàng)建一個(gè)keystore和一個(gè)key(包含公認(rèn)的名字和密碼)。在每次編譯的時(shí)候,使用這個(gè)Debug Key來(lái)為apk文件簽名。由于密碼是公認(rèn)的,在每次編譯的時(shí)候,也不需要提示你輸入keystorekey密碼。

    ·           當(dāng)你的程序準(zhǔn)備發(fā)布時(shí),你必須在Release模式下,使用密鑰來(lái)為apk文件簽名。有以下兩種方式可以做到:

    o    命令行中使用KeytoolJarsigner。在這個(gè)方法中,首先需要編譯出一個(gè)未簽名的apk。然后使用Jarsigner(或相似的工具),用你的密鑰為apk手動(dòng)簽名。如果你沒有合適的密鑰,你可以運(yùn)行Keytool來(lái)手動(dòng)生成自己的keystore/key

    o    使用ADT導(dǎo)出向?qū)АH绻闶褂?/span>Eclipse/ADT插件進(jìn)行開發(fā),你可以使用導(dǎo)出向?qū)?lái)編譯程序,生成密鑰(如果需要),并為apk簽名,所有這些操作都在導(dǎo)出向?qū)е小R坏┠愕某绦蚝灻耍瑒e忘了運(yùn)行zipalign來(lái)為apk進(jìn)行額外的優(yōu)化。

    簽名策略

    應(yīng)用程序簽名的某些方面可能會(huì)影響應(yīng)用程序的開發(fā),特別是你打算一起發(fā)布多個(gè)應(yīng)用程序的時(shí)候。

    一般來(lái)說(shuō),推薦的策略是在整個(gè)應(yīng)用程序壽命內(nèi),所有的程序簽上相同的證書。以下有幾個(gè)應(yīng)該這么做的原因:

    ·         應(yīng)用程序升級(jí)——當(dāng)你對(duì)應(yīng)用程序進(jìn)行升級(jí)時(shí),如果你想用戶平穩(wěn)的升級(jí),那么,你就需要簽上相同的證書。當(dāng)系統(tǒng)安裝一個(gè)升級(jí)應(yīng)用程序時(shí),如果新版本的證書與老版本的證書有匹配的話,那么,系統(tǒng)才會(huì)允許進(jìn)行升級(jí)。如果你沒有為版本簽上合適的證書,當(dāng)你安裝時(shí),你需要給應(yīng)用程序指定一個(gè)新的包名——在這種情況下,用戶安裝的新版本,被當(dāng)作是一個(gè)全新的應(yīng)用程序。

    ·         應(yīng)用程序模塊化——如果應(yīng)用程序請(qǐng)求的話,Android系統(tǒng)允許簽有相同證書的應(yīng)用程序運(yùn)行在相同的進(jìn)程里,這樣,系統(tǒng)就會(huì)把它們看作是一個(gè)單一的應(yīng)用程序。用這種方法配置應(yīng)用程序,用戶可以選擇更新每個(gè)獨(dú)立的模塊。

    ·         代碼/數(shù)據(jù)權(quán)限共享——Android系統(tǒng)提供了基于簽名的權(quán)限檢查,因此,如果應(yīng)用程序間簽有特定的證書,那么,它們之間可以共享功能。通過(guò)多個(gè)程序簽有相同的證書并且使用基于簽名的權(quán)限檢查,你的程序可以以一種安全的方式共享代碼和數(shù)據(jù)。

    還有一個(gè)決定簽名策略的重要因素是:如何設(shè)定key的有效期。

    ·         如果你計(jì)劃支持單個(gè)應(yīng)用程序的升級(jí),你需要確保你的key擁有一個(gè)超過(guò)期望的應(yīng)用程序生命周期的有效期。推薦使用25年或更多的有效期。當(dāng)你的key過(guò)期了,用戶也就不能平穩(wěn)的更新到新版本了。

    ·         如果你想給多個(gè)無(wú)關(guān)的應(yīng)用程序簽上相同的key,那么,你必須確保key的有效期超過(guò)所有應(yīng)用程序所有版本的生命周期,包括將來(lái)有可能添加到這一陣營(yíng)的程序。

    ·         如果你想在Android Market上發(fā)布你的程序,key的有效期必須在2033.10.22以后。Market服務(wù)器強(qiáng)制這一要求,目前是保證用戶可以平穩(wěn)的更新他們的程序。

    當(dāng)你設(shè)計(jì)應(yīng)用程序時(shí),一定要把這些點(diǎn)記在腦子里,并且使用一個(gè)合適的證書來(lái)為應(yīng)用程序簽名。

    簽名的基本設(shè)定

    在你開始之前,你必須保證Keytool對(duì)SDK編譯工具來(lái)說(shuō)是可利用的。多數(shù)情況下,你可以通過(guò)設(shè)置JAVA_HOME環(huán)境變量來(lái)告訴SDK編譯工具如何找到Keytool。另外,你還可以添加JDKKeytool的路徑到PATH的變量里。

    如果你在Linux上開發(fā),并且使用GNU編譯器來(lái)編譯Java,那么,請(qǐng)確保系統(tǒng)是使用JDK中的Keytool,而不是gcj。如果Keytool已經(jīng)在你的PATH中,它有可能是對(duì)/usr/bin/keytool的符號(hào)鏈接。在這種情況下,檢查符號(hào)鏈接的目標(biāo),確保它是指向JDK中的Keytool。

    如果你打算對(duì)公眾釋放你的應(yīng)用程序,你還需要Jarsigner工具。JarsignerKeytool都包含在JDK中。

    Debug模式下簽名

    Android編譯工具提供了Debug簽名模式,使得開發(fā)和調(diào)試應(yīng)用程序更加容易,而且還滿足Android系統(tǒng)的簽名要求。當(dāng)使用Debug模式編譯你的app時(shí),SDK工具會(huì)調(diào)用Keytool工具自動(dòng)創(chuàng)建一個(gè)Debugkeystorekey。然后,這個(gè)Debug key會(huì)自動(dòng)用于apk的簽名,這樣,你不需要使用你自己的key來(lái)為應(yīng)用程序包簽名。

    SDK工具使用預(yù)先定義好的名字/密碼來(lái)創(chuàng)建Debug keystore/key

    ·         Keystore名字:“debug.keysotre

    ·         Keystore密碼:“android

    ·         Key別名:“androiddebugkey

    ·         Key密碼:“android

    ·         CN:“CN=Android Debug,O=Android,C=US

    如果需要的話,你可以改變Debug keystore/key的位置和名字,或者提供一個(gè)自定義的Debug keysotre/key。然而,任何自定義的Debug keystore/key必須使用和默認(rèn)Debug key(上面描述的)相同的名字和密碼。(在Eclipse/ADT中,操作Windows>Preferences>Android>Build實(shí)現(xiàn)。)

    注意:你不能將簽有Debug證書的應(yīng)用程序發(fā)布給公眾。

     

    Eclipse 用戶

    如果你在Eclipse/ADT下開發(fā)(并且已經(jīng)按照上面描述的“簽名的基本設(shè)定”配置了Keytool),Debug模式下簽名默認(rèn)是開啟的。當(dāng)你運(yùn)行或是調(diào)試應(yīng)用程序時(shí),ADT會(huì)使用Debug證書進(jìn)行簽名,并運(yùn)行zipalign,然后安裝到選擇的模擬器或是連接上的設(shè)備。整個(gè)過(guò)程不需要你參與,前提是ADT能訪問(wèn)Keytool。

    Ant 用戶

    如果你使用Ant來(lái)編譯你的apk文件,需要在ant命令中添加debug選項(xiàng)來(lái)開啟Debug簽名模式(假設(shè)你正在使用由android工具生成build.xml文件)。當(dāng)你運(yùn)行ant debug來(lái)編譯你的程序時(shí),編譯腳本會(huì)生成一個(gè)keystore/key,并為apk進(jìn)行簽名。然后腳本會(huì)使用zipalign工具對(duì)apk進(jìn)行對(duì)齊處理。整個(gè)過(guò)程不需要你參與。閱讀“其它IDE下開發(fā):Debug模式編譯”來(lái)了解更多的信息。

    Debug證書過(guò)期

    Debug模式下簽名用的證書(默認(rèn)是Eclipse/ADTAnt編譯)自從它創(chuàng)建之日起,1年后就會(huì)失效。

    當(dāng)證書失效時(shí),你會(huì)得到一個(gè)編譯錯(cuò)誤,在Ant編譯上,錯(cuò)誤如下:

    debug:
    [echo]Packaging bin/samples-debug.apk,and signing it with a debug key...
    [exec]DebugCertificate expired on 8/4/083:43 PM

    Eclipse/ADT中,Android控制臺(tái)上你將會(huì)看到一個(gè)相似的錯(cuò)誤。

    為了解決這個(gè)問(wèn)題,只需要?jiǎng)h掉debug.keystore文件即可。AVD默認(rèn)存儲(chǔ)的位置在:~/.android/avdOS XLinux),C:"Documents and Settings"".android"Windows XP),C:"Users"".android"Windows Vista)。

    當(dāng)下一次編譯的時(shí)候,編譯工具會(huì)重新生成一個(gè)新的keystoreDebug key。

    Release模式下簽名

    當(dāng)你的程序準(zhǔn)備好釋放給其它用戶時(shí),你必須:

    1.   獲取一個(gè)合適的密鑰

    2.      Release模式下編譯程序

    3.      使用密鑰簽名程序

    4.      對(duì)齊APK包

    如果你是使用Eclipse/ADT插件開發(fā),你可以使用導(dǎo)出向?qū)?lái)完成編譯、簽名和對(duì)齊等操作。在整個(gè)過(guò)程中,導(dǎo)出向?qū)踔吝€可以生成一個(gè)新的keystore和密鑰。因此,如果你使用Eclipse,你可以直接跳到“使用Eclipse ADT編譯和簽名”。

    1. 獲取一個(gè)合適的密鑰

    為了進(jìn)行程序的簽名,首先,你必須有一個(gè)合適的密鑰。密鑰指:

    ·         個(gè)人持有。

    ·         代表個(gè)人、公司或組織實(shí)體的身份。

    ·         擁有一個(gè)有效期。有效期推薦超過(guò)25年。

    如果你在Android Market上發(fā)布你的程序,需要注意一點(diǎn)的是:程序的有效期需要在2033.10.22之后。你不能上傳一個(gè)應(yīng)用程序,而它的key的有效期是在這個(gè)日期之前。

    ·         不是由Android SDK工具生成的Debug key

    如果你沒有一個(gè)合適的key,你一定要使用Keytool來(lái)生成一個(gè)。如“基本設(shè)定”中描述的,確保Keytool可用。

    為了用Keytool生成一個(gè)key,使用keytool命令并傳入一些可選參數(shù),如下表所示。

    警告:確保密鑰的安全。一定要閱讀“安全儲(chǔ)存你的密鑰”中討論如何確保你的密鑰的安全以及這對(duì)你和用戶為何如此重要。尤其是,當(dāng)你生成你的密鑰時(shí),一定要為keystorekey使用強(qiáng)密碼。

    Keytool選項(xiàng)

    描述

    -genkey

    生成一個(gè)鍵對(duì)(公鑰和密鑰)

    -v

    日志輸出

    -keystore <keystore-name>.keystore

    命名包含密鑰的keystore

    -storepass <password>

    設(shè)定keystore的密碼。

    基于安全考慮,不要在命令行中包含這一選項(xiàng),除非你在一個(gè)安全的計(jì)算機(jī)上。如果你不提供,Keytool會(huì)提示你輸入。這樣,你的密碼就不會(huì)儲(chǔ)存在shell記錄中了。

    -alias <alias_name>

    設(shè)定key的別名

    -keyalg <alg>

    指定生成key時(shí)使用的加密算法。支持DSARSA。

    -dname <name>

    指定一個(gè)描述誰(shuí)創(chuàng)建key的名字。該值將填入證書發(fā)行人的字段。

    注意:你不需要在命令行中指明這些選項(xiàng)。如果不提供,Jarsigner會(huì)提示你輸入每個(gè)字段(CN,OU等)。

    -validity <valdays>

    Key的有效期,天數(shù)。

    注意:推薦使用10000或更大的數(shù)。

    -keypass <password>

    Key的密碼。

    基于安全考慮,不要在命令行中包含這一選項(xiàng),除非你在一個(gè)安全的計(jì)算機(jī)上。如果你不提供,Keytool會(huì)提示你輸入。這樣,你的密碼就不會(huì)儲(chǔ)存在shell記錄中了。

    下面是使用Keytool命令生成密鑰的例子:

    $ keytool -genkey -v -keystore my-release-key.keystore 
    -alias alias_name -keyalg RSA -validity 10000

    運(yùn)行上面的例子命令,Keytool會(huì)提示你輸入keystorekey的密碼,并且會(huì)提示你輸入key中其它的字段。然后,它會(huì)生成一個(gè)叫做my-release-key.keystore的文件。keystorekey受你輸入的密碼保護(hù)。keystore中包含一個(gè)key,有效期為10000天。別名將在后面用到,在程序簽名時(shí)指當(dāng)前這個(gè)keystore

    了解更多關(guān)于Keytool的信息,請(qǐng)參考http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security。

    2. Release模式下編譯程序

    為了給用戶釋放程序,你必須在Release模式下編譯程序。在Release模式下,編譯程序不會(huì)進(jìn)行默認(rèn)簽名,并且你需要使用密鑰進(jìn)行簽名。

    注意:你不能釋放未簽名的程序,或簽有Debug key的程序。

    使用Eclipse

    右擊Package Explorer中的工程,選擇Android Tools>Export Unsigned Application Package,導(dǎo)出一個(gè)未簽名的apk。然后指定未簽名apk的存儲(chǔ)位置。(另外,你也可以在Eclipse中打開AndroidManifest.xml文件,打開Manifest Tab,然后點(diǎn)擊Export an unsigned APK)。

    注意:你也可以使用導(dǎo)出向?qū)?lái)完成編譯和簽名步驟,參考“使用Eclipse/ADT編譯和簽名”。

    使用 Ant

    如果你正在使用Ant,那么你可以在ant命令中加入release選項(xiàng)來(lái)開啟Release模式。例如,如果你在包含build.xml文件的文件夾上運(yùn)行Ant,命令可能看起來(lái)是這樣:

    ant release

    一般,編譯腳本在編譯apk的時(shí)候不會(huì)進(jìn)行簽名。輸出的文件位于工程的bin/文件夾中,名為<your_project_name>-unsigned.apk。由于apk文件還沒有簽名,所以你必須手動(dòng)的使用密鑰進(jìn)行簽名,然后使用zipalign進(jìn)行對(duì)齊。

    然而,Ant編譯腳本也可以替你執(zhí)行簽名和對(duì)齊操作,前提是你在build.properties文件中提供了keystore的名字和key的別名。如果提供了這些信息,編譯腳本在執(zhí)行ant release命令時(shí)會(huì)提示你輸入keystorekey的密碼,對(duì)包進(jìn)行簽名并對(duì)齊。最后輸出的文件位于工程的bin/文件夾中,名為<your_project_name>-release.apk。如果按照上述自動(dòng)簽名和對(duì)齊操作執(zhí)行,那么,你就可以跳過(guò)下面的手動(dòng)步驟(步驟34)。了解如何在build.properties文件中指定keystorealias,請(qǐng)參考“其它IDE下開發(fā):Release模式編譯”。

    3. 使用密鑰簽名程序

    如果你已經(jīng)準(zhǔn)備好要簽名的程序包的話,你可以使用Jarsigner工具進(jìn)行簽名。如“基本設(shè)定”中描述的,請(qǐng)確保Jarsigner工具可用。此外,確保包含密鑰的keystore可用。

    為了簽名應(yīng)用程序,你需要運(yùn)行Jarsigner,并引用應(yīng)用程序的apk及包含密鑰的keystore。下表列出了你可能使用的選項(xiàng)。

    Jarsigner選項(xiàng)

    描述

    -keystore <keystore-name>.keystore

    指定包含密鑰的keystore的名字

    -verbose

    日志輸出

    -storepass <password>

    指定keystore的密碼。

    基于安全考慮,不要在命令行中包含這一選項(xiàng),除非你在一個(gè)安全的計(jì)算機(jī)上。如果你不提供,Jarsigner會(huì)提示你輸入。這樣,你的密碼就不會(huì)儲(chǔ)存在shell記錄中了

    -keypass <password>

    指定密鑰的密碼。

    基于安全考慮,不要在命令行中包含這一選項(xiàng),除非你在一個(gè)安全的計(jì)算機(jī)上。如果你不提供,Jarsigner會(huì)提示你輸入。這樣,你的密碼就不會(huì)儲(chǔ)存在shell記錄中了

    下面是一個(gè)使用Jarsigner對(duì)my_application.apk進(jìn)行簽名的例子,使用了上面創(chuàng)建的keystore。

    $ jarsigner -verbose -keystore my-release-key.keystore 
    my_application
    .apk alias_name

    運(yùn)行上面的示例命令,Jarsigner會(huì)提示你輸入keystorekey的密碼。然后它會(huì)修改apk文件,意味著apk文件現(xiàn)在已經(jīng)簽上名了。注意:你可以使用不同的key對(duì)apk多次簽名。

    檢驗(yàn)apk文件是否簽名,可以使用下面的命令:

    $ jarsigner -verify my_signed.apk

    如果apk簽名正確,Jarsigner輸出“jar verified”。如果你想了解更多的細(xì)節(jié),你可以嘗試這些命令:

    $ jarsigner -verify -verbose my_application.apk

    或者

    $ jarsigner -verify -verbose -certs my_application.apk

    上面的命令,添加-certs選項(xiàng),將會(huì)顯示“CN=”行,描述誰(shuí)創(chuàng)建了密鑰。

    注意:如果你看到“CN=Android Debug”,這意味apk文件使用Android SDK生成的Debug key簽的名。如果你想發(fā)布你的程序,你必須使用自己的密鑰替換Debug key進(jìn)行簽名。

    了解更多Jarsigner的信息,請(qǐng)參考http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security。

    4. 對(duì)齊APK

    一旦你對(duì)apk文件使用密鑰進(jìn)行簽名后,一定要運(yùn)行zipalign進(jìn)行對(duì)齊。這個(gè)工具能做到讓那些未壓縮的數(shù)據(jù)以特定的字節(jié)對(duì)齊。以4字節(jié)對(duì)齊能優(yōu)化性能。當(dāng)對(duì)齊后,Android系統(tǒng)能通過(guò)mmap()閱讀文件,即使它們包含二進(jìn)制數(shù)據(jù),而不是從包中拷貝所有的數(shù)據(jù)。好處是在運(yùn)行程序時(shí)減少了隨機(jī)讀取內(nèi)存的消耗。

    zipalignAndroid SDK提供,包含在tools/文件夾下。想對(duì)齊簽名后的apk,執(zhí)行:

    zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

    -v標(biāo)志表示開始日志輸出(可選)。4表示對(duì)齊的字節(jié)(不要使用非4的數(shù)字)。第一個(gè)文件參數(shù)是你的簽名后apk(輸入),第二個(gè)文件參數(shù)是目的apk文件(輸出)。如果你想覆蓋已經(jīng)存在的apk,添加-f標(biāo)志。

    注意:在你使用zipalign優(yōu)化包之前,輸入的apk必須是使用密鑰簽名后的。如果在zipalign操作之后再簽名,那么對(duì)齊操作就白做了。

    了解更多信息,請(qǐng)閱讀“zipalign”工具的文檔。

    使用Eclipse/ADT編譯和簽名

    如果你在使用Eclipse/ADT插件,你可以使用導(dǎo)出向?qū)?dǎo)出一個(gè)簽名的apk(甚至可以創(chuàng)建一個(gè)新的keystore,如果需要的話)。導(dǎo)出向?qū)婺阕隽怂信cKeytoolJarsigner交互的工作,并且使用GUI來(lái)簽名應(yīng)用程序,替代了上面提到的手動(dòng)編譯、簽名和對(duì)齊的操作。一旦向?qū)瓿闪司幾g和簽名,也還會(huì)使用zipalign執(zhí)行包的對(duì)齊操作。由于導(dǎo)出向?qū)б褂?/font>KeytooJarsigner。你應(yīng)該確保它們是可用的,如“簽名的基本設(shè)定”中描述的那樣。

    安全儲(chǔ)存你的密鑰

    維護(hù)密鑰的安全是極其重要的。如果你讓其他人使用了你的key,或者你把keystore和密碼放在一個(gè)不安全的地方以至于第三方人員找到并使用了的話,那么,你的授權(quán)認(rèn)證和用戶的信任都將受到連累。

    如果第三方?jīng)]有經(jīng)過(guò)你的允許拿走了你的key,那個(gè)人就可以簽名并發(fā)布應(yīng)用程序,并惡意替換或攻擊你的正版程序。這個(gè)人還可以簽名并發(fā)布應(yīng)用程序,利用你的名義來(lái)攻擊其它程序或者系統(tǒng)自身,或者破壞、偷取用戶數(shù)據(jù)。

    開發(fā)者的名聲依賴于正確的儲(chǔ)存你的密鑰,直到它過(guò)期。這里有幾個(gè)安全儲(chǔ)存密鑰的提示:

    ·         keykeystore設(shè)置強(qiáng)密碼。

    ·         當(dāng)你使用Keytool生成密鑰的時(shí)候,不要再命令行中添加-storepass-keypass選項(xiàng)。如果你這樣做了,在shell記錄中就可以獲取你的密碼。

    ·         相似的,當(dāng)使用Jarsigner來(lái)簽名程序時(shí),也不要在命令行中添加-storepass-keypass選項(xiàng)。

    ·         不要把密鑰給別人或借給別人,不要讓未授權(quán)的人知道你的keystorekey的密碼。

    總而言之,只要你在生成、使用和儲(chǔ)存密鑰時(shí)有安全意識(shí)的話,它還是很安全的。 



                                                                                                           --    學(xué)海無(wú)涯
            

    主站蜘蛛池模板: 亚洲av中文无码乱人伦在线观看| 久久久青草青青国产亚洲免观| 亚洲91av视频| 羞羞视频免费网站在线看| avtt亚洲天堂| 成年大片免费视频播放一级| 免费一看一级毛片全播放| 福利片免费一区二区三区| 亚洲AV无码成H人在线观看| 美女扒开尿口给男人爽免费视频 | 杨幂最新免费特级毛片| va亚洲va日韩不卡在线观看| 日本中文字幕免费看| 亚洲男人的天堂www| 日韩精品人妻系列无码专区免费| 久久亚洲AV成人出白浆无码国产| 国产精品视频免费观看| 亚洲中文字幕无码中文| 国产在线19禁免费观看国产| 一级做a爱过程免费视| 亚洲精品无码久久千人斩| 2021国内精品久久久久精免费| 久久精品亚洲AV久久久无码| 日韩中文字幕免费| 久久嫩草影院免费看夜色| 亚洲系列国产精品制服丝袜第| 成人免费午间影院在线观看| 黄色免费网站在线看| 国产v亚洲v天堂无码网站| 91精品国产免费久久久久久青草| 亚洲AV成人无码网天堂| 国产精品亚洲片在线观看不卡 | 亚洲日本在线观看| 久久久久久久免费视频| 成人a毛片视频免费看| 亚洲国产成人久久综合一| 卡一卡二卡三在线入口免费| 国产综合免费精品久久久| 亚洲欧洲日韩极速播放| 激情97综合亚洲色婷婷五| 国色精品卡一卡2卡3卡4卡免费|