2016-07-24 50 views
6

Podczas migracji z serwerów Parse przed wyłączeniem go, próbuję skonfigurować prostą instancję MongoDB na Digital Ocean. (Używam tego zamiast mLab, ponieważ moje potrzeby są bardzo ograniczone - kilka MB pamięci, kilkaset próśb na tydzień - i dla tego koszty mLab są dość wysokie.)Parsowanie + mongodb + SSL: "brak certyfikatu SSL dostarczonego przez równorzędnego"

Mam mongodę działa, i zrobili pewne postępy z SSL dzięki this guide używając Let's Encrypt, ale teraz utknąłem. Narzędzie migracji analizowania mówi: „Nie serwery osiągalne”, a jeśli próbuję łączyć w linii poleceń jak poniżej:

mongo --ssl -u editAdmin -p "<password-here>" --host mydb.myhost.com dbname 

otrzymuję ten błąd:

MongoDB shell version: 3.2.7 
connecting to: mydb.myhost.com:27017/dbname 
2016-07-24T10:31:38.814-0700 E QUERY [thread1] Error: network error while attempting to run command 'isMaster' on host 'mydb.myhost.com:27017' : 
[email protected]/mongo/shell/mongo.js:231:14 
@(connect):1:6 

exception: connect failed 

raportach dziennika serwera:

2016-07-24T13:32:44.357-0400 I NETWORK [initandlisten] connection accepted from 12.345.67.89:33351 #39 (1 connection now open) 
2016-07-24T13:32:44.390-0400 E NETWORK [conn39] no SSL certificate provided by peer; connection rejected 
2016-07-24T13:32:44.390-0400 I NETWORK [conn39] end connection 12.345.67.89:33351 (0 connections now open) 

Sugeruje to, że klient musi dostarczyć certyfikat, ale (a) nie wiem, jak go dostarczyć, oraz (b) Parse nie zapewnia tego jako opcji, więc musi być jakiś sposób nie do.

Z góry dziękuję za pomoc.

Odpowiedz

0

Jesteś polecenie używa opcji SSL (i zakładam, że Parse robi to samo), więc próbujesz połączyć się za pomocą SSL. Klient musi dostarczyć certyfikat podczas korzystania z protokołu SSL. https://docs.mongodb.com/manual/tutorial/configure-ssl-clients/ ten link wyjaśnia, jak to zrobić, a także specjalnie wspomina o problemie:

+0

„klient musi dostarczyć cert przy użyciu protokołu SSL” - jest to zawsze prawdziwe powinno zależeć od konfiguracji Tutorial MongoDB konfiguracji SSL w?. mongod mówi: "Jeśli klient przedstawia certyfikat, certyfikat musi być ważnym certyfikatem. Wszystkie połączenia, w tym te, które nie zostały przedstawione certyfikaty są szyfrowane za pomocą protokołu SSL „ . Źródło: https://docs.mongodb.com/manual/tutorial/configure-ssl/ – DukeOf1Cat

5

Kluczowy komunikat o błędzie jeden:

no SSL certificate provided by peer; connection rejected 

Po włączeniu protokołu TLS/SSL na MongoDB, Klienci MongoDB mogą teraz uwierzytelnić, czy serwer MongoDB jest tym, za kogo się podaje, poprzez porównanie certyfikatu TLS/SSL MongoDB (określonego przez właściwość PEMKeyFile w pliku mongod.conf) z certyfikatem publicznego ośrodka certyfikacji dostarczonym do klienta MongoDB w celu wskazania, który Urząd certyfikacji, któremu ufasz.

Ale co właśnie opisany jest czasami zwana jednokierunkowa TLS, natomiast domyślnie MongoDB umożliwia dwukierunkowy lub wzajemne uwierzytelnianie TLS. Pomysł polega na tym, że być może MongoDB nie chce przyjmować klientów od nikogo (tak jak publiczna strona internetowa), ale chce również uwierzytelniać klientów.

W TLS Mutual Auth, ten sam organ certyfikacji, o którym wspomniałem powyżej, wyda certyfikaty klienta, a serwer MongoDB sprawdzi certyfikat klienta, aby upewnić się, że rzeczywiście został wydany przez dany urząd certyfikacji i że jest ważny (np. t minął).

Ten błąd mówi: "Hej, oczekuję, że moi klienci przedstawią certyfikat TLS, ale nic nie przedstawiasz."

Sposobem na ustalenie to jest opisane w Configure mongod and mongos for TLS/SSL:

If you want to bypass validation for clients that don’t present certificates, include the allowConnectionsWithoutCertificates run-time option with mongod and mongos. If the client does not present a certificate, no validation occurs. These connections, though not validated, are still encrypted using SSL.

Oczywiście, można to określić w pliku mongod.conf także: https://docs.mongodb.com/manual/reference/configuration-options/#net.ssl.allowConnectionsWithoutCertificates

Moje preferowanym rozwiązaniem wygląda następująco:

net: 
    port: 27017 
    bindIp: 172.0.0.1 # Set this to whatever your private IP address is 
    ssl: 
    mode: "requireSSL" 
    PEMKeyFile: "/path/to/tls/private/key" 
    CAFile: "/path/to/ca/public/cert" 
    disabledProtocols: "TLS1_0,TLS1_1" 
    allowConnectionsWithoutCertificates: true # <-- The line to add to your config