openssl_adapter.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * Copyright 2004 The WebRTC Project Authors. All rights reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #ifndef RTC_BASE_OPENSSL_ADAPTER_H_
  11. #define RTC_BASE_OPENSSL_ADAPTER_H_
  12. #include <stddef.h>
  13. #include <stdint.h>
  14. #include <memory>
  15. #include <string>
  16. #include <vector>
  17. #include "rtc_base/async_socket.h"
  18. #include "rtc_base/buffer.h"
  19. #include "rtc_base/message_handler.h"
  20. #include "rtc_base/openssl_identity.h"
  21. #include "rtc_base/openssl_session_cache.h"
  22. #include "rtc_base/socket.h"
  23. #include "rtc_base/socket_address.h"
  24. #include "rtc_base/ssl_adapter.h"
  25. #include "rtc_base/ssl_certificate.h"
  26. #include "rtc_base/ssl_identity.h"
  27. #include "rtc_base/ssl_stream_adapter.h"
  28. namespace rtc {
  29. class OpenSSLAdapter final : public SSLAdapter, public MessageHandler {
  30. public:
  31. static bool InitializeSSL();
  32. static bool CleanupSSL();
  33. // Creating an OpenSSLAdapter requires a socket to bind to, an optional
  34. // session cache if you wish to improve performance by caching sessions for
  35. // hostnames you have previously connected to and an optional
  36. // SSLCertificateVerifier which can override any existing trusted roots to
  37. // validate a peer certificate. The cache and verifier are effectively
  38. // immutable after the the SSL connection starts.
  39. explicit OpenSSLAdapter(AsyncSocket* socket,
  40. OpenSSLSessionCache* ssl_session_cache = nullptr,
  41. SSLCertificateVerifier* ssl_cert_verifier = nullptr);
  42. ~OpenSSLAdapter() override;
  43. void SetIgnoreBadCert(bool ignore) override;
  44. void SetAlpnProtocols(const std::vector<std::string>& protos) override;
  45. void SetEllipticCurves(const std::vector<std::string>& curves) override;
  46. void SetMode(SSLMode mode) override;
  47. void SetCertVerifier(SSLCertificateVerifier* ssl_cert_verifier) override;
  48. void SetIdentity(std::unique_ptr<SSLIdentity> identity) override;
  49. void SetRole(SSLRole role) override;
  50. AsyncSocket* Accept(SocketAddress* paddr) override;
  51. int StartSSL(const char* hostname) override;
  52. int Send(const void* pv, size_t cb) override;
  53. int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
  54. int Recv(void* pv, size_t cb, int64_t* timestamp) override;
  55. int RecvFrom(void* pv,
  56. size_t cb,
  57. SocketAddress* paddr,
  58. int64_t* timestamp) override;
  59. int Close() override;
  60. // Note that the socket returns ST_CONNECTING while SSL is being negotiated.
  61. ConnState GetState() const override;
  62. bool IsResumedSession() override;
  63. // Creates a new SSL_CTX object, configured for client-to-server usage
  64. // with SSLMode |mode|, and if |enable_cache| is true, with support for
  65. // storing successful sessions so that they can be later resumed.
  66. // OpenSSLAdapterFactory will call this method to create its own internal
  67. // SSL_CTX, and OpenSSLAdapter will also call this when used without a
  68. // factory.
  69. static SSL_CTX* CreateContext(SSLMode mode, bool enable_cache);
  70. protected:
  71. void OnConnectEvent(AsyncSocket* socket) override;
  72. void OnReadEvent(AsyncSocket* socket) override;
  73. void OnWriteEvent(AsyncSocket* socket) override;
  74. void OnCloseEvent(AsyncSocket* socket, int err) override;
  75. private:
  76. enum SSLState {
  77. SSL_NONE,
  78. SSL_WAIT,
  79. SSL_CONNECTING,
  80. SSL_CONNECTED,
  81. SSL_ERROR
  82. };
  83. enum { MSG_TIMEOUT };
  84. int BeginSSL();
  85. int ContinueSSL();
  86. void Error(const char* context, int err, bool signal = true);
  87. void Cleanup();
  88. // Return value and arguments have the same meanings as for Send; |error| is
  89. // an output parameter filled with the result of SSL_get_error.
  90. int DoSslWrite(const void* pv, size_t cb, int* error);
  91. void OnMessage(Message* msg) override;
  92. bool SSLPostConnectionCheck(SSL* ssl, const std::string& host);
  93. #if !defined(NDEBUG)
  94. // In debug builds, logs info about the state of the SSL connection.
  95. static void SSLInfoCallback(const SSL* ssl, int where, int ret);
  96. #endif
  97. static int SSLVerifyCallback(int ok, X509_STORE_CTX* store);
  98. friend class OpenSSLStreamAdapter; // for custom_verify_callback_;
  99. // If the SSL_CTX was created with |enable_cache| set to true, this callback
  100. // will be called when a SSL session has been successfully established,
  101. // to allow its SSL_SESSION* to be cached for later resumption.
  102. static int NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session);
  103. // Optional SSL Shared session cache to improve performance.
  104. OpenSSLSessionCache* ssl_session_cache_ = nullptr;
  105. // Optional SSL Certificate verifier which can be set by a third party.
  106. SSLCertificateVerifier* ssl_cert_verifier_ = nullptr;
  107. // The current connection state of the (d)TLS connection.
  108. SSLState state_;
  109. std::unique_ptr<OpenSSLIdentity> identity_;
  110. // Indicates whethere this is a client or a server.
  111. SSLRole role_;
  112. bool ssl_read_needs_write_;
  113. bool ssl_write_needs_read_;
  114. // This buffer is used if SSL_write fails with SSL_ERROR_WANT_WRITE, which
  115. // means we need to keep retrying with *the same exact data* until it
  116. // succeeds. Afterwards it will be cleared.
  117. Buffer pending_data_;
  118. SSL* ssl_;
  119. // Holds the SSL context, which may be shared if an session cache is provided.
  120. SSL_CTX* ssl_ctx_;
  121. // Hostname of server that is being connected, used for SNI.
  122. std::string ssl_host_name_;
  123. // Set the adapter to DTLS or TLS mode before creating the context.
  124. SSLMode ssl_mode_;
  125. // If true, the server certificate need not match the configured hostname.
  126. bool ignore_bad_cert_;
  127. // List of protocols to be used in the TLS ALPN extension.
  128. std::vector<std::string> alpn_protocols_;
  129. // List of elliptic curves to be used in the TLS elliptic curves extension.
  130. std::vector<std::string> elliptic_curves_;
  131. // Holds the result of the call to run of the ssl_cert_verify_->Verify()
  132. bool custom_cert_verifier_status_;
  133. };
  134. // The OpenSSLAdapterFactory is responsbile for creating multiple new
  135. // OpenSSLAdapters with a shared SSL_CTX and a shared SSL_SESSION cache. The
  136. // SSL_SESSION cache allows existing SSL_SESSIONS to be reused instead of
  137. // recreating them leading to a significant performance improvement.
  138. class OpenSSLAdapterFactory : public SSLAdapterFactory {
  139. public:
  140. OpenSSLAdapterFactory();
  141. ~OpenSSLAdapterFactory() override;
  142. // Set the SSL Mode to use with this factory. This should only be set before
  143. // the first adapter is created with the factory. If it is called after it
  144. // will DCHECK.
  145. void SetMode(SSLMode mode) override;
  146. // Set a custom certificate verifier to be passed down to each instance
  147. // created with this factory. This should only ever be set before the first
  148. // call to the factory and cannot be changed after the fact.
  149. void SetCertVerifier(SSLCertificateVerifier* ssl_cert_verifier) override;
  150. // Constructs a new socket using the shared OpenSSLSessionCache. This means
  151. // existing SSLSessions already in the cache will be reused instead of
  152. // re-created for improved performance.
  153. OpenSSLAdapter* CreateAdapter(AsyncSocket* socket) override;
  154. private:
  155. // Holds the SSLMode (DTLS,TLS) that will be used to set the session cache.
  156. SSLMode ssl_mode_ = SSL_MODE_TLS;
  157. // Holds a cache of existing SSL Sessions.
  158. std::unique_ptr<OpenSSLSessionCache> ssl_session_cache_;
  159. // Provides an optional custom callback for verifying SSL certificates, this
  160. // in currently only used for TLS-TURN connections.
  161. SSLCertificateVerifier* ssl_cert_verifier_ = nullptr;
  162. // TODO(benwright): Remove this when context is moved to OpenSSLCommon.
  163. // Hold a friend class to the OpenSSLAdapter to retrieve the context.
  164. friend class OpenSSLAdapter;
  165. };
  166. std::string TransformAlpnProtocols(const std::vector<std::string>& protos);
  167. } // namespace rtc
  168. #endif // RTC_BASE_OPENSSL_ADAPTER_H_