最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

基于Netty的IM聊天加密技術(shù)學(xué)習(xí):一文理清常見的加密概念、術(shù)語(yǔ)等

2022-12-22 19:12 作者:nickkckckck  | 我要投稿

1、引言

在社區(qū)中,分享了很多篇基于Netty編寫的IM聊天入門文章(比如《跟著源碼學(xué)IM》系列、《基于Netty,從零開發(fā)IM》系列等),在這些文章中分享了各種IM通信算法原理和功能邏輯的實(shí)現(xiàn)。但是這樣簡(jiǎn)單的IM聊天系統(tǒng)是比較容易被竊聽的,如果想要在里面說(shuō)點(diǎn)悄悄話是不太安全的。

怎么辦呢?學(xué)過(guò)密碼學(xué)的朋友可能就想到了一個(gè)解決辦法,聊天的時(shí)候?qū)ο⒓用?,處理的時(shí)候再對(duì)消息進(jìn)行解密。是的,道理就是這樣。

但密碼學(xué)本身的理論就很復(fù)雜,加上相關(guān)的知識(shí)和概念又太多太雜,對(duì)于IM入門者來(lái)說(shuō),想要快速理清這些概念并實(shí)現(xiàn)合適的加解密方案,是比較頭疼的。

本文正好借此機(jī)會(huì),以Netty編寫的IM聊天加密為例,為入門者理清什么是PKI體系、什么是SSL、什么是OpenSSL、以及各類證書和它們間的關(guān)系等,并在文末附上簡(jiǎn)短的Netty代碼實(shí)示例,希望能助你通俗易懂地快速理解這些知識(shí)和概念!

補(bǔ)充說(shuō)明:本文為了讓文章內(nèi)容盡可能言簡(jiǎn)意賅、通俗易懂,盡量不深入探討各個(gè)技術(shù)知識(shí)和概念,感興趣的讀者可以自行查閱相關(guān)資料進(jìn)一步學(xué)習(xí)。

學(xué)習(xí)交流:

- 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM》

- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK(備用地址點(diǎn)此)

(本文已同步發(fā)布于:http://www.52im.net/thread-4104-1-1.html)

2、相關(guān)文章

  1. 《即時(shí)通訊安全篇(一):正確地理解和使用Android端加密算法》

  2. 《即時(shí)通訊安全篇(二):探討組合加密算法在IM中的應(yīng)用》

  3. 《即時(shí)通訊安全篇(三):常用加解密算法與通訊安全講解》

  4. 《即時(shí)通訊安全篇(四):實(shí)例分析Android中密鑰硬編碼的風(fēng)險(xiǎn)》

  5. 《即時(shí)通訊安全篇(五):對(duì)稱加密技術(shù)在Android平臺(tái)上的應(yīng)用實(shí)踐》

  6. 《即時(shí)通訊安全篇(六):非對(duì)稱加密技術(shù)的原理與應(yīng)用實(shí)踐》

  7. 《即時(shí)通訊安全篇(十):IM聊天系統(tǒng)安全手段之通信連接層加密技術(shù)》

  8. 《即時(shí)通訊安全篇(十一):IM聊天系統(tǒng)安全手段之傳輸內(nèi)容端到端加密技術(shù)》

3、什么是PKI?

我們需要先了解一下公鑰和私鑰的加密標(biāo)準(zhǔn)體系PKI。

3.1 基本概念

PKI的全稱是Public Key Infrastructure,是指支持公鑰管理體制的基礎(chǔ)設(shè)施,提供鑒別、加密、完整性和不可否認(rèn)性服務(wù)。

通俗講:PKI是集機(jī)構(gòu)、系統(tǒng)(硬件和軟件)、人員、程序、策略和協(xié)議為一體,利用公鑰概念和技術(shù)來(lái)實(shí)現(xiàn)和提供安全服務(wù)的、普適性的安全基礎(chǔ)設(shè)施。

在公鑰密碼中,發(fā)送者用公鑰(加密密鑰)加密,接收者用私鑰(解密密鑰)解密。公鑰一般是公開的,不再擔(dān)心竊聽,這解決了對(duì)稱密碼中的密鑰配送問(wèn)題。但是接收者依然無(wú)法判斷收到的公鑰是否合法(有可能是中間人假冒的)。

事實(shí)上,僅靠公鑰密碼本身,無(wú)法防御中間人攻擊。于是,需要(認(rèn)證機(jī)構(gòu))對(duì)公鑰進(jìn)行簽名,從而確認(rèn)公鑰沒(méi)有被篡改。加了數(shù)字簽名的公鑰稱為公鑰證書,一般簡(jiǎn)稱證書。

有了證書來(lái)認(rèn)證,可以有效防御中間人攻擊,隨之帶來(lái)了一系列非技術(shù)性工作。

例如:誰(shuí)來(lái)發(fā)證書?如何發(fā)證書?不同機(jī)構(gòu)的證書怎么互認(rèn)?紙質(zhì)證書作廢容易,數(shù)字證書如何作廢?解決這些問(wèn)題,需要制定統(tǒng)一的規(guī)則,即PKI體系。

PKI體系是通過(guò)頒發(fā)、管理公鑰證書的方式為終端用戶提供服務(wù)的系統(tǒng),最核心的元素是證書。

圍繞證書構(gòu)成了PKI體系的要素:

  • 1)使用PKI的用戶;

  • 2)頒發(fā)證書的機(jī)構(gòu)(Certificate Authority,CA);

  • 3)保存證書的倉(cāng)庫(kù)。

總之:PKI是一個(gè)總稱,既包括定義PKI的基礎(chǔ)標(biāo)準(zhǔn),也包括PKI的應(yīng)用標(biāo)準(zhǔn)。

3.2 PKI體系現(xiàn)狀

事實(shí)上PKI已經(jīng)有兩代了。

第一代的PKI標(biāo)準(zhǔn)主要是由美國(guó)RSA公司的公鑰加密標(biāo)準(zhǔn)PKCS、國(guó)際電信聯(lián)盟的ITU-T X.509、IETF的X.509、WAP和WPKI等標(biāo)準(zhǔn)組成。但是因?yàn)榈谝淮鶳KI標(biāo)準(zhǔn)是基于抽象語(yǔ)法符號(hào)ASN.1進(jìn)行編碼的,實(shí)現(xiàn)起來(lái)比較復(fù)雜和困難,所以產(chǎn)生了第二代PKI標(biāo)準(zhǔn)。

第二代PKI標(biāo)準(zhǔn)是由微軟、VeriSign和webMethods三家公司在2001年發(fā)布的基于XML的密鑰管理規(guī)范也叫做XKMS。

事實(shí)上現(xiàn)在CA中心使用的最普遍的規(guī)范還是X.509系列和PKCS系列。

X.509系列主要由X.209、X.500和X.509組成,其中X.509是由國(guó)際電信聯(lián)盟(ITU-T)制定的數(shù)字證書標(biāo)準(zhǔn)。在X.500基礎(chǔ)上進(jìn)行了功能增強(qiáng),X.509是在1988年發(fā)布的。

X.509證書由用戶公共密鑰和用戶標(biāo)識(shí)符組成。此外還包括版本號(hào)、證書序列號(hào)、CA標(biāo)識(shí)符、簽名算法標(biāo)識(shí)、簽發(fā)者名稱、證書有效期等信息。

而PKCS是美國(guó)RSA公司的公鑰加密標(biāo)準(zhǔn),包括了證書申請(qǐng)、證書更新、證書作廢表發(fā)布、擴(kuò)展證書內(nèi)容以及數(shù)字簽名、數(shù)字信封的格式等方面的一系列相關(guān)協(xié)議。它定義了一系列從PKCS#1到PKCS#15的標(biāo)準(zhǔn)。

其中最常用的是PKCS#7、PKCS#12和PKCS#10。PKCS#7 是消息請(qǐng)求語(yǔ)法,常用于數(shù)字簽名與加密,PKCS#12是個(gè)人消息交換與打包語(yǔ)法主要用來(lái)生成公鑰和私鑰(題外話:iOS程序員對(duì)PKCS#12不陌生,在實(shí)現(xiàn)APNs離線消推送時(shí)就需要導(dǎo)出.p12證明,正是這個(gè))。PKCS#10是證書請(qǐng)求語(yǔ)法。

4、什么是SSL?

4.1 基本概念

SSL(全稱 Secure Socket Layer)安全套接層是網(wǎng)景公司(Netscape)率先采用的網(wǎng)絡(luò)安全協(xié)議。它是在傳輸通信協(xié)議(TCP/IP)上實(shí)現(xiàn)的一種安全協(xié)議,采用公開密鑰技術(shù)。

通俗地說(shuō):SSL被設(shè)計(jì)成使用TCP來(lái)提供一種可靠的端到端的安全服務(wù),它不是單個(gè)協(xié)議,而是二層協(xié)議。低層是SSL記錄層,用于封裝不同的上層協(xié)議,另一層是被封裝的協(xié)議,即SSL握手協(xié)議,它可以讓服務(wù)器和客戶機(jī)在傳輸應(yīng)用數(shù)據(jù)之前,協(xié)商加密算法和加密密鑰,客戶機(jī)提出自己能夠支持的全部加密算法,服務(wù)器選擇最適合它的算法。

SSL特點(diǎn)是:它與應(yīng)用層協(xié)議獨(dú)立無(wú)關(guān)。上層的應(yīng)用層協(xié)議(例如:HTTP、FTP、Telnet等)能透明的建立于SSL協(xié)議之上。SSL協(xié)議在應(yīng)用層協(xié)議通信之前就已經(jīng)完成加密算法、通信密鑰的協(xié)商以及服務(wù)器認(rèn)證工作。在此之后應(yīng)用層協(xié)議所傳送的數(shù)據(jù)都會(huì)被加密,從而保證通信的私密性。

4.2 與TLS的關(guān)系

SSL是網(wǎng)景公司(Netscape)設(shè)計(jì),但I(xiàn)ETF將SSL作了標(biāo)準(zhǔn)化,即RFC2246,并將其稱為TLS(Transport Layer Security),其最新版本是RFC5246、版本1.2。

實(shí)際上:TLS是IETF在SSL3.0基礎(chǔ)上設(shè)計(jì)的,相當(dāng)于SSL的后續(xù)版本。所以我們通常都是SSL/TLS放一起說(shuō)。

5、什么是OpenSSL?

5.1 基本概念

?

OpenSSL是一個(gè)開放源代碼的軟件庫(kù),應(yīng)用程序可以使用這個(gè)包來(lái)進(jìn)行安全通信,它包括代碼、腳本、配置和過(guò)程的集合。例如:如果您正在編寫一個(gè)需要復(fù)雜安全加密的軟件,那么只有添加一個(gè)安全加密庫(kù)才有意義,這樣您就不必自己編寫一大堆復(fù)雜的加解密函數(shù)(而且密碼學(xué)本身很復(fù)雜,要寫好它們并不容易)。

其主要庫(kù)是以 C 語(yǔ)言所寫成,實(shí)現(xiàn)了基本的加密功能,實(shí)現(xiàn)了 SSL 與 TLS 協(xié)議。

OpenSSL整個(gè)軟件包大概可以分成三個(gè)主要功能部分:

  • 1)SSL協(xié)議庫(kù);

  • 2)應(yīng)用程序;

  • 3)密碼算法庫(kù)。

OpenSSL的目錄結(jié)構(gòu)自然也是圍繞這三個(gè)功能部分進(jìn)行規(guī)劃的。

OpenSSL 可以運(yùn)行在 OpenVMS、 Microsoft Windows 以及絕大多數(shù)類 Unix 操作系統(tǒng)上。

5.2 具體來(lái)說(shuō)

密鑰和證書管理是PKI的一個(gè)重要組成部分,OpenSSL為之提供了豐富的功能,支持多種標(biāo)準(zhǔn)。

OpenSSL實(shí)現(xiàn)了ASN.1的證書和密鑰相關(guān)標(biāo)準(zhǔn),提供了對(duì)證書、公鑰、私鑰、證書請(qǐng)求以及CRL等數(shù)據(jù)對(duì)象的DER、PEM和BASE64的編解碼功能。

OpenSSL提供了產(chǎn)生各種公開密鑰對(duì)和對(duì)稱密鑰的方法、函數(shù)和應(yīng)用程序,同時(shí)提供了對(duì)公鑰和私鑰的DER編解碼功能。并實(shí)現(xiàn)了私鑰的PKCS#12和PKCS#8的編解碼功能。

OpenSSL在標(biāo)準(zhǔn)中提供了對(duì)私鑰的加密保護(hù)功能,使得密鑰可以安全地進(jìn)行存儲(chǔ)和分發(fā)。

在此基礎(chǔ)上,OpenSSL實(shí)現(xiàn)了對(duì)證書的X.509標(biāo)準(zhǔn)編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。并提供了一種文本數(shù)據(jù)庫(kù),支持證書的管理功能,包括證書密鑰產(chǎn)生、請(qǐng)求產(chǎn)生、證書簽發(fā)、吊銷和驗(yàn)證等功能。

5.3 發(fā)展歷程

OpenSSL 計(jì)劃在 1998 年開始,其目標(biāo)是發(fā)明一套自由的加密工具,在互聯(lián)網(wǎng)上使用。

OpenSSL 以 Eric Young 以及 Tim Hudson 兩人開發(fā)的 SSLeay 為基礎(chǔ),隨著兩人前往 RSA 公司任職,SSLeay 在 1998 年 12 月停止開發(fā)。因此在 1998 年 12 月,社群另外分支出 OpenSSL,繼續(xù)開發(fā)下去。

▲ 上圖為 Tim Hudson

OpenSSL 管理委員會(huì)當(dāng)前由 7 人組成有 13 個(gè)開發(fā)人員具有提交權(quán)限(其中許多人也是 OpenSSL 管理委員會(huì)的一部分)。只有兩名全職員工(研究員),其余的是志愿者。

該項(xiàng)目每年的預(yù)算不到 100 萬(wàn)美元,主要依靠捐款。 TLS 1.3 的開發(fā)由 Akamai 贊助。

5.4 下載方法

OpenSSL可以從其官網(wǎng)上下載,地址是:https://www.openssl.org/source/,感興趣的讀者可以自行下載安裝研究。

6、各類證書

6.1 證書類型

操作過(guò)證書的朋友可能會(huì)對(duì)各種證書類型眼花繚亂,典型的體現(xiàn)就是各種不同的證書擴(kuò)展名上,一般來(lái)說(shuō)會(huì)有DER、CRT、CER、PEM這幾種證書的擴(kuò)展名。

以下是最常見的幾種:

  • 1)DER文件:表示證書的內(nèi)容是用二進(jìn)制進(jìn)行編碼的;

  • 2)PEM文件:是一個(gè)文本文件,其內(nèi)容是以“ - BEGIN -” 開頭的,Base64編碼的字符;

  • 3)CRT和CER文件:基本上是等價(jià)的,他們都是證書的擴(kuò)展,也是文本文件,不同的是CRT通常用在liunx和unix系統(tǒng)中,而CER通常用在windows系統(tǒng)中。并且在windows系統(tǒng)中,CER文件會(huì)被MS cryptoAPI命令識(shí)別,可以直接顯示導(dǎo)入和/或查看證書內(nèi)容的對(duì)話框;

  • 4)KEY文件:主要用來(lái)保存PKCS#8標(biāo)準(zhǔn)的公鑰和私鑰。

6.2 常用OpenSSL命令

下面的命令可以用來(lái)查看文本證書內(nèi)容:

openssl x509 -incert.pem -text -noout

openssl x509 -incert.cer -text -noout

openssl x509 -incert.crt -text -noout

下面的命令可以用來(lái)查看二進(jìn)制證書內(nèi)容:

openssl x509 -incert.der -inform der -text -noout

下面是常見的PEM和DER相互轉(zhuǎn)換。

PEM到DER的轉(zhuǎn)換:

openssl x509 -incert.crt -outform der-out cert.der

DER到PEM的轉(zhuǎn)換:

openssl x509 -incert.crt -inform der -outform pem -out cert.pem

補(bǔ)充說(shuō)明:上述命令中用到的openssl程序,就是本文中提到的OpenSSL開源庫(kù)提供的程序。

7、Netty中的聊天加密代碼示例

7.1 關(guān)于Netty

Netty是一個(gè)Java NIO技術(shù)的開源異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)編程框架,用于快速開發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶端,事實(shí)上用Java開發(fā)IM系統(tǒng)時(shí),Netty是幾乎是首選。

有關(guān)Netty的介紹我就不啰嗦了,如果不了解那就詳讀以下幾篇:

《史上最強(qiáng)Java NIO入門:擔(dān)心從入門到放棄的,請(qǐng)讀這篇!》

《Java的BIO和NIO很難懂?用代碼實(shí)踐給你看,再不懂我轉(zhuǎn)行!》

《新手入門:目前為止最透徹的的Netty高性能原理和框架架構(gòu)解析》

《史上最通俗Netty框架入門長(zhǎng)文:基本介紹、環(huán)境搭建、動(dòng)手實(shí)戰(zhàn)》

基它有關(guān)Netty的重要資料:

Netty-4.1.x 源碼 (在線閱讀版)

Netty-4.1.x API文檔 (在線查閱版)

7.2 啟動(dòng)SSL Server代碼示例

事實(shí)上這個(gè)標(biāo)題是不對(duì)的,Netty中啟動(dòng)的server還是原來(lái)那個(gè)server,只是對(duì)發(fā)送的消息進(jìn)行了加密解密處理。也就是說(shuō)添加了一個(gè)專門進(jìn)行SSL操作的Handler。

netty中代表ssl處理器的類叫做SslHandler,它是SslContext工程類的一個(gè)內(nèi)部類,所以我們只需要?jiǎng)?chuàng)建好SslContext即可通過(guò)調(diào)用newHandler方法來(lái)返回SslHandler。

讓服務(wù)器端支持SSL的代碼:

ChannelPipeline p = channel.pipeline();

??SslContext sslCtx = SslContextBuilder.forServer(...).build();

??p.addLast("ssl", sslCtx.newHandler(channel.alloc()));

讓客戶端支持SSL的代碼:

ChannelPipeline p = channel.pipeline();

???SslContext sslCtx = SslContextBuilder.forClient().build();

???p.addLast("ssl", sslCtx.newHandler(channel.alloc(), host, port));

netty中SSL的實(shí)現(xiàn)有兩種方式,默認(rèn)情況下使用的是OpenSSL,如果OpenSSL不可以,那么將會(huì)使用JDK的實(shí)現(xiàn)。

要?jiǎng)?chuàng)建SslContext,可以調(diào)用SslContextBuilder.forServer或者SslContextBuilder.forClient方法。

這里以server為例,看下創(chuàng)建流程。

SslContextBuilder有多種forServer的方法,這里取最簡(jiǎn)單的一個(gè)進(jìn)行分析:

publicstaticSslContextBuilder forServer(File keyCertChainFile, File keyFile) {

????returnnewSslContextBuilder(true).keyManager(keyCertChainFile, keyFile);

}

該方法接收兩個(gè)參數(shù):

  • 1)keyCertChainFile是一個(gè)PEM格式的X.509證書文件;

  • 2)keyFile是一個(gè)PKCS#8的私鑰文件。

熟悉OpenSSL的童鞋應(yīng)該知道使用openssl命令可以生成私鑰文件和對(duì)應(yīng)的自簽名證書文件。

具體openssl的操作可以查看我的其他文章,這里就不詳細(xì)講解了。

除了手動(dòng)創(chuàng)建證書文件和私鑰文件之外,如果是在開發(fā)環(huán)境中,大家可能希望有一個(gè)非常簡(jiǎn)單的方法來(lái)創(chuàng)建證書和私鑰文件,netty為大家提供了SelfSignedCertificate類。

看這個(gè)類的名字就是知道它是一個(gè)自簽名的證書類,并且會(huì)自動(dòng)將證書文件和私鑰文件生成在系統(tǒng)的temp文件夾中,所以這個(gè)類在生產(chǎn)環(huán)境中是不推薦使用的。默認(rèn)情況下該類會(huì)使用OpenJDK's X.509來(lái)生成證書的私鑰,如果不可以,則使用 Bouncy Castle作為替代。

7.3 啟動(dòng)SSL Client代碼示例

同樣的在client中支持SSL也需要?jiǎng)?chuàng)建一個(gè)handler。

客戶端的SslContext創(chuàng)建代碼如下:

// 配置 SSL.

finalSslContext sslCtx = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();

上面的代碼我們使用了一個(gè)InsecureTrustManagerFactory.INSTANCE作為trustManager。

什么是trustManager呢?

當(dāng)客戶端和服務(wù)器端進(jìn)行SSL連接的時(shí)候,客戶端需要驗(yàn)證服務(wù)器端發(fā)過(guò)來(lái)證書的正確性。

通常情況下,這個(gè)驗(yàn)證是到CA服務(wù)器中進(jìn)行驗(yàn)證的,不過(guò)這樣需要一個(gè)真實(shí)的CA證書環(huán)境,所以在測(cè)試中,我們使用InsecureTrustManagerFactory,這個(gè)類會(huì)默認(rèn)接受所有的證書,忽略所有的證書異常。

當(dāng)然:CA服務(wù)器也不是必須的,客戶端校驗(yàn)的目的是查看證書中的公鑰和發(fā)送方的公鑰是不是一致的,那么對(duì)于不能聯(lián)網(wǎng)的環(huán)境,或者自簽名的環(huán)境中,我們只需要在客戶端校驗(yàn)證書中的指紋是否一致即可。

netty中提供了一個(gè)FingerprintTrustManagerFactory類,可以對(duì)證書中的指紋進(jìn)行校驗(yàn)。

該類中有個(gè)fingerprints數(shù)組,用來(lái)存儲(chǔ)安全的授權(quán)過(guò)的指紋信息。通過(guò)對(duì)比傳入的證書和指紋,如果一致則校驗(yàn)通過(guò)。

使用openssl從證書中提取指紋的步驟如下:

openssl x509 -fingerprint -sha256 -inmy_certificate.crt

8、小結(jié)一下

上面我們對(duì)Netty聊天用到的加密技術(shù)和相關(guān)概念進(jìn)行了梳理,我來(lái)簡(jiǎn)單這些概念之間的關(guān)系。

這些概念之間的關(guān)系,簡(jiǎn)單來(lái)說(shuō)就是:

  • 1)PKI:是一套加密體系和標(biāo)準(zhǔn)的合集,它是理論方案;

  • 2)SSL:是利用了PKI理論體系,針對(duì)Socket網(wǎng)絡(luò)這個(gè)場(chǎng)景設(shè)計(jì)的一套安全通信標(biāo)準(zhǔn),屬于是PKI的一個(gè)具體應(yīng)用場(chǎng)景;

  • 3)OpenSSL:是PKI體系及SSL標(biāo)準(zhǔn)的算法和代碼實(shí)現(xiàn),它包括了具體的開源代碼、工具程序等;

  • 4)各種證書:是在SSL或其它基于PKI體系的安全協(xié)議標(biāo)準(zhǔn)中需要使用的到一些加密憑證文件等。

而具體到Netty中的聊天加密,那就是應(yīng)用了上述的PKI體系,基于SSL協(xié)議,在OpenSSL等開源庫(kù)的幫助下實(shí)現(xiàn)的安全程序。

9、參考資料

[1]?公鑰基礎(chǔ)設(shè)施(PKI)國(guó)際標(biāo)準(zhǔn)進(jìn)展

[2]?一篇文章讓你徹底弄懂SSL/TLS協(xié)議

[3]?什么是OpenSSL?它有什么用途

[4]?OpenSSL是什么軟件

[5]?netty系列之對(duì)聊天進(jìn)行加密

[6]?跟著源碼學(xué)IM

[7]?基于Netty,從零開發(fā)IM

[8]?TCP/IP詳解(全網(wǎng)唯一在線閱讀版)

[9]?快速理解TCP協(xié)議一篇就夠

[10]?Netty-4.1.x 源碼(在線閱讀版)

[11]?Netty-4.1.x API文檔(在線版)

(本文已同步發(fā)布于:http://www.52im.net/thread-4104-1-1.html)


基于Netty的IM聊天加密技術(shù)學(xué)習(xí):一文理清常見的加密概念、術(shù)語(yǔ)等的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
宣汉县| 安顺市| 玛曲县| 茂名市| 河北区| 科技| 文昌市| 射洪县| 云安县| 新蔡县| 纳雍县| 武冈市| 湘潭市| 巢湖市| 韶山市| 邵阳市| 高邑县| 启东市| 吴忠市| 阿勒泰市| 洪湖市| 宁海县| 固阳县| 巴彦淖尔市| 静安区| 石景山区| 高阳县| 桐城市| 衡山县| 康定县| 大英县| 嫩江县| 天门市| 肥乡县| 图木舒克市| 富源县| 长葛市| 卢氏县| 奎屯市| 威远县| 扶余县|