MongoDB 4.0.8 基于X.509認(rèn)證的3副本復(fù)制集群

一、環(huán)境

hostname ip role
mongo-1 10.1.1.1 PRIMARY
mongo-2 10.1.1.2 SECONDARY
mongo-3 10.1.1.3 SECONDARY

二聊闯、認(rèn)證相關(guān)

$ cat server.sh
# ca
openssl req -passout pass:password -new -x509 -keyout ca_p.pem -out ca.pem -subj "/CN=jigela/OU=supsersb/O=supsersb/L=tm/ST=tm/C=CN"
# db
# sbtest-mongo-1
openssl req -newkey rsb:2048 -nodes -out sbtest-mongo-1.csr -keyout sbtest-mongo-1.key -subj '/CN=10.1.1.1/OU=supsersb/O=supsersb/L=tm/ST=tm/C=CN'
openssl x509 -passin pass:password -tma256 -req -in sbtest-mongo-1.csr -signkey sbtest-mongo-1.key -CA ca.pem -CAkey ca_p.pem -CAcreateserial -out sbtest-mongo-1.crt
cat sbtest-mongo-1.crt sbtest-mongo-1.key > sbtest-mongo-1.pem
# sbtest-mongo-2
openssl req -newkey rsb:2048 -nodes -out sbtest-mongo-2.csr -keyout sbtest-mongo-2.key -subj '/CN=10.1.1.2/OU=supsersb/O=supsersb/L=tm/ST=tm/C=CN'
openssl x509 -passin pass:password -tma256 -req -in sbtest-mongo-2.csr -signkey sbtest-mongo-2.key -CA ca.pem -CAkey ca_p.pem -CAcreateserial -out sbtest-mongo-2.crt
cat sbtest-mongo-2.crt sbtest-mongo-2.key > sbtest-mongo-2.pem
# sbtest-mongo-3
openssl req -newkey rsb:2048 -nodes -out sbtest-mongo-3.csr -keyout sbtest-mongo-3.key -subj '/CN=10.1.1.3/OU=supsersb/O=supsersb/L=tm/ST=tm/C=CN'
openssl x509 -passin pass:password -tma256 -req -in sbtest-mongo-3.csr -signkey sbtest-mongo-3.key -CA ca.pem -CAkey ca_p.pem -CAcreateserial -out sbtest-mongo-3.crt
cat sbtest-mongo-3.crt sbtest-mongo-3.key > sbtest-mongo-3.pem

$ cat root.sh
# Users
# root
openssl req -newkey rsb:2048 -nodes -out root.csr -keyout root.key -subj '/CN=root/OU=sb/O=supsersb/L=tm/ST=tm/C=CN'
openssl x509 -passin pass:password -tma256 -req  -in root.csr -signkey root.key -CA ca.pem -CAkey ca_p.pem -CAcreateserial -out root.crt
cat root.crt root.key > root.pem

$ cat client.sh
openssl req -newkey rsb:2048 -nodes -out sbtest.csr -keyout sbtest.key -subj '/CN=sbtest/OU=sb/O=supsersb/L=tm/ST=tm/C=CN'
openssl x509 -passin pass:password -tma256 -req  -in sbtest.csr -signkey sbtest.key -CA ca.pem -CAkey ca_p.pem -CAcreateserial -out sbtest.crt
cat sbtest.crt sbtest.key > sbtest.pem

三胡诗、將產(chǎn)生的證書復(fù)制到對應(yīng)服務(wù)器上

hostname 存在證書
mongo-1 ca.pem子刮、sbtest.pem、sbtest-mongo-1.pem
mongo-2 ca.pem悯蝉、sbtest.pem归形、sbtest-mongo-2.pem
mongo-3 ca.pem、sbtest.pem鼻由、sbtest-mongo-3.pem

四暇榴、部署環(huán)境

1. 無認(rèn)證啟動mongodb

2. mongodb授權(quán)

# 創(chuàng)建普通用戶
> db.getSiblingDB('$external').runCommand({ createUser: "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest", roles:[{role: 'readWrite', db: 'sbtest'}] });

# 創(chuàng)建管理員用戶
> db.getSiblingDB('$external').runCommand({ createUser: "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=root", roles:[{role:"root", db: "admin" }]})

3. 修改配置

systemLog:
   destination: file
   path: /opt/mongodb/27017/log/mongodb.log
   logAppend: true
   logRotate: "rename"
processManagement:
   fork: true
   pidFilePath: "/opt/mongodb/27017/mongod.pid"
net:
   port: 27017
   bindIp: 0.0.0.0
   ssl:
      mode: requireSSL
      PEMKeyFile: /opt/mongodb/27017/conf/ssl/dbmongo-1.pem # 根據(jù)機器不同授權(quán)不同文件
      CAFile: /opt/mongodb/27017/conf/ssl/ca.pem
security:
   authorization: enabled
   clusterAuthMode: x509
setParameter:
   enableLocalhostAuthBypass: true
   replWriterThreadCount: 32
storage:
   dbPath: /opt/mongodb/27017/data
   journal:
      enabled: true
      commitIntervalMs: 100
   directoryPerDB: true
   engine: wiredTiger
   wiredTiger:
      engineConfig:
         cacheSizeGB: 4
         journalCompressor: snappy
         directoryForIndexes: true
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
operationProfiling:
   slowOpThretmoldMs: 500
   mode: slowOp
replication:
   oplogSizeMB: 10240
   replSetName: replsbtest

4. 創(chuàng)建復(fù)制集

> use admin
> cfg = {_id: 'replsbtest', members: [
      {_id: 0, host: '10.1.1.1:27017'},
      {_id: 1, host: '10.1.1.2:27017'},
      {_id: 2, host: '10.1.1.3:27017',}]
       }  

> rs.initiate(cfg)

5. 重啟mongodb

6. 測試使用ssl連接mongodb

6.1 root 登陸測試
$  mongo     --ssl --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/root.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.1 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=root"
MongoDB tmell version v4.0.8
connecting to: mongodb://10.1.1.1:27017/?authMechanism=MONGODB-X509&authSource=%24external&gssbpiServiceName=mongodb
Implicit session: session { "id" : UUID("ee9ae8da-8855-4c62-92b0-a73bb1153dee") }
MongoDB server version: 4.0.8
Server has startup warnings:
2019-04-16T14:06:36.253+0800 I STORAGE  [initandlisten]
2019-04-16T14:06:36.253+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-04-16T14:06:36.253+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-04-16T14:06:37.463+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-04-16T14:06:37.463+0800 I CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you tmare the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disbble this reminder, run the following command: db.disbbleFreeMonitoring()
---

replsbtest:PRIMARY> use admin
switched to db admin
replsbtest:PRIMARY> db.system.users.find()
{ "_id" : "$external.C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=root", "user" : "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=root", "db" : "$external", "credentials" : { "external" : true }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "$external.C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest", "user" : "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest", "db" : "$external", "credentials" : { "external" : true }, "roles" : [ { "role" : "readWrite", "db" : "sbtest" } ] }
replsbtest:PRIMARY>
6.2 普通賬戶登陸
# PRIMARY
$ mongo     --ssl --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/sbtest.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.1 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest"
MongoDB tmell version v4.0.8
connecting to: mongodb://10.1.1.1:27017/?authMechanism=MONGODB-X509&authSource=%24external&gssbpiServiceName=mongodb
Implicit session: session { "id" : UUID("f4e9eaa2-8c49-4721-a2e7-97734597f1f4") }
MongoDB server version: 4.0.8
replsbtest:PRIMARY>

# SECONDARY
$ mongo     --ssl --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/sbtest.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.2 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest"
MongoDB tmell version v4.0.8
connecting to: mongodb://10.1.1.2:27017/?authMechanism=MONGODB-X509&authSource=%24external&gssbpiServiceName=mongodb
Implicit session: session { "id" : UUID("2c5b359a-685f-4e96-8989-d6bd259d82e9") }
MongoDB server version: 4.0.8
replsbtest:SECONDARY>

$ mongo     --ssl --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/sbtest.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.3 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest"
MongoDB tmell version v4.0.8
connecting to: mongodb://10.1.1.3:27017/?authMechanism=MONGODB-X509&authSource=%24external&gssbpiServiceName=mongodb
Implicit session: session { "id" : UUID("599d30eb-c8a3-4165-94d9-d9cdd9555285") }
MongoDB server version: 4.0.8
replsbtest:SECONDARY>

7. 數(shù)據(jù)備份/恢復(fù)測試

7.0 錯誤范例
$ mongodump --ssl  --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/sbtest.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.1 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest" -d sbtest
2019-04-16T15:23:21.936+0800    error dialing 10.1.1.1:27017: Host validation error
2019-04-16T15:23:22.444+0800    error dialing 10.1.1.1:27017: Host validation error
2019-04-16T15:23:22.952+0800    error dialing 10.1.1.1:27017: Host validation error
2019-04-16T15:23:23.960+0800    error dialing 10.1.1.1:27017: Host validation error
2019-04-16T15:23:24.467+0800    error dialing 10.1.1.1:27017: Host validation error
2019-04-16T15:23:24.975+0800    error dialing 10.1.1.1:27017: Host validation error
2019-04-16T15:23:25.475+0800    Failed: error connecting to db server: no reachable servers

同樣的證書 mongo tmell可以啟動 mongodump不可以,是因為mongodump命令中的host和server證書中的CN不相符(ps:這個地方很關(guān)鍵蕉世,此文章是通過使用sslAllowInvalidHostnames來解決這個問題的蔼紧,同樣監(jiān)控查看也要加此參數(shù)),建議將server證書的CN設(shè)置成對應(yīng)服務(wù)器的hostname或是public ip狠轻。

7.1 數(shù)據(jù)備份
$ mongodump --ssl --sslAllowInvalidHostnames  --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/sbtest.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.1 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest" -d sbtest
2019-04-16T15:18:36.622+0800    writing sbtest.log to
2019-04-16T15:18:36.622+0800    writing sbtest.activity to
2019-04-16T15:18:36.622+0800    writing sbtest.env to
2019-04-16T15:18:36.622+0800    writing sbtest.process to
2019-04-16T15:18:36.844+0800    done dumping sbtest.process (4825 documents)
2019-04-16T15:18:36.844+0800    writing sbtest.resource to
2019-04-16T15:18:36.849+0800    done dumping sbtest.resource (802 documents)
2019-04-16T15:18:36.849+0800    writing sbtest.comment to
2019-04-16T15:18:36.851+0800    done dumping sbtest.comment (242 documents)
2019-04-16T15:18:36.851+0800    writing sbtest.suggestion to
2019-04-16T15:18:36.853+0800    done dumping sbtest.suggestion (26 documents)
2019-04-16T15:18:37.005+0800    done dumping sbtest.activity (29047 documents)
2019-04-16T15:18:37.085+0800    done dumping sbtest.env (19235 documents)
2019-04-16T15:18:37.333+0800    done dumping sbtest.log (180804 documents)
7.2 數(shù)據(jù)恢復(fù)
$ mongorestore --ssl --sslAllowInvalidHostnames  --sslPEMKeyFile /opt/mongodb/27017/conf/ssl/sbtest.pem --sslCAFile /opt/mongodb/27017/conf/ssl/ca.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase='$external' --host 10.1.1.1 -u "C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest" -d sbtest  dump/sbtest/
2019-04-16T15:15:32.367+0800    the --db and --collection args tmould only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2019-04-16T15:15:32.368+0800    building a list of collections to restore from dump/sbtest dir
2019-04-16T15:15:32.368+0800    reading metadata for sbtest.env from dump/sbtest/env.metadata.json
2019-04-16T15:15:32.417+0800    restoring sbtest.env from dump/sbtest/env.bson
2019-04-16T15:15:32.419+0800    reading metadata for sbtest.activity from dump/sbtest/activity.metadata.json
2019-04-16T15:15:32.419+0800    reading metadata for sbtest.process from dump/sbtest/process.metadata.json
2019-04-16T15:15:32.419+0800    reading metadata for sbtest.log from dump/sbtest/log.metadata.json
2019-04-16T15:15:32.487+0800    restoring sbtest.process from dump/sbtest/process.bson
2019-04-16T15:15:32.536+0800    restoring sbtest.activity from dump/sbtest/activity.bson
2019-04-16T15:15:32.591+0800    restoring sbtest.log from dump/sbtest/log.bson
2019-04-16T15:15:33.376+0800    restoring indexes for collection sbtest.process from metadata
2019-04-16T15:15:33.471+0800    finitmed restoring sbtest.process (4825 documents)
2019-04-16T15:15:33.471+0800    reading metadata for sbtest.resource from dump/sbtest/resource.metadata.json
2019-04-16T15:15:33.527+0800    restoring sbtest.resource from dump/sbtest/resource.bson
2019-04-16T15:15:33.733+0800    no indexes to restore
2019-04-16T15:15:33.733+0800    finitmed restoring sbtest.resource (802 documents)
2019-04-16T15:15:33.733+0800    reading metadata for sbtest.suggestion from dump/sbtest/suggestion.metadata.json
2019-04-16T15:15:33.789+0800    restoring sbtest.suggestion from dump/sbtest/suggestion.bson
2019-04-16T15:15:33.879+0800    no indexes to restore
2019-04-16T15:15:33.879+0800    finitmed restoring sbtest.suggestion (26 documents)
2019-04-16T15:15:33.879+0800    reading metadata for sbtest.comment from dump/sbtest/comment.metadata.json
2019-04-16T15:15:33.925+0800    restoring sbtest.comment from dump/sbtest/comment.bson
2019-04-16T15:15:34.019+0800    no indexes to restore
2019-04-16T15:15:34.019+0800    finitmed restoring sbtest.comment (242 documents)
2019-04-16T15:15:35.358+0800    [#####################...]       sbtest.env  82.6MB/90.6MB  (91.2%)
2019-04-16T15:15:35.358+0800    [###################.....]  sbtest.activity  39.0MB/47.8MB  (81.6%)
2019-04-16T15:15:35.358+0800    [###.....................]       sbtest.log  6.24MB/38.8MB  (16.1%)
2019-04-16T15:15:35.358+0800
2019-04-16T15:15:35.717+0800    [########################]  sbtest.env  90.6MB/90.6MB  (100.0%)
2019-04-16T15:15:35.718+0800    no indexes to restore
2019-04-16T15:15:35.718+0800    finitmed restoring sbtest.env (19235 documents)
2019-04-16T15:15:36.041+0800    [########################]  sbtest.activity  47.8MB/47.8MB  (100.0%)
2019-04-16T15:15:36.041+0800    no indexes to restore
2019-04-16T15:15:36.041+0800    finitmed restoring sbtest.activity (29047 documents)
2019-04-16T15:15:38.357+0800    [###########.............]  sbtest.log  18.2MB/38.8MB  (47.0%)
2019-04-16T15:15:41.357+0800    [##################......]  sbtest.log  30.5MB/38.8MB  (78.6%)
2019-04-16T15:15:43.845+0800    [########################]  sbtest.log  38.8MB/38.8MB  (100.0%)
2019-04-16T15:15:43.845+0800    no indexes to restore
2019-04-16T15:15:43.845+0800    finitmed restoring sbtest.log (180804 documents)
2019-04-16T15:15:43.845+0800    done

注意:參數(shù)--sslAllowInvalidHostnames

8. 測試python驅(qū)動使用ssl連接mongodb

$ ipython
Python 2.7.13 (default, Nov 24 2017, 17:33:09)
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import ssl

In [2]: from pymongo import MongoClient
   ...:

In [3]: client = MongoClient('10.1.1.1',
   ...:                       username="C=CN,ST=tm,L=tm,O=supsersb,OU=sb,CN=sbtest",
   ...:                       authMechanism="MONGODB-X509",
   ...:                       ssl=True,
   ...:                       ssl_certfile='/opt/mongodb/27017/conf/ssl/sbtest.pem',
   ...:                       ssl_cert_reqs=ssl.CERT_REQUIRED,
   ...:                       ssl_ca_certs='/opt/mongodb/27017/conf/ssl/ca.pem')

In [4]: mydict = {"title":"just do it"}
   ...:

In [5]: mydb=client["sbtest"]
   ...: mycol=mydb["coll"]
   ...:

In [6]: mycol.insert_one(mydict)
   ...:
Out[6]: <pymongo.results.InsertOneResult at 0x7f51f6a40518>

In [7]: mycol.find_one()
Out[7]: {u'_id': ObjectId('5cb00527d54e0c01715054d7'), u'title': u'just do it'}

In [8]:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸例,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子向楼,更是在濱河造成了極大的恐慌查吊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湖蜕,死亡現(xiàn)場離奇詭異逻卖,居然都是意外死亡,警方通過查閱死者的電腦和手機昭抒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門评也,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虚茶,“玉大人,你說我怎么就攤上這事仇参∴诮校” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵诈乒,是天一觀的道長罩扇。 經(jīng)常有香客問我,道長怕磨,這世上最難降的妖魔是什么喂饥? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮肠鲫,結(jié)果婚禮上员帮,老公的妹妹穿的比我還像新娘。我一直安慰自己导饲,他們只是感情好捞高,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渣锦,像睡著了一般硝岗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袋毙,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天型檀,我揣著相機與錄音,去河邊找鬼听盖。 笑死胀溺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皆看。 我是一名探鬼主播仓坞,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悬蔽!你這毒婦竟也來了扯躺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝎困,失蹤者是張志新(化名)和其女友劉穎录语,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾乘,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡澎埠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了始藕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒲稳。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡氮趋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出江耀,到底是詐尸還是另有隱情剩胁,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布祥国,位于F島的核電站游昼,受9級特大地震影響荒典,放射性物質(zhì)發(fā)生泄漏嚷节。R本人自食惡果不足惜剖效,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壁查。 院中可真熱鬧觉至,春花似錦、人聲如沸睡腿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫉到。三九已至沃暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間何恶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工嚼黔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留细层,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓唬涧,卻偏偏與公主長得像疫赎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碎节,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容