2013-01-22 9 views
7

Mamy wielowątkową aplikację sieciową, która używa gniazd od 10 lat, a teraz próbujemy zabezpieczyć aplikację za pomocą OpenSSL 0.9.8L. Z biegiem lat protokoły sieciowe aplikacji zostały zaprojektowane tak, aby wykorzystać dwustronny charakter pojedynczego połączenia z gniazdem; aplikacja jednocześnie czyta i zapisuje na tym samym gnieździe. Aplikacja zarządza samym gniazdem i przekazuje deskryptor gniazda do OpenSSL przez SSL_set_fd.Wyjaśnienie OpenSSL 0.9.8L Obsługa współbieżności - czy wystąpienia SSL mogą być używane przez wiele wątków, jeśli są wykonywane jednocześnie?

Skonfigurowaliśmy OpenSSL do obsługi wielowątkowych, ustawiając zarówno statyczne, jak i dynamiczne wywołania blokujące, np. CRYPTO_set_id_callback(), CRYPTO_set_locking_callback(), itp. W większości przypadków aplikacja działa dobrze, ale widzimy pewne anomalie. Aby pomóc nam w ustaleniu przyczyny, pomocne byłyby ostateczne odpowiedzi na kilka pytań.

Strona często zadawanych pytań OpenSSL stwierdza, że ​​OpenSSL jest bezpieczna dla wątków, ale utrzymuje, że pojedyncze "połączenie SSL może nie być używane jednocześnie przez wiele wątków".

http://www.openssl.org/support/faq.html#PROG1

  1. Prawda czy fałsz. Wywołania API połączenia OpenSSL (SSL_Read, SSL_Write itp.) Mogą być wykonywane równocześnie na tej samej instancji SSL (wskaźnik do protokołu SSL zwracany przez połączenie SSL_new)?
  2. Prawda czy fałsz. W przypadku blokowania gniazd, w których włączona jest opcja SSL_MODE_AUTO_RETRY, wątek A może wywołać funkcję SSL_Read() na instancji SSL X, podczas gdy wątek B jednocześnie wywołuje funkcję SSL_Write() na instancji SSL X?
  3. Prawda czy fałsz. OpenSSL działa bezbłędnie, gdy aplikacja używa nieblokujących gniazd i zapobiega równoczesnej realizacji SSL_Read i SSL_Write (jak również innym połączeniom API) w tej samej instancji SSL?
  4. Prawda czy fałsz. Wystąpienia OpenSSL SSL zwrócone przez SSL_new są powiązane z pojedynczym wątkiem, który wywołał SSL_new; powiązane znaczenie, że instancja SSL nie może być współdzielona z innymi wątkami, instancja SSL jest poprawna tylko do użycia w wątku, który wywołał SSL_new?
  5. Prawda czy fałsz. Jeśli wątek A i) wywoła SSL_new, otrzymując instancję SSL X i ii) wywoła SSL_Read przy użyciu instancji SSL X. Awaria w końcu wystąpi, jeśli wątek B nie będzie jednocześnie wywoływał SSL_Read/SSL_Write przy użyciu tej samej instancji SSL X?
+0

Anomalia wycieku pamięci, z którą mieliśmy do czynienia, spowodowana brakiem wywołania ERR_remove_state (3) przed zakończeniem wątku, zgodnie z dokumentacją - https://www.openssl.org/docs/crypto/err.html – buzz3791

Odpowiedz

13

1. Prawda lub fałsz. Wywołania API połączenia OpenSSL (SSL_Read, SSL_Write itp.) Mogą być wykonywane równocześnie na tej samej instancji SSL (wskaźnik do protokołu SSL zwracany przez połączenie SSL_new)?

* Fałsz. Nie, nie można jednocześnie używać SSL_read/SSL_write na tej samej instancji SSL. *

2. Prawda lub fałsz. W przypadku blokowania gniazd, w których włączona jest opcja SSL_MODE_AUTO_RETRY, wątek A może wywołać funkcję SSL_Read() na instancji SSL X, podczas gdy wątek B jednocześnie wywołuje funkcję SSL_Write() na instancji SSL X?

* Ta sama odpowiedź co powyżej. Z lub bez SSL_MODE_AUTO_RETRY, nie można jednocześnie używać tej samej instancji SSL X, aby wykonać jednocześnie SSL_read i SSL_write *

3. Prawda lub fałsz. OpenSSL działa bezbłędnie, gdy aplikacja używa nieblokujących gniazd i zapobiega równoczesnej realizacji SSL_Read i SSL_Write (jak również innym połączeniom API) w tej samej instancji SSL?

Prawda.Jeśli nie ma równoczesnego wykonywania, to OpenSSL działa dobrze zarówno w przypadku blokowania, jak i gniazd bez blokowania.

4. Prawda lub fałsz. Wystąpienia OpenSSL SSL zwrócone przez SSL_new są powiązane z pojedynczym wątkiem, który wywołał SSL_new; powiązane znaczenie, że instancja SSL nie może być współdzielona z innymi wątkami, instancja SSL jest poprawna tylko do użycia w wątku, który wywołał SSL_new?

Fałsz. Instancja SSL nie jest powiązana z żadnym wątkiem przez samą OpenSSL. Możesz użyć instancji SSL utworzonej w jednym wątku w innym wątku, o ile tylko jeden wątek używa pojedynczej instancji SSL w dowolnym momencie.

5. Prawda lub fałsz. Jeśli wątek A i) wywoła SSL_new, otrzymując instancję SSL X i ii) wywoła SSL_Read przy użyciu instancji SSL X. Awaria w końcu wystąpi, jeśli wątek B nie będzie jednocześnie wywoływał SSL_Read/SSL_Write przy użyciu tej samej instancji SSL X?

Fałsz. Zarówno wątek A, jak i wątek B mogą korzystać z tej samej instancji X protokołu SSL, ponieważ oba nie wykonują operacji współbieżnych na instancji SSL X.

0

Eksperymentalnie, jeśli połączenie SSL minęło etap negocjacji, a nie ma żadnego renegocjacji, a następnie użycie SSL_read i SSL_write jednocześnie okazało się nie zaszkodzić. To jest według moich testów, gdzie zintegrowałem OpenSSL z Push Framework, wielowątkową biblioteką sieciową. Jednak wszędzie, gdzie czytamy, specjaliści OpenSSL twierdzą, że ten sam kontekst nie może być używany przez wiele wątków w tym samym czasie.

+0

", a następnie użycie SSL_read i SSL_write jednocześnie okazały się nie zaszkodzić "- Jeśli to prawda, po prostu masz szczęście. Po prostu nie można mieć wielu wątków wykonujących operacje IO na instancji SSL *. Zepsuje, absolutnie. Właśnie dlatego dokumentacja dotycząca :: :: asio :: ssl wymaga zawijania tych operacji w łańcuchu. –

Powiązane problemy