FS-11730 Add support for DTLSv1.2 and make default
Needed in Chrome version >= 74 as Chrome dropped support for v1.0: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/discuss-webrtc/yr6gbAgWsKo/9X5vQb8kGAAJ Using old v1.0 DTLS if 1.2 is not available or legacy DTLS wanted explicitly. To request old DTLS set variable <action application="set" data="legacyDTLS=1"/> Note: requires openssl 1.0.2 or later for DTLS v1.2 support
This commit is contained in:
parent
a095c83ecc
commit
9682d2c2c9
|
@ -1594,6 +1594,7 @@ if test x$HAVE_OPENSSL = x1; then
|
||||||
APR_ADDTO(SWITCH_AM_CFLAGS, -DHAVE_OPENSSL)
|
APR_ADDTO(SWITCH_AM_CFLAGS, -DHAVE_OPENSSL)
|
||||||
AC_CHECK_LIB(ssl, SSL_CTX_set_tlsext_use_srtp, AC_DEFINE_UNQUOTED(HAVE_OPENSSL_DTLS_SRTP, 1, HAVE_OPENSSL_DTLS_SRTP), AC_MSG_ERROR([OpenSSL >= 1.0.1e and associated developement headers required]))
|
AC_CHECK_LIB(ssl, SSL_CTX_set_tlsext_use_srtp, AC_DEFINE_UNQUOTED(HAVE_OPENSSL_DTLS_SRTP, 1, HAVE_OPENSSL_DTLS_SRTP), AC_MSG_ERROR([OpenSSL >= 1.0.1e and associated developement headers required]))
|
||||||
AC_CHECK_LIB(ssl, DTLSv1_method, AC_DEFINE_UNQUOTED(HAVE_OPENSSL_DTLS, 1, HAVE_OPENSSL_DTLS), AC_MSG_ERROR([OpenSSL >= 1.0.1e and associaed developement headers required]))
|
AC_CHECK_LIB(ssl, DTLSv1_method, AC_DEFINE_UNQUOTED(HAVE_OPENSSL_DTLS, 1, HAVE_OPENSSL_DTLS), AC_MSG_ERROR([OpenSSL >= 1.0.1e and associaed developement headers required]))
|
||||||
|
AC_CHECK_LIB(ssl, DTLSv1_2_method, AC_DEFINE_UNQUOTED(HAVE_OPENSSL_DTLSv1_2_method, 1, [DTLS version 1.2 is available]))
|
||||||
else
|
else
|
||||||
AC_MSG_ERROR([OpenSSL >= 1.0.1e and associated developement headers required])
|
AC_MSG_ERROR([OpenSSL >= 1.0.1e and associated developement headers required])
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -578,7 +578,7 @@ SWITCH_DECLARE(switch_rtp_stats_t *) switch_rtp_get_stats(switch_rtp_t *rtp_sess
|
||||||
SWITCH_DECLARE(switch_byte_t) switch_rtp_check_auto_adj(switch_rtp_t *rtp_session);
|
SWITCH_DECLARE(switch_byte_t) switch_rtp_check_auto_adj(switch_rtp_t *rtp_session);
|
||||||
SWITCH_DECLARE(void) switch_rtp_set_interdigit_delay(switch_rtp_t *rtp_session, uint32_t delay);
|
SWITCH_DECLARE(void) switch_rtp_set_interdigit_delay(switch_rtp_t *rtp_session, uint32_t delay);
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, dtls_fingerprint_t *local_fp, dtls_fingerprint_t *remote_fp, dtls_type_t type);
|
SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, dtls_fingerprint_t *local_fp, dtls_fingerprint_t *remote_fp, dtls_type_t type, uint8_t want_DTLSv1_2);
|
||||||
SWITCH_DECLARE(switch_status_t) switch_rtp_del_dtls(switch_rtp_t *rtp_session, dtls_type_t type);
|
SWITCH_DECLARE(switch_status_t) switch_rtp_del_dtls(switch_rtp_t *rtp_session, dtls_type_t type);
|
||||||
SWITCH_DECLARE(dtls_state_t) switch_rtp_dtls_state(switch_rtp_t *rtp_session, dtls_type_t type);
|
SWITCH_DECLARE(dtls_state_t) switch_rtp_dtls_state(switch_rtp_t *rtp_session, dtls_type_t type);
|
||||||
|
|
||||||
|
|
|
@ -1577,6 +1577,7 @@ typedef enum {
|
||||||
CF_STREAM_CHANGED,
|
CF_STREAM_CHANGED,
|
||||||
CF_ARRANGED_BRIDGE,
|
CF_ARRANGED_BRIDGE,
|
||||||
CF_STATE_REPEAT,
|
CF_STATE_REPEAT,
|
||||||
|
CF_WANT_DTLSv1_2,
|
||||||
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
|
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
|
||||||
/* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
|
/* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
|
||||||
CF_FLAG_MAX
|
CF_FLAG_MAX
|
||||||
|
|
|
@ -8388,6 +8388,13 @@ static void check_dtls_reinvite(switch_core_session_t *session, switch_rtp_engin
|
||||||
if (switch_channel_test_flag(session->channel, CF_REINVITE) && engine->new_dtls) {
|
if (switch_channel_test_flag(session->channel, CF_REINVITE) && engine->new_dtls) {
|
||||||
|
|
||||||
if (!zstr(engine->local_dtls_fingerprint.str) && switch_rtp_has_dtls() && dtls_ok(session)) {
|
if (!zstr(engine->local_dtls_fingerprint.str) && switch_rtp_has_dtls() && dtls_ok(session)) {
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENSSL_DTLSv1_2_method
|
||||||
|
uint8_t want_DTLSv1_2 = 1;
|
||||||
|
#else
|
||||||
|
uint8_t want_DTLSv1_2 = 0;
|
||||||
|
#endif // HAVE_OPENSSL_DTLSv1_2_method
|
||||||
|
|
||||||
dtls_type_t xtype, dtype = engine->dtls_controller ? DTLS_TYPE_CLIENT : DTLS_TYPE_SERVER;
|
dtls_type_t xtype, dtype = engine->dtls_controller ? DTLS_TYPE_CLIENT : DTLS_TYPE_SERVER;
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "RE-SETTING %s DTLS\n", type2str(engine->type));
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "RE-SETTING %s DTLS\n", type2str(engine->type));
|
||||||
|
@ -8395,11 +8402,16 @@ static void check_dtls_reinvite(switch_core_session_t *session, switch_rtp_engin
|
||||||
xtype = DTLS_TYPE_RTP;
|
xtype = DTLS_TYPE_RTP;
|
||||||
if (engine->rtcp_mux > 0) xtype |= DTLS_TYPE_RTCP;
|
if (engine->rtcp_mux > 0) xtype |= DTLS_TYPE_RTCP;
|
||||||
|
|
||||||
switch_rtp_add_dtls(engine->rtp_session, &engine->local_dtls_fingerprint, &engine->remote_dtls_fingerprint, dtype | xtype);
|
if (switch_channel_var_true(session->channel, "legacyDTLS")) {
|
||||||
|
switch_channel_clear_flag(session->channel, CF_WANT_DTLSv1_2);
|
||||||
|
want_DTLSv1_2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_rtp_add_dtls(engine->rtp_session, &engine->local_dtls_fingerprint, &engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
|
|
||||||
if (engine->rtcp_mux < 1) {
|
if (engine->rtcp_mux < 1) {
|
||||||
xtype = DTLS_TYPE_RTCP;
|
xtype = DTLS_TYPE_RTCP;
|
||||||
switch_rtp_add_dtls(engine->rtp_session, &engine->local_dtls_fingerprint, &engine->remote_dtls_fingerprint, dtype | xtype);
|
switch_rtp_add_dtls(engine->rtp_session, &engine->local_dtls_fingerprint, &engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8422,6 +8434,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
|
||||||
switch_media_handle_t *smh;
|
switch_media_handle_t *smh;
|
||||||
int is_reinvite = 0;
|
int is_reinvite = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENSSL_DTLSv1_2_method
|
||||||
|
uint8_t want_DTLSv1_2 = 1;
|
||||||
|
#else
|
||||||
|
uint8_t want_DTLSv1_2 = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch_assert(session);
|
switch_assert(session);
|
||||||
|
|
||||||
if (!(smh = session->media_handle)) {
|
if (!(smh = session->media_handle)) {
|
||||||
|
@ -8451,6 +8469,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
|
||||||
switch_channel_set_flag(session->channel, CF_SECURE);
|
switch_channel_set_flag(session->channel, CF_SECURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (want_DTLSv1_2) {
|
||||||
|
switch_channel_set_flag(session->channel, CF_WANT_DTLSv1_2);
|
||||||
|
}
|
||||||
|
|
||||||
if (switch_channel_test_flag(session->channel, CF_PROXY_MODE)) {
|
if (switch_channel_test_flag(session->channel, CF_PROXY_MODE)) {
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -8806,11 +8828,16 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
|
||||||
xtype = DTLS_TYPE_RTP;
|
xtype = DTLS_TYPE_RTP;
|
||||||
if (a_engine->rtcp_mux > 0 && smh->mparams->rtcp_audio_interval_msec) xtype |= DTLS_TYPE_RTCP;
|
if (a_engine->rtcp_mux > 0 && smh->mparams->rtcp_audio_interval_msec) xtype |= DTLS_TYPE_RTCP;
|
||||||
|
|
||||||
switch_rtp_add_dtls(a_engine->rtp_session, &a_engine->local_dtls_fingerprint, &a_engine->remote_dtls_fingerprint, dtype | xtype);
|
if (switch_channel_var_true(session->channel, "legacyDTLS")) {
|
||||||
|
switch_channel_clear_flag(session->channel, CF_WANT_DTLSv1_2);
|
||||||
|
want_DTLSv1_2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_rtp_add_dtls(a_engine->rtp_session, &a_engine->local_dtls_fingerprint, &a_engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
|
|
||||||
if (a_engine->rtcp_mux < 1 && smh->mparams->rtcp_audio_interval_msec) {
|
if (a_engine->rtcp_mux < 1 && smh->mparams->rtcp_audio_interval_msec) {
|
||||||
xtype = DTLS_TYPE_RTCP;
|
xtype = DTLS_TYPE_RTCP;
|
||||||
switch_rtp_add_dtls(a_engine->rtp_session, &a_engine->local_dtls_fingerprint, &a_engine->remote_dtls_fingerprint, dtype | xtype);
|
switch_rtp_add_dtls(a_engine->rtp_session, &a_engine->local_dtls_fingerprint, &a_engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9167,11 +9194,16 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
|
||||||
xtype = DTLS_TYPE_RTP;
|
xtype = DTLS_TYPE_RTP;
|
||||||
if (t_engine->rtcp_mux > 0 && smh->mparams->rtcp_text_interval_msec) xtype |= DTLS_TYPE_RTCP;
|
if (t_engine->rtcp_mux > 0 && smh->mparams->rtcp_text_interval_msec) xtype |= DTLS_TYPE_RTCP;
|
||||||
|
|
||||||
switch_rtp_add_dtls(t_engine->rtp_session, &t_engine->local_dtls_fingerprint, &t_engine->remote_dtls_fingerprint, dtype | xtype);
|
if (switch_channel_var_true(session->channel, "legacyDTLS")) {
|
||||||
|
switch_channel_clear_flag(session->channel, CF_WANT_DTLSv1_2);
|
||||||
|
want_DTLSv1_2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_rtp_add_dtls(t_engine->rtp_session, &t_engine->local_dtls_fingerprint, &t_engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
|
|
||||||
if (t_engine->rtcp_mux < 1 && smh->mparams->rtcp_text_interval_msec) {
|
if (t_engine->rtcp_mux < 1 && smh->mparams->rtcp_text_interval_msec) {
|
||||||
xtype = DTLS_TYPE_RTCP;
|
xtype = DTLS_TYPE_RTCP;
|
||||||
switch_rtp_add_dtls(t_engine->rtp_session, &t_engine->local_dtls_fingerprint, &t_engine->remote_dtls_fingerprint, dtype | xtype);
|
switch_rtp_add_dtls(t_engine->rtp_session, &t_engine->local_dtls_fingerprint, &t_engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9494,11 +9526,17 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
|
||||||
xtype = DTLS_TYPE_RTP;
|
xtype = DTLS_TYPE_RTP;
|
||||||
if (v_engine->rtcp_mux > 0 && smh->mparams->rtcp_video_interval_msec) xtype |= DTLS_TYPE_RTCP;
|
if (v_engine->rtcp_mux > 0 && smh->mparams->rtcp_video_interval_msec) xtype |= DTLS_TYPE_RTCP;
|
||||||
|
|
||||||
switch_rtp_add_dtls(v_engine->rtp_session, &v_engine->local_dtls_fingerprint, &v_engine->remote_dtls_fingerprint, dtype | xtype);
|
|
||||||
|
if (switch_channel_var_true(session->channel, "legacyDTLS")) {
|
||||||
|
switch_channel_clear_flag(session->channel, CF_WANT_DTLSv1_2);
|
||||||
|
want_DTLSv1_2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_rtp_add_dtls(v_engine->rtp_session, &v_engine->local_dtls_fingerprint, &v_engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
|
|
||||||
if (v_engine->rtcp_mux < 1 && smh->mparams->rtcp_video_interval_msec) {
|
if (v_engine->rtcp_mux < 1 && smh->mparams->rtcp_video_interval_msec) {
|
||||||
xtype = DTLS_TYPE_RTCP;
|
xtype = DTLS_TYPE_RTCP;
|
||||||
switch_rtp_add_dtls(v_engine->rtp_session, &v_engine->local_dtls_fingerprint, &v_engine->remote_dtls_fingerprint, dtype | xtype);
|
switch_rtp_add_dtls(v_engine->rtp_session, &v_engine->local_dtls_fingerprint, &v_engine->remote_dtls_fingerprint, dtype | xtype, want_DTLSv1_2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3201,7 +3201,7 @@ static int dtls_state_handshake(switch_rtp_t *rtp_session, switch_dtls_t *dtls)
|
||||||
case SSL_ERROR_NONE:
|
case SSL_ERROR_NONE:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, "%s Handshake failure %d\n", rtp_type(rtp_session), ret);
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, "%s Handshake failure %d. This may happen when you use legacy DTLS v1.0 (legacyDTLS channel var is set) but endpoint requires DTLS v1.2.\n", rtp_type(rtp_session), ret);
|
||||||
dtls_set_state(dtls, DS_FAIL);
|
dtls_set_state(dtls, DS_FAIL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -3634,7 +3634,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_del_dtls(switch_rtp_t *rtp_session, d
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, dtls_fingerprint_t *local_fp, dtls_fingerprint_t *remote_fp, dtls_type_t type)
|
SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, dtls_fingerprint_t *local_fp, dtls_fingerprint_t *remote_fp, dtls_type_t type, uint8_t want_DTLSv1_2)
|
||||||
{
|
{
|
||||||
switch_dtls_t *dtls;
|
switch_dtls_t *dtls;
|
||||||
const char *var;
|
const char *var;
|
||||||
|
@ -3694,8 +3694,12 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
||||||
dtls->ssl_ctx = SSL_CTX_new((type & DTLS_TYPE_SERVER) ? DTLS_server_method() : DTLS_client_method());
|
dtls->ssl_ctx = SSL_CTX_new((type & DTLS_TYPE_SERVER) ? DTLS_server_method() : DTLS_client_method());
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_OPENSSL_DTLSv1_2_method
|
||||||
|
dtls->ssl_ctx = SSL_CTX_new((type & DTLS_TYPE_SERVER) ? (want_DTLSv1_2 ? DTLSv1_2_server_method() : DTLSv1_server_method()) : (want_DTLSv1_2 ? DTLSv1_2_client_method() : DTLSv1_client_method()));
|
||||||
#else
|
#else
|
||||||
dtls->ssl_ctx = SSL_CTX_new((type & DTLS_TYPE_SERVER) ? DTLSv1_server_method() : DTLSv1_client_method());
|
dtls->ssl_ctx = SSL_CTX_new((type & DTLS_TYPE_SERVER) ? DTLSv1_server_method() : DTLSv1_client_method());
|
||||||
|
#endif // HAVE_OPENSSL_DTLSv1_2_method
|
||||||
#endif
|
#endif
|
||||||
switch_assert(dtls->ssl_ctx);
|
switch_assert(dtls->ssl_ctx);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue