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
- 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)?
- 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?
- 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?
- 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?
- 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?
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