|
41 | 41 | !defined(LIBRESSL_VERSION_NUMBER) // Required as OPENSSL_VERSION_NUMBER for LibreSSL is defined
|
42 | 42 | // as 2.0.0
|
43 | 43 | #if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
|
| 44 | +#define SSL_CAN_SET_MIN_VERSION |
44 | 45 | #define SSL_CLIENT_METHOD TLS_client_method
|
45 | 46 | #else
|
46 | 47 | #define SSL_CLIENT_METHOD SSLv23_client_method
|
47 | 48 | #endif
|
48 | 49 | #else
|
49 | 50 | #if (LIBRESSL_VERSION_NUMBER >= 0x20302000L)
|
| 51 | +#define SSL_CAN_SET_MIN_VERSION |
50 | 52 | #define SSL_CLIENT_METHOD TLS_client_method
|
51 | 53 | #else
|
52 | 54 | #define SSL_CLIENT_METHOD SSLv23_client_method
|
@@ -615,6 +617,48 @@ CassError OpenSslContext::set_private_key(const char* key, size_t key_length, co
|
615 | 617 | return CASS_OK;
|
616 | 618 | }
|
617 | 619 |
|
| 620 | +CassError OpenSslContext::set_min_protocol_version(CassSslTlsVersion min_version) { |
| 621 | +#ifdef SSL_CAN_SET_MIN_VERSION |
| 622 | + int method; |
| 623 | + switch (min_version) { |
| 624 | + case CassSslTlsVersion::CASS_SSL_VERSION_TLS1: |
| 625 | + method = TLS1_VERSION; |
| 626 | + break; |
| 627 | + case CassSslTlsVersion::CASS_SSL_VERSION_TLS1_1: |
| 628 | + method = TLS1_1_VERSION; |
| 629 | + break; |
| 630 | + case CassSslTlsVersion::CASS_SSL_VERSION_TLS1_2: |
| 631 | + method = TLS1_2_VERSION; |
| 632 | + break; |
| 633 | + default: |
| 634 | + // unsupported version |
| 635 | + return CASS_ERROR_LIB_BAD_PARAMS; |
| 636 | + } |
| 637 | + SSL_CTX_set_min_proto_version(ssl_ctx_, method); |
| 638 | + return CASS_OK; |
| 639 | +#else |
| 640 | + // If we don't have the `set_min_proto_version` function then we do this via |
| 641 | + // the (deprecated in later versions) options function. |
| 642 | + int options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; |
| 643 | + switch (min_version) { |
| 644 | + case CassSslTlsVersion::CASS_SSL_VERSION_TLS1: |
| 645 | + break; |
| 646 | + case CassSslTlsVersion::CASS_SSL_VERSION_TLS1_1: |
| 647 | + options |= SSL_OP_NO_TLSv1; |
| 648 | + break; |
| 649 | + case CassSslTlsVersion::CASS_SSL_VERSION_TLS1_2: |
| 650 | + options |= SSL_OP_NO_TLSv1; |
| 651 | + options |= SSL_OP_NO_TLSv1_1; |
| 652 | + break; |
| 653 | + default: |
| 654 | + // unsupported version |
| 655 | + return CASS_ERROR_LIB_BAD_PARAMS; |
| 656 | + } |
| 657 | + SSL_CTX_set_options(ssl_ctx_, options); |
| 658 | + return CASS_OK; |
| 659 | +#endif |
| 660 | +} |
| 661 | + |
618 | 662 | SslContext::Ptr OpenSslContextFactory::create() { return SslContext::Ptr(new OpenSslContext()); }
|
619 | 663 |
|
620 | 664 | namespace openssl {
|
|
0 commit comments