MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menghubungkan MongoDB ke Ruby dengan Sertifikat yang Ditandatangani Sendiri untuk SSL

Mengingat popularitas postingan kami tentang menghubungkan SSL MongoDB dengan Sertifikat yang Ditandatangani Sendiri di Node.js, kami memutuskan untuk menulis tutorial tentang menghubungkan MongoDB dengan Ruby. Di blog ini, kami akan menunjukkan cara terhubung ke server MongoDB yang dikonfigurasi dengan sertifikat yang ditandatangani sendiri untuk SSL menggunakan driver Ruby MongoDB dan mongoid Object-Document-Mapper (ODM) yang populer.

ScaleGrid saat ini menggunakan sertifikat yang ditandatangani sendiri untuk SSL saat membuat node untuk cluster baru. Selain itu, kami juga memberi Anda opsi untuk membeli sertifikat SSL Anda sendiri dan mengonfigurasinya di server MongoDB, dan Anda dapat mengirim email ke [email protected] untuk mempelajari lebih lanjut tentang penawaran ini.

Menghubungkan ke Kumpulan Replika Menggunakan Driver Ruby MongoDB

Kami akan menggunakan driver Ruby MongoDB stabil terbaru versi 2.8 untuk contoh ini. Versi 2.5.x dari driver memiliki bug yang diketahui yang menghambat mereka untuk bekerja dengan penerapan ScaleGrid. Versi Ruby yang digunakan pada kedua contoh di bawah ini adalah 2.6.3.

Opsi koneksi yang tersedia untuk driver didokumentasikan di sini, dan opsi yang kita perlukan adalah:

  • :ssl
  • :ssl_verify
  • :ssl_ca_cert .

Pertama, temukan dan salin string koneksi MongoDB Anda dari halaman detail cluster di konsol ScaleGrid:

File sertifikat CA juga tersedia untuk diunduh dari halaman detail cluster. Unduh dan simpan file sertifikat di lokasi yang tersedia untuk aplikasi:
Berikut ini cuplikan yang menunjukkan cara menyambungkan ke kumpulan replika MongoDB dari Ruby:

memerlukan 'mongo'Mongo::Logger.logger.level =::Logger::DEBUGMONGODB_CA_CERT ="/path/to/ca_cert.pem"MONGODB_CONN_URL ="mongodb://testuser:@SG-example- 17026.servers.mongodirector.com:27017,SG-example-17027.servers.mongodirector.com:27017,SG-example-17028.servers.mongodirector.com:27017/test?replicaSet=RS-example-0&ssl=true" options ={ ssl:true, ssl_verify:true, :ssl_ca_cert => MONGODB_CA_CERT }client =Mongo::Client.new(MONGODB_CONN_URL, options)db =client.databasecollections =db.collection_namesputs "db #{db #name} has collections #name} {collections}"client.close

Untuk menjaga agar contoh tetap sederhana, kami telah menentukan string koneksi dan jalur file sertifikat langsung di cuplikan kode – Anda biasanya akan meletakkannya di file yaml atau menetapkannya sebagai variabel lingkungan. Juga, contoh menyetel level log ke DEBUG sehingga setiap masalah konektivitas dapat di-debug. Ini harus diubah ke tingkat yang tidak terlalu bertele-tele setelah masalah konektivitas diselesaikan.

Cara Menghubungkan MongoDB ke Aplikasi Ruby dengan SSLKlik Untuk Tweet

Menghubungkan Menggunakan Mongoid

Versi mongoid yang akan kita gunakan dalam contoh kita adalah versi stabil terbaru – 7.0.2. Kami akan menggunakan file yaml untuk menyediakan konfigurasi ke mongoid, dan detail file konfigurasi tersebut didokumentasikan di sini. Opsi konfigurasi khusus SSL yang kita perlukan untuk terhubung ke set replika kita adalah:

  • ssl
  • ssl_verifikasi
  • ssl_ca_cert

File yml kami:

pengembangan:# Konfigurasi klien basis data yang tersedia. (wajib) klien:# Tentukan klien default. (wajib) default:# Sebuah uri dapat ditentukan untuk klien:# uri:'mongodb://user:[email protected]:27017/my_db' # Silakan lihat dokumentasi driver untuk detailnya. Atau, Anda dapat menentukan yang berikut ini:# # Tentukan nama database default yang dapat disambungkan oleh Mongoid. # (diperlukan). database:test # Sediakan host yang dapat dihubungkan dengan klien default. Harus berupa array # dari pasangan host:port. (wajib) host:- SG-example-17026.servers.mongodirector.com:27017 - SG-example-17027.servers.mongodirector.com:27017 - SG-example-17028.servers.mongodirector.com:47100  pilihan:# Nama pengguna untuk otentikasi. pengguna:'penguji' # Kata sandi pengguna untuk otentikasi. sandi:'pwd' # Peran basis data pengguna. role:- 'readWrite' # Ubah mekanisme otentikasi default. Opsi yang valid adalah::scram, # :mongodb_cr, :mongodb_x509, dan :plain. (default pada 3.0 adalah :scram, default # pada 2.4 dan 2.6 adalah :plain) auth_mech::scram # Basis data atau sumber untuk mengautentikasi pengguna. (default:admin) auth_source:tes # Paksa pengemudi untuk terhubung dengan cara tertentu alih-alih menemukan # otomatis. Dapat berupa salah satu dari::direct, :replica_set, :sharded. Setel ke :direct # saat menghubungkan ke anggota tersembunyi dari kumpulan replika. connect::replica_set ... ... # Nama set replika yang akan dihubungkan. Server yang disediakan sebagai seed yang # bukan milik set replika ini akan diabaikan. replica_set:RS-example-0 # Apakah akan terhubung ke server melalui ssl. (default:false) ssl:true # Apakah akan melakukan validasi sertifikasi rekan atau tidak. (default:true) ssl_verify:true # File yang berisi sekumpulan sertifikasi otoritas sertifikasi yang digabungkan # digunakan untuk memvalidasi sertifikat yang diteruskan dari ujung koneksi yang lain. ssl_ca_cert:/path/to/ca_cert.pem # Konfigurasikan opsi spesifik Mongoid. (opsional) options:# Atur level log driver Mongoid dan Ruby. (default::info) log_level::debug

Contoh koneksi:

gem 'mongoid', '7.0.2'require 'mongoid'Mongoid.load!("/path/to/mongoid.yml", :development)# Tidak menggunakan salah satu fitur ODM - cukup ambil mongo yang mendasarinya klien dan mencoba untuk menghubungkanklien =Mongoid::Clients.defaultdb =client.databasecollections =db.collection_namesputs "db #{db.name} has collections #{collections}"Mongoid::Clients.disconnect

Sekali lagi, dalam produksi aplikasi Ruby on Rails, jalur file yaml akan diambil dari variabel lingkungan.

Menguji Perilaku Kegagalan

Seperti driver MongoDB lainnya, driver Ruby MongoDB juga dirancang untuk mengenali perubahan topologi secara internal karena peristiwa seperti failover. Namun, ada baiknya untuk menguji dan memvalidasi perilaku driver selama failover untuk menghindari kejutan dalam produksi.

Seperti posting saya sebelumnya di MongoDB PyMongo, kita dapat menulis program pengujian penulis terus-menerus untuk mengamati perilaku failover driver.

Cara termudah untuk menginduksi failover adalah dengan menjalankan perintah rs.stepDown():

RS-example-0:PRIMARY> rs.stepDown()2019-04-18T19:44:42.257+0530 E QUERY [thread1] Kesalahan:kesalahan melakukan kueri:gagal:kesalahan jaringan saat mencoba menjalankan perintah 'replSetStepDown' pada host 'SG-example-1.servers.mongodirector.com:27017' :DB.prototype.runCommand@src/mongo/shell/db.js:168:1DB.prototype.adminCommand@src/mongo/shell/db. js:185:1rs.stepDown@src/mongo/shell/utils.js:1305:12@(shell):1:12019-04-18T19:44:42.261+0530 I NETWORK [thread1] mencoba menyambung kembali ke contoh SG -1.servers.mongodirector.com:27017 (X.X.X.X) gagal2019-04-18T19:44:43.267+0530 I NETWORK [thread1] menyambungkan kembali SG-example-1.servers.mongodirector.com:27017 (X.X.X.X) okRS-example- 0:SECONDARY>

Berikut adalah bagian yang relevan dari kode pengujian kami:

memerlukan 'mongo'...logger =Logger.new(STDOUT)logger.level =Logger::INFOMONGODB_CA_CERT ="/path/to/ca_cert.pem"MONGODB_CONN_URL ="mongodb://testuser:@ SG-example-17026.servers.mongodirector.com:27017,SG-example-17027.servers.mongodirector.com:27017,SG-example-17028.servers.mongodirector.com:27017/test?replicaSet=RS-example- 0&ssl=true"options ={ ssl:true, ssl_verify:true, :ssl_ca_cert => MONGODB_CA_CERT }begin logger.info("Mencoba terhubung...") client =Mongo::Client.new(MONGODB_CONN_URL, options) i =0 loop do db =client.database collection =db[:test] begin doc ={"idx":i, "date":DateTime.now, "text":SecureRandom.base64(3) } result =collection.insert_one( doc) logger.info("Record dimasukkan - id:#{result.inserted_id}") i +=1 sleep(3) rescue Mongo::Error => e logger.error("Kesalahan Mong terlihat:#{e.message }") logger.error(e.backtrace) logger.i nfo("Mencoba lagi...") end end logger.info("Selesai")rescue => err logger.error("Pengecualian terlihat:#{err.message}") logger.error(err.backtrace)pastikan klien. tutup kecuali client.nil?end

Ini terus-menerus menulis entri seperti ini ke kumpulan pengujian di database pengujian:

RS-test-0:PRIMARY> db.test.find(){ "_id" :ObjectId("5cf50ff1896cd172a4f7c6ee"), "idx" :0, "date" :ISODate("2019-06-03T12:17 :53.008Z"), "text" :"HTvd" }{ "_id" :ObjectId("5cf50ff6896cd172a4f7c6ef"), "idx" :1, "date" :ISODate("2019-06-03T12:17:58.697Z" ), "text" :"/e5Z" }{ "_id" :ObjectId("5cf50ff9896cd172a4f7c6f0"), "idx" :2, "date" :ISODate("2019-06-03T12:18:01.940Z"), " teks" :"quuw" }{ "_id" :ObjectId("5cf50ffd896cd172a4f7c6f1"), "idx" :3, "date" :ISODate("2019-06-03T12:18:05.194Z"), "text" :" gTyY" }{ "_id" :ObjectId("5cf51000896cd172a4f7c6f2"), "idx" :4, "date" :ISODate("03-06-2019T12:18:08.442Z"), "text" :"VDXX" }{ "_id" :ObjectId("5cf51003896cd172a4f7c6f3"), "idx" :5, "date" :ISODate("2019-06-03T12:18:11.691Z"), "text" :"UY87" }... 

Mari kita lihat perilaku selama failover:

I, [2019-06-03T17:53:25.079829 #9464] INFO -- :Mencoba menyambung...I, [2019-06-03T17:53:30.577099 #9464] INFO -- :Rekaman dimasukkan - id:5cf5113f896cd124f8f31062I, [2019-06-03T17:53:33.816528 #9464] INFO -- :Catatan dimasukkan - id:5cf51145896cd124f8f31063I, [2019-06-03T17:53:37.047043 #9464] INFO -- :Catatan dimasukkan - id:5cf51148896cd124f8f31064I, [2019-06-03T17:53:40.281537 #9464] INFO -- :Catatan dimasukkan - id:5cf5114c896cd124f8f31065I, [2019-06-03T17:53:43.520010 #9464] INFO -- :Catatan dimasukkan - id:5ccf5114 [2019-06-03T17:53:46.747080 #9464] INFO -- :Catatan dimasukkan - id:5cf51152896cd124f8f31067I, [2019-06-03T17:53:49.978077 #9464] INFO -- :Catatan dimasukkan - id:5cf51155896cd124f8f31068 << 

Ternyata bahwa jika kesalahan yang benar diketahui dan baca/tulis dicoba lagi, driver akan secara otomatis mendeteksi perubahan topologi dan menyambungkan kembali ke master baru. Untuk penulisan, opsi :retry_writes pastikan bahwa pengemudi akan mencoba lagi sendiri sebelum memberi tahu aplikasi tentang kesalahan.

Ada juga beberapa waktu tunggu driver yang dapat diubah berdasarkan perilaku dan latensi persis yang Anda lihat di penyiapan. Ini didokumentasikan di sini.

Pemecahan masalah

Jika Anda mengalami masalah saat menyambungkan ke penerapan MongoDB berkemampuan SSL, berikut beberapa kiat untuk debugging:

  • Pertama, verifikasi bahwa Anda benar-benar dapat terhubung ke server MongoDB dari server tempat aplikasi Anda berjalan. Cara termudah untuk melakukannya adalah menginstal mongo shell di mesin klien. Di Linux, Anda tidak perlu menginstal seluruh server MongoDB – Anda dapat memilih untuk menginstal shell secara terpisah. Setelah shell tersedia, coba gunakan 'Command Line Syntax' yang kami sediakan untuk mencoba terhubung ke server.
  • Jika Anda tidak dapat terhubung melalui mongo shell, itu berarti mesin klien tidak dapat mencapai port 27017 dari server MongoDB. Lihat setelan firewall Grup Keamanan, VPC, dan ScaleGrid Anda untuk memastikan bahwa ada konektivitas antara mesin klien dan server.
  • Jika konektivitas jaringan sudah benar, hal berikutnya yang harus diperiksa adalah apakah Anda menggunakan versi permata Ruby, mongoid, dan mongo yang kompatibel dengan versi tersebut dari server MongoDB Anda.
  • Jika Anda telah memastikan bahwa versi driver sudah benar, coba jalankan contoh skrip Ruby, mirip dengan contoh yang kami berikan di atas, di IRB. Eksekusi langkah demi langkah mungkin menunjukkan di mana masalahnya.
  • Jika skrip pengujian berjalan dengan baik, tetapi Anda masih tidak dapat terhubung dengan mongoid, coba jalankan skrip pengujian sederhana, seperti contoh yang kami berikan di atas .
  • Jika Anda masih mengalami masalah saat menyambungkan ke instans Anda, harap hubungi kami di [email protected] dengan hasil mendetail dari langkah pemecahan masalah di atas dan dengan versi persis driver Ruby, mongoid dan mongo yang Anda gunakan. Gemfile.lock akan memberi Anda versi yang tepat.

Jika Anda baru mengenal ScaleGrid dan ingin mencoba tutorial ini, daftar untuk uji coba gratis selama 30 hari untuk menjelajahi platform dan mengujinya menghubungkan MongoDB ke aplikasi Ruby Anda.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara memeriksa apakah bidang array adalah bagian dari array lain di MongoDB?

  2. Kerangka Agregasi MongoDB - Ganti Nama Bidang Dinamis

  3. 7 Cara Menghitung Dokumen di MongoDB

  4. MongoDB:Terlalu banyak elemen posisi (yaitu '$') ditemukan di jalur

  5. Proyeksikan item pertama dalam larik ke bidang baru (agregasi MongoDB)