In the python 2.7.8 to 2.7.9 upgrade, the ssl module changed from using
_DEFAULT_CIPHERS = \'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2\'
to
You might want to have a look into openssl cipher
's source code at https://github.com/openssl/openssl/blob/master/apps/ciphers.c
The crucial steps seem to be:
meth = SSLv23_server_method();
ctx = SSL_CTX_new(meth);
SSL_CTX_set_cipher_list(ctx, ciphers)
, whereas ciphers
is your stringssl = SSL_new(ctx);
sk = SSL_get1_supported_ciphers(ssl);
for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) {
print SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, i));
}
The SSL_CTX_set_cipher_list
function is called in Python 3.4 in _ssl's set_ciphers
method for contexts. You can achieve the same using:
import socket
from ssl import SSLSocket
sslsock = SSLSocket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sslsock.context.set_ciphers('DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2')
The next step would be calling SSL_get1_supported_ciphers()
which, unfortunately, is not used in Python's _ssl.c. The closest you can get is the shared_ciphers()
method of SSLSocket
instances. The (current) implementation is
static PyObject *PySSL_shared_ciphers(PySSLSocket *self)
{
[...]
ciphers = sess->ciphers;
res = PyList_New(sk_SSL_CIPHER_num(ciphers));
for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
PyObject *tup = cipher_to_tuple(sk_SSL_CIPHER_value(ciphers, i));
[...]
PyList_SET_ITEM(res, i, tup);
}
return res;
}
That is, this loop is very similar as in the ciphers.c
implementation above, and returns a Python list of ciphers, in the same order as the loop in ciphers.c
would.
Continuing with the sslsock = SSLSocket(...)
example from above, you cannot call sslsock.shared_ciphers()
before the socket is connected. Otherwise, Python's _ssl module does not create a low-level OpenSSL SSL object, which is needed to read the ciphers. That is different from the implementation in ciphers.c
, which creates a low level SSL object without requiring a connection.
That is how far I got, I hope that helps, and maybe you can figure out what you need based on these findings.