diff --git a/README.build b/README.build
index 2787bdee..64d98cf6 100644
--- a/README.build
+++ b/README.build
@@ -165,15 +165,6 @@ for later protocol versions... unlikely
- AWAITING_TIMEOUT default 5: after this many seconds without a response, the
server will hang up on the client
- - CIPHERS_LIST_STRING default "DEFAULT": SSL Cipher selection. It's advisable
-to tweak the ciphers allowed to be negotiated on secure connections for
-performance reasons, otherwise a slow algorithm may be selected by the two
-endpoints and the server could expend most of its time just encrypting and
-decrypting data, severely limiting the amount of messages it will be able to
-handle per second. For example::
-
- "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"
-
- SYSTEM_RANDOM_FILEPATH default "/dev/urandom": if your random device differs
you can set it here
diff --git a/README.coding b/README.coding
index bb093fb8..0231d030 100644
--- a/README.coding
+++ b/README.coding
@@ -209,3 +209,18 @@ Note that BSDs don't support keepalive time / probes / inteveral per-socket
like Linux does. On those systems you can enable keepalive by a nonzero
value in ka_time, but the systemwide kernel settings for the time / probes/
interval are used, regardless of what nonzero value is in ka_time.
+
+Optimizing SSL connections
+--------------------------
+
+There's a member ssl_cipher_list in the lws_context_creation_info struct
+which allows the user code to restrict the possible cipher selection at
+context-creation time.
+
+You might want to look into that to stop the ssl peers selecting a ciher which
+is too computationally expensive. To use it, point it to a string like
+
+"RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"
+
+if left NULL, then the "DEFAULT" set of ciphers are all possible to select.
+
diff --git a/changelog b/changelog
index 9b76f081..97c0f647 100644
--- a/changelog
+++ b/changelog
@@ -10,6 +10,10 @@ User api additions
and get a LWS_CALLBACK_HTTP_WRITEABLE callback, the same way you can
regulate writes with a websocket protocol connection.
+ - A new member in the context creation parameter struct "ssl_cipher_list" is
+ added, replacing CIPHERS_LIST_STRING. NULL means use the ssl library
+ default list of ciphers.
+
User api changes
----------------
@@ -27,6 +31,8 @@ User api removal
were using it to get user_space, you need to adapt your code to only
use user_space inside the user callback.
+ - CIPHERS_LIST_STRING is removed
+
v1.21-chrome26-firefox18
========================
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 337582d3..7414fe74 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -1657,7 +1657,8 @@ libwebsocket_create_context(struct lws_context_creation_info *info)
#endif
lwsl_info(" SPEC_LATEST_SUPPORTED: %u\n", SPEC_LATEST_SUPPORTED);
lwsl_info(" AWAITING_TIMEOUT: %u\n", AWAITING_TIMEOUT);
- lwsl_info(" CIPHERS_LIST_STRING: '%s'\n", CIPHERS_LIST_STRING);
+ if (info->ssl_cipher_list)
+ lwsl_info(" SSL ciphers: '%s'\n", info->ssl_cipher_list);
lwsl_info(" SYSTEM_RANDOM_FILEPATH: '%s'\n", SYSTEM_RANDOM_FILEPATH);
lwsl_info(" LWS_MAX_ZLIB_CONN_BUFFER: %u\n", LWS_MAX_ZLIB_CONN_BUFFER);
@@ -1877,7 +1878,9 @@ libwebsocket_create_context(struct lws_context_creation_info *info)
SSL_CTX_set_options(context->ssl_ctx, SSL_OP_NO_COMPRESSION);
#endif
SSL_CTX_set_options(context->ssl_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
- SSL_CTX_set_cipher_list(context->ssl_ctx, CIPHERS_LIST_STRING);
+ if (info->ssl_cipher_list)
+ SSL_CTX_set_cipher_list(context->ssl_ctx,
+ info->ssl_cipher_list);
#ifndef LWS_NO_CLIENT
@@ -1908,8 +1911,9 @@ libwebsocket_create_context(struct lws_context_creation_info *info)
#endif
SSL_CTX_set_options(context->ssl_client_ctx,
SSL_OP_CIPHER_SERVER_PREFERENCE);
- SSL_CTX_set_cipher_list(context->ssl_client_ctx,
- CIPHERS_LIST_STRING);
+ if (info->ssl_cipher_list)
+ SSL_CTX_set_cipher_list(context->ssl_client_ctx,
+ info->ssl_cipher_list);
/* openssl init for cert verification (for client sockets) */
if (!info->ssl_ca_filepath) {
diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h
index b7f43fc4..28e649c6 100644
--- a/lib/libwebsockets.h
+++ b/lib/libwebsockets.h
@@ -759,6 +759,9 @@ struct libwebsocket_extension {
* @ssl_private_key_filepath: filepath to private key if wanting SSL mode,
* else ignored
* @ssl_ca_filepath: CA certificate filepath or NULL
+ * @ssl_cipher_list: List of valid ciphers to use (eg,
+ * "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"
+ * or you can leave it as NULL to get "DEFAULT"
* @gid: group id to change to after setting listen socket, or -1.
* @uid: user id to change to after setting listen socket, or -1.
* @options: 0, or LWS_SERVER_OPTION_DEFEAT_CLIENT_MASK
@@ -781,6 +784,7 @@ struct lws_context_creation_info {
const char *ssl_cert_filepath;
const char *ssl_private_key_filepath;
const char *ssl_ca_filepath;
+ const char *ssl_cipher_list;
int gid;
int uid;
unsigned int options;
diff --git a/libwebsockets-api-doc.html b/libwebsockets-api-doc.html
index 42a37b0d..a38145cd 100644
--- a/libwebsockets-api-doc.html
+++ b/libwebsockets-api-doc.html
@@ -637,7 +637,7 @@ and servers get LWS_CALLBACK_SERVER_WRITEABLE.
called when a client connects to
the server at network level; the connection is accepted but then
passed to this callback to decide whether to hang up immediately
-or not, based on the client IP. user contains the connection
+or not, based on the client IP. in contains the connection
socket's descriptor. Return non-zero to terminate
the connection before sending or receiving anything.
Because this happens immediately after the network connection
@@ -969,6 +969,7 @@ all sessions, etc, if it wants
const char * ssl_cert_filepath;
const char * ssl_private_key_filepath;
const char * ssl_ca_filepath;
+ const char * ssl_cipher_list;
int gid;
int uid;
unsigned int options;
@@ -1004,6 +1005,10 @@ server cert from, otherwise NULL for unencrypted
else ignored