.. versionadded:: 3.7
+.. attribute:: SSLContext.security_level
+
+ An integer representing the `security level
+ <https://www.openssl.org/docs/manmaster/man3/SSL_CTX_get_security_level.html>`_
+ for the context. This attribute is read-only.
+
+ .. availability:: OpenSSL 1.1.0 or newer
+
+ .. versionadded:: 3.10
+
.. attribute:: SSLContext.verify_flags
The flags for certificate verification operations. You can set flags like
ctx.maximum_version = ssl.TLSVersion.TLSv1
+ @unittest.skipUnless(
+ hasattr(ssl.SSLContext, 'security_level'),
+ "requires OpenSSL >= 1.1.0"
+ )
+ def test_security_level(self):
+ ctx = ssl.SSLContext()
+ # The default security callback allows for levels between 0-5
+ # with OpenSSL defaulting to 1, however some vendors override the
+ # default value (e.g. Debian defaults to 2)
+ security_level_range = {
+ 0,
+ 1, # OpenSSL default
+ 2, # Debian
+ 3,
+ 4,
+ 5,
+ }
+ self.assertIn(ctx.security_level, security_level_range)
+
@unittest.skipUnless(have_verify_flags(),
"verify_flags need OpenSSL > 0.9.8")
def test_verify_flags(self):
--- /dev/null
+Add read-only ssl.SSLContext.security_level attribute to retrieve the
+context's security level.
"Control the number of TLSv1.3 session tickets");
#endif /* OpenSSL 1.1.1 */
+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
+static PyObject *
+get_security_level(PySSLContext *self, void *c)
+{
+ return PyLong_FromLong(SSL_CTX_get_security_level(self->ctx));
+}
+PyDoc_STRVAR(PySSLContext_security_level_doc, "The current security level");
+#endif /* OpenSSL 1.1.0 */
+
static PyObject *
get_options(PySSLContext *self, void *c)
{
(setter) set_verify_flags, NULL},
{"verify_mode", (getter) get_verify_mode,
(setter) set_verify_mode, NULL},
+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
+ {"security_level", (getter) get_security_level,
+ NULL, PySSLContext_security_level_doc},
+#endif
{NULL}, /* sentinel */
};