成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何在Tomcat中做TLS客戶端認(rèn)證

sugarmo / 3247人閱讀

摘要:順便一提,如果要使用客戶端認(rèn)證就必須使用服務(wù)端認(rèn)證。修改,添加如下可以看到我們開啟了客戶端認(rèn)證,也開啟了服務(wù)端認(rèn)證。所以如果要正確訪問得像下面這樣,指定證書,以及客戶端自己簽發(fā)的證書及測(cè)試我們現(xiàn)在用來訪問看看。

常見的https網(wǎng)站做的是服務(wù)端認(rèn)證(server authentication),瀏覽器通過證書判斷你所訪問的https://baidu.com是否真的是百度,而不是其他人偽造的網(wǎng)站。同時(shí)還對(duì)流量加密,防止別人竊聽你的流量。

tls還可以做客戶端認(rèn)證(client authentication),即服務(wù)端判斷客戶端是否為其所信任的客戶端。由此可見,客戶端認(rèn)證用于那些需要受控訪問服務(wù)端。

在數(shù)據(jù)中心中,有些服務(wù)是非常敏感的,那么我們要做到:

客戶端和我的流量是加密的,防止別人監(jiān)聽

客戶端能夠確認(rèn)所訪問的服務(wù)端的確是我們提供的服務(wù)端,而不是別人偽造的服務(wù)端

只有我信任的客戶端可以訪問我,防止惡意請(qǐng)求

所以很明顯,前兩個(gè)問題可以通過服務(wù)端認(rèn)證解決,最后一個(gè)問題可以通過客戶端認(rèn)證解決。順便一提,如果要使用客戶端認(rèn)證就必須使用服務(wù)端認(rèn)證。

先來講講概念然后舉個(gè)tomcat的例子講講怎么做。

概念 服務(wù)端認(rèn)證

不論是做Server authentication還是Client authentication都需要證書。證書的來源有兩種:

由權(quán)威CA簽發(fā),一般都是去購(gòu)買。也可以使用let"s encrypt申請(qǐng)免費(fèi)證書。

自己簽發(fā)

在一切可能的情況下都應(yīng)該使用權(quán)威CA簽發(fā)的證書,為什么這么建議?因?yàn)檫@里牽涉到一個(gè)信任問題,瀏覽器、編程語言SDK和某些工具都維護(hù)了一個(gè)信任CA證書清單,只要是由這些CA簽發(fā)的證書那就信任,否則就不信任。而這個(gè)鏈條是可以多級(jí)的,這里就不展開了。你只需要知道由信任CA簽發(fā)的所有證書都是可信的。比如JDK自帶的信任CA證書可以通過下面命令看到:

keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts

verisignclass2g2ca [jdk], 2016-8-25, trustedCertEntry,
證書指紋 (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D
digicertassuredidg3 [jdk], 2016-8-25, trustedCertEntry,
證書指紋 (SHA1): F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89
verisignuniversalrootca [jdk], 2016-8-25, trustedCertEntry,
...

讓你輸密碼的時(shí)候輸入changeit。

如果這個(gè)證書不是由信任CA簽發(fā)的(比如自己簽發(fā))會(huì)發(fā)生什么?瀏覽器、編程語言SDK、你所使用的工具會(huì)報(bào)告以下錯(cuò)誤:

curl:

curl: (60) SSL certificate problem: self signed certificate in certificate chain

Java:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:328)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:322)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1614)
...

瀏覽器:

這個(gè)錯(cuò)誤實(shí)際上就是在告訴你這個(gè)證書不可信任,可能是一個(gè)偽造站點(diǎn),讓你小心點(diǎn)兒。如果這個(gè)證書由權(quán)威CA簽發(fā),那么就沒有這個(gè)問題了。但是權(quán)威CA簽發(fā)的證書要求申請(qǐng)人擁有域名,如果你這個(gè)服務(wù)是內(nèi)部使用的沒有域名,那就只能自己簽發(fā)了。那么如何解決上面的問題呢?你得把自己簽發(fā)的證書加入到信任CA證書清單里。

下圖是權(quán)威CA簽發(fā)證書的示例:

可以看到客戶端有一個(gè)truststore,這個(gè)就是存放信任CA證書的地方,服務(wù)端有一個(gè)keystore,存放的自己的證書及對(duì)應(yīng)的私鑰。

下圖是自簽發(fā)證書的示例:

在上面可以看到我們自己成為了一個(gè)Root CA,把它放到客戶端的truststore里。

客戶端認(rèn)證

前面講過客戶端認(rèn)證是服務(wù)端來驗(yàn)證客戶端是否可信的機(jī)制,其實(shí)做法和服務(wù)端認(rèn)證類似只不過方向相反。客戶端認(rèn)證大多數(shù)情況下只能是自簽發(fā)的(因?yàn)闆]有域名),雖然不是不可以從權(quán)威CA簽發(fā)但是存在一些問題。下面解釋為什么,假設(shè)權(quán)威CA是let"s encrypt,然后服務(wù)端信任它簽發(fā)的所有證書。但是let"s encrypt是阿貓阿狗都可以申請(qǐng)的,現(xiàn)在有一個(gè)黑客申請(qǐng)了這個(gè)證書,然后請(qǐng)求你的服務(wù)端,服務(wù)端就認(rèn)可了。

上面這個(gè)問題可以用這個(gè)方法解決:比如你用let"s encrypt申請(qǐng)了A證書,黑客用let"s encrypt申請(qǐng)了B證書,你的服務(wù)端的truststore只信任A證書,那么黑客用B證書訪問你的時(shí)候就會(huì)被拒絕。但是這就帶來另一個(gè)問題,比如你在開發(fā)的時(shí)候客戶端證書有這么幾套:生產(chǎn)用、調(diào)試用、開發(fā)用,那么每次客戶端簽發(fā)一個(gè)證書都要更新到你的服務(wù)器的truststore里,這也太麻煩了。

所以結(jié)合安全性和便利性,我們把自己變成Root CA,然后服務(wù)端信任它,這樣一來服務(wù)端就可以在開發(fā)的時(shí)候把Client Root CA內(nèi)置進(jìn)去,大大減輕了維護(hù)truststore的工作量,看下圖:

用Tomcat舉個(gè)例子

下面舉一個(gè)Tomcat做客戶端認(rèn)證的例子,因?yàn)槭菧y(cè)試用,所以服務(wù)端認(rèn)證也是用的自簽發(fā)證書。

我們用了cfssl這個(gè)工具來生成證書。

服務(wù)端

先弄一套目錄:

# 放自簽發(fā)的服務(wù)端CA根證書
server-secrets/ca
# 放自簽發(fā)的服務(wù)端的證書
server-secrets/cert
# 放服務(wù)端的keystore和truststore
server-secrets/jks
生成自簽名CA證書

新建文件:server-secrets/ca/server-root-ca-csr.json

內(nèi)容如下:

{
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "O": "Company",
      "OU": "Datacenter",
      "L": "Shanghai",
      "ST": "Shanghai",
      "C": "CN"
    }
  ],
  "CN": "server-root-ca"
}

運(yùn)行下面命令生成Server ROOT CA證書:

cfssl gencert --initca=true ./server-root-ca-csr.json | cfssljson --bare server-root-ca

會(huì)得到下面幾個(gè)文件:

server-secrets/ca/
├── server-root-ca-key.pem
├── server-root-ca.csr
└── server-root-ca.pem

用下面命令驗(yàn)證證書:

openssl x509 -in ./server-root-ca.pem -text -noout

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0c:8a:1a:ca:da:fa:4c:17:6c:1f:42:40:4c:f1:90:f4:fd:1d:fe:58
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=server-root-ca
        Validity
            Not Before: Mar 27 05:14:00 2019 GMT
            Not After : Mar 25 05:14:00 2024 GMT
        Subject: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=server-root-ca

可以看到簽發(fā)人和被簽發(fā)人是同一個(gè)。

生成自簽發(fā)證書

新建文件 server-secrets/cert/server-gencert.json,內(nèi)容如下:

{
  "signing": {
    "default": {
        "usages": [
          "signing",
          "key encipherment",
          "server auth"
        ],
        "expiry": "87600h"
    }
  }
}

可以看到我們會(huì)生成用來做server auth的證書。

新建文件 server-secrets/cert/demo-csr.json,內(nèi)容如下:

{
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "O": "Company",
      "OU": "Datacenter",
      "L": "Shanghai",
      "ST": "Shanghai",
      "C": "CN"
    }
  ],
  "CN": "server-demo",
  "hosts": [
    "127.0.0.1",
    "localhost"
  ]
}

看上面的hosts,你可以根據(jù)自己的需要填寫域名或IP,這里因?yàn)槭潜镜匮菔舅允?27.0.0.1和localhost。

運(yùn)行下面命令生成證書

cfssl gencert 
  --ca ../ca/server-root-ca.pem 
  --ca-key ../ca/server-root-ca-key.pem 
  --config ./server-gencert.json 
  ./demo-csr.json | cfssljson --bare ./demo

得到文件:

server-secrets/cert/
├── demo-key.pem
├── demo.csr
└── demo.pem

驗(yàn)證結(jié)果:

openssl x509 -in ./demo.pem -text -noout

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            1d:d0:51:97:6c:ce:ea:29:2a:f4:3b:3c:48:a3:69:b0:ef:f3:26:7b
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=server-root-ca
        Validity
            Not Before: Mar 27 05:17:00 2019 GMT
            Not After : Mar 24 05:17:00 2029 GMT
        Subject: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=server-demo

可以看到簽發(fā)者是server-root-ca,Subject是server-demo。

將證書導(dǎo)入keystore

到 server-secrets/jks,執(zhí)行下面命令生成pkcs12格式的keystore(JDK識(shí)別這個(gè)格式)

openssl pkcs12 -export 
  -in ../cert/demo.pem 
  -inkey ../cert/demo-key.pem 
  -out server-demo.keystore 
  -name server-demo 
  -CAfile ../ca/server-root-ca.pem 
  -caname root -chain

過程中會(huì)讓你輸入密碼,你就輸入:server-demo-ks。

得到文件:

server-secrets/jks/
└── server-demo.keystore

用JDK提供的keytool看看里面的內(nèi)容:

keytool -list -keystore server-demo.keystore

server-demo, 2019-3-27, PrivateKeyEntry,
證書指紋 (SHA1): B2:E5:46:63:BB:00:E7:82:48:A4:2F:EC:01:41:CE:B4:4B:CE:68:7A

讓你輸入密碼的時(shí)候就輸入:server-demo-ks。

客戶端

先弄一套目錄:

# 放自簽發(fā)的客戶端CA根證書
client-secrets/ca
# 放自簽發(fā)的客戶端的證書
client-secrets/cert
# 放客戶端的keystore和truststore
client-secrets/jks
生成自簽名CA證書

新建文件 client-secrets/ca/client-root-ca-csr.json:

{
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "O": "Company",
      "OU": "Datacenter",
      "L": "Shanghai",
      "ST": "Shanghai",
      "C": "CN"
    }
  ],
  "CN": "client-root-ca"
}

運(yùn)行下面命令生成Client ROOT CA證書:

cfssl gencert --initca=true ./client-root-ca-csr.json | cfssljson --bare client-root-ca

會(huì)得到下面幾個(gè)文件:

client-secrets/ca/
├── client-root-ca-key.pem
├── client-root-ca.csr
└── client-root-ca.pem

用下面命令驗(yàn)證證書:

openssl x509 -in ./client-root-ca.pem -text -noout

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            7e:fc:f3:53:07:1a:17:ae:24:34:d5:1d:00:02:d6:e4:24:09:92:12
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=client-root-ca
        Validity
            Not Before: Mar 27 05:20:00 2019 GMT
            Not After : Mar 25 05:20:00 2024 GMT
        Subject: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=client-root-ca

可以看到簽發(fā)人和被簽發(fā)人是同一個(gè)。

生成自簽發(fā)證書

新建文件 client-secrets/cert/client-gencert.json,內(nèi)容如下:

{
  "signing": {
    "default": {
        "usages": [
          "signing",
          "key encipherment",
          "client auth"
        ],
        "expiry": "87600h"
    }
  }
}

可以看到我們會(huì)生成用來做client auth的證書。

新建文件 client-secrets/cert/demo-csr.json,內(nèi)容如下:

{
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "O": "Company",
      "OU": "Datacenter",
      "L": "Shanghai",
      "ST": "Shanghai",
      "C": "CN"
    }
  ],
  "CN": "client-demo"
}

這里沒有hosts,這是因?yàn)槲覀儾恍枰眠@個(gè)證書來做服務(wù)端認(rèn)證。

運(yùn)行下面命令生成證書

cfssl gencert 
  --ca ../ca/client-root-ca.pem 
  --ca-key ../ca/client-root-ca-key.pem 
  --config ./client-gencert.json 
  ./demo-csr.json | cfssljson --bare ./demo

得到文件:

client-secrets/cert/
├── demo-key.pem
├── demo.csr
└── demo.pem

驗(yàn)證結(jié)果:

openssl x509 -in ./demo.pem -text -noout

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            6e:50:e2:2c:02:bb:ef:fd:03:d9:2c:0a:8f:ba:90:65:fb:c4:b5:75
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=client-root-ca
        Validity
            Not Before: Mar 27 05:21:00 2019 GMT
            Not After : Mar 24 05:21:00 2029 GMT
        Subject: C=CN, ST=Shanghai, L=Shanghai, O=Company, OU=Datacenter, CN=client-demo

可以看到簽發(fā)者是client-root-ca,Subject是client-demo。

將證書導(dǎo)入keystore

到 client-secrets/jks,執(zhí)行下面命令生成pkcs12格式的keystore(JDK識(shí)別這個(gè)格式)

openssl pkcs12 -export 
  -in ../cert/demo.pem 
  -inkey ../cert/demo-key.pem 
  -out client-demo.keystore 
  -name client-demo 
  -CAfile ../ca/client-root-ca.pem 
  -caname root -chain

過程中會(huì)讓你輸入密碼,你就輸入:client-demo-ks。

得到文件:

client-secrets/jks/
└── client-demo.keystore

用JDK提供的keytool看看里面的內(nèi)容:

keytool -list -keystore client-demo.keystore

client-demo, 2019-3-27, PrivateKeyEntry,
證書指紋 (SHA1): 83:AE:0E:5E:0C:CE:86:C9:D1:84:D7:6F:87:F3:76:1F:B4:3E:46:31

讓你輸入密碼的時(shí)候就輸入:client-demo-ks。

兩端互信

好了,到此為止server和client的證書都已經(jīng)生成了,接下來只需要將各自的root-ca添加到彼此都truststore中。

把server-root-ca導(dǎo)入到client的truststore中
cd client-secrets/jks

keytool -importcert 
  -alias server-root-ca 
  -storetype pkcs12 
  -keystore client.truststore 
  -storepass client-ts 
  -file ../../server-secrets/ca/server-root-ca.pem -noprompt

注意上面的-storepass參數(shù),這個(gè)是trustore的密碼:client-ts。

得到文件:

client-secrets/jks/
└── client.truststore

用JDK提供的keytool看看里面的內(nèi)容:

keytool -list -keystore client.truststore

server-root-ca, 2019-3-27, trustedCertEntry,
證書指紋 (SHA1): 75:E3:78:97:85:B2:29:38:25:3C:FD:EC:68:97:9B:78:A0:5F:BB:9D

讓你輸入密碼的時(shí)候就輸入:client-ts。

把client-root-ca導(dǎo)入到server的truststore中
cd server-secrets/jks

keytool -importcert 
  -alias client-root-ca 
  -storetype pkcs12 
  -keystore server.truststore 
  -storepass server-ts 
  -file ../../client-secrets/ca/client-root-ca.pem -noprompt

注意上面的-storepass參數(shù),這個(gè)是trustore的密碼:server-ts。

得到文件:

server-secrets/jks/
└── server.truststore

用JDK提供的keytool看看里面的內(nèi)容:

keytool -list -keystore server.truststore

client-root-ca, 2019-3-27, trustedCertEntry,
證書指紋 (SHA1): 1E:95:2C:12:AA:7E:6D:E7:74:F1:83:C2:B8:73:6F:EE:57:FB:CA:46

讓你輸入密碼的時(shí)候就輸入:server-ts。

配置Tomcat

好了,我們現(xiàn)在client和server都有了自己證書放在了自己的keystore中,而且把彼此的root-ca證書放到了自己的truststore里。現(xiàn)在我們弄一個(gè)tomcat作為server,然后為他配置SSL。

修改tomcat/conf/server.xml,添加如下Connector:


    
        
    

可以看到我們開啟了客戶端認(rèn)證certificateVerification="required",也開啟了服務(wù)端認(rèn)證。記得修改上面的keystore和truststore的路徑。

修改tomcat/conf/web.xml,添加如下元素:


  
    Automatic Forward to HTTPS/SSL
    /*
  
  
    CONFIDENTIAL
  

這個(gè)作用是當(dāng)訪問8080端口時(shí),都跳轉(zhuǎn)到8443端口,強(qiáng)制走HTTPS。

啟動(dòng)tomcat:

tomcat/bin/catalina.sh run
用curl測(cè)試

好了,我們現(xiàn)在用curl來測(cè)試訪問一下:

curl https://localhost:8443/

curl: (60) SSL certificate problem: self signed certificate in certificate chain
...

看到curl說服務(wù)端用的是一個(gè)自簽發(fā)的證書,不可信,也就是說服務(wù)端認(rèn)證失敗。添加--insecure試試:

curl --insecure https://localhost:8443/

curl: (35) error:1401E412:SSL routines:CONNECT_CR_FINISHED:sslv3 alert bad certificate

這里就說明客戶端認(rèn)證失敗。

所以如果要正確訪問得像下面這樣,指定server-root-ca證書,以及客戶端自己簽發(fā)的證書及private key:

curl --cacert server-secrets/ca/server-root-ca.pem 
  --key client-secrets/cert/demo-key.pem 
  --cert client-secrets/cert/demo.pem 
  https://localhost:8443/



...
Httpclient測(cè)試

我們現(xiàn)在用Httpclient來訪問看看。pom.xml中添加依賴:


  org.apache.httpcomponents
  httpclient
  4.5.7

Java代碼,記得把文件路徑改掉:

import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.IOException;

public class Client {

  public static void main(String[] args) throws Exception {

    SSLContext sslcontext = SSLContexts.custom()
        .loadTrustMaterial(
            new File("/path/to/client-secrets/demo-jks/client.truststore"),
            "client-ts".toCharArray()
        )
        .loadKeyMaterial(
            new File("/path/to/client-secrets/demo-jks/client-demo.keystore"),
            "client-demo-ks".toCharArray(),
            "client-demo-ks".toCharArray())
        .build();

    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslcontext,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());

    CloseableHttpClient httpclient = HttpClients.custom()
        .setSSLSocketFactory(sslsf)
        .build();

    HttpGet httpGet = new HttpGet("https://localhost:8443");
    CloseableHttpResponse response = httpclient.execute(httpGet);
    try {
      System.out.println(response.getStatusLine());
      HttpEntity entity = response.getEntity();
      System.out.println(EntityUtils.toString(entity));
    } finally {
      response.close();
    }

  }
}
安全性考慮

所有private key都很重要!如果它被泄漏了,就要回收它所對(duì)應(yīng)都證書。如果CA的private key泄漏了,那么用它簽發(fā)的所有證書都要被回收。

keystore和truststore的密碼設(shè)置的要復(fù)雜一些。

關(guān)于反向代理

因?yàn)榉?wù)端認(rèn)證所需要的證書直接配置在Tomcat上的,因此在做反向代理的時(shí)候不能使用SSL Termination模式,而是得使用SSL Passthrough模式。

其他語言、SDK、工具

上面講的方法不是只適用于Tomcat和Httpclient的,TLS的服務(wù)端認(rèn)證與客戶端認(rèn)證應(yīng)該在絕大部分的語言、SDK、類庫(kù)都有支持,請(qǐng)自行參閱文檔實(shí)踐。文中的keystore和truststore是Java特有的,不過不必迷惑,因?yàn)樗鼈儍H僅起到一個(gè)存放證書和private key的保險(xiǎn)箱,有些語言或工具則是直接使用證書和private key,比如前面提到的curl。

參考資料

cfssl

SSL/TLS Configuration HOW-TO

SSL Support

CONFIGURING TOMCAT SSL CLIENT/SERVER AUTHENTICATION,這篇文章有點(diǎn)古老了,server.xml的配置方式已經(jīng)不一樣了,僅供參考。

ClientCustomSSL.java

JSSE Reference Guide

一些基礎(chǔ)概念:

Basics of Digital Certificates and Certificate Authority,基礎(chǔ)概念,挺重要

Create Your Own Certificate and CA,這篇文章挺重要的,主要講了如何使用keytool和openssl來生成證書的過程

Introducing TLS with Client Authentication

The magic of TLS, X509 and mutual authentication explained

其他運(yùn)用客戶端認(rèn)證的軟件的相關(guān)文檔,很有啟發(fā):

Etcd - Play etcd TLS部分

Etcd - Example 2: Client-to-server authentication with HTTPS client certificates

Coreos - Generate self-signed certificates

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73971.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<