1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-07 04:02:58 +03:00

SSLProtocol: allow explicit control of TLSv1.1 and TLSv1.2 flavors when

compiled against OpenSSL 1.0.1 or later. Update documentation.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1222921 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Kaspar Brand
2011-12-24 06:40:10 +00:00
parent 9900465205
commit 1af61dfb2e
5 changed files with 70 additions and 9 deletions

View File

@@ -61,7 +61,7 @@ compatibility variables.</p>
<th>Description:</th> <th>Description:</th>
</tr> </tr>
<tr><td><code>HTTPS</code></td> <td>flag</td> <td>HTTPS is being used.</td></tr> <tr><td><code>HTTPS</code></td> <td>flag</td> <td>HTTPS is being used.</td></tr>
<tr><td><code>SSL_PROTOCOL</code></td> <td>string</td> <td>The SSL protocol version (SSLv3, TLSv1)</td></tr> <tr><td><code>SSL_PROTOCOL</code></td> <td>string</td> <td>The SSL protocol version (SSLv3, TLSv1, TLSv1.1, TLSv1.2)</td></tr>
<tr><td><code>SSL_SESSION_ID</code></td> <td>string</td> <td>The hex-encoded SSL session id</td></tr> <tr><td><code>SSL_SESSION_ID</code></td> <td>string</td> <td>The hex-encoded SSL session id</td></tr>
<tr><td><code>SSL_SESSION_RESUMED</code></td> <td>string</td> <td>Initial or Resumed SSL Session. Note: multiple requests may be served over the same (Initial or Resumed) SSL session if HTTP KeepAlive is in use</td></tr> <tr><td><code>SSL_SESSION_RESUMED</code></td> <td>string</td> <td>Initial or Resumed SSL Session. Note: multiple requests may be served over the same (Initial or Resumed) SSL session if HTTP KeepAlive is in use</td></tr>
<tr><td><code>SSL_SECURE_RENEG</code></td> <td>string</td> <td><code>true</code> if secure renegotiation is supported, else <code>false</code></td></tr> <tr><td><code>SSL_SECURE_RENEG</code></td> <td>string</td> <td><code>true</code> if secure renegotiation is supported, else <code>false</code></td></tr>
@@ -588,15 +588,25 @@ The available (case-insensitive) <em>protocol</em>s are:</p>
<li><code>TLSv1</code> <li><code>TLSv1</code>
<p> <p>
This is the Transport Layer Security (TLS) protocol, version 1.0. It is the This is the Transport Layer Security (TLS) protocol, version 1.0.
successor to SSLv3 and was originally defined in <a href="http://www.ietf.org/rfc/rfc2246.txt">RFC 2246</a> It is the successor to SSLv3 and is defined in
(obsoleted by <a href="http://www.ietf.org/rfc/rfc4346.txt">RFC 4346</a> <a href="http://www.ietf.org/rfc/rfc2246.txt">RFC 2246</a>.</p></li>
and <a href="http://www.ietf.org/rfc/rfc5246.txt">RFC 5246</a> in
the meantime).</p></li> <li><code>TLSv1.1</code> (when using OpenSSL 1.0.1 and later)
<p>
A revision of the TLS 1.0 protocol, as defined in
<a href="http://www.ietf.org/rfc/rfc4346.txt">RFC 4346</a>.</p></li>
<li><code>TLSv1.2</code> (when using OpenSSL 1.0.1 and later)
<p>
A revision of the TLS 1.1 protocol, as defined in
<a href="http://www.ietf.org/rfc/rfc5246.txt">RFC 5246</a>.</p></li>
<li><code>all</code> <li><code>all</code>
<p> <p>
This is a shortcut for ``<code>+SSLv3 +TLSv1</code>''.</p></li> This is a shortcut for ``<code>+SSLv3 +TLSv1</code>'' or
- when using OpenSSL 1.0.1 and later -
``<code>+SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2</code>, respectively.</p></li>
</ul> </ul>
<example><title>Example</title> <example><title>Example</title>
SSLProtocol TLSv1 SSLProtocol TLSv1

View File

@@ -130,7 +130,11 @@ static const command_rec ssl_config_cmds[] = {
"('N' - number of seconds)") "('N' - number of seconds)")
SSL_CMD_SRV(Protocol, RAW_ARGS, SSL_CMD_SRV(Protocol, RAW_ARGS,
"Enable or disable various SSL protocols" "Enable or disable various SSL protocols"
"('[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)") #ifdef HAVE_TLSV1_X
"('[+-][SSLv3|TLSv1|TLSv1.1|TLSv1.2] ...' - see manual)")
#else
"('[+-][SSLv3|TLSv1] ...' - see manual)")
#endif
SSL_CMD_SRV(HonorCipherOrder, FLAG, SSL_CMD_SRV(HonorCipherOrder, FLAG,
"Use the server's cipher ordering preference") "Use the server's cipher ordering preference")
SSL_CMD_SRV(InsecureRenegotiation, FLAG, SSL_CMD_SRV(InsecureRenegotiation, FLAG,
@@ -148,7 +152,11 @@ static const command_rec ssl_config_cmds[] = {
"('on', 'off')") "('on', 'off')")
SSL_CMD_SRV(ProxyProtocol, RAW_ARGS, SSL_CMD_SRV(ProxyProtocol, RAW_ARGS,
"SSL Proxy: enable or disable SSL protocol flavors " "SSL Proxy: enable or disable SSL protocol flavors "
"('[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)") #ifdef HAVE_TLSV1_X
"('[+-][SSLv3|TLSv1|TLSv1.1|TLSv1.2] ...' - see manual)")
#else
"('[+-][SSLv3|TLSv1] ...' - see manual)")
#endif
SSL_CMD_SRV(ProxyCipherSuite, TAKE1, SSL_CMD_SRV(ProxyCipherSuite, TAKE1,
"SSL Proxy: colon-delimited list of permitted SSL ciphers " "SSL Proxy: colon-delimited list of permitted SSL ciphers "
"('XXX:...:XXX' - see manual)") "('XXX:...:XXX' - see manual)")

View File

@@ -1283,6 +1283,12 @@ static const char *ssl_cmd_protocol_parse(cmd_parms *parms,
else if (strcEQ(w, "TLSv1")) { else if (strcEQ(w, "TLSv1")) {
thisopt = SSL_PROTOCOL_TLSV1; thisopt = SSL_PROTOCOL_TLSV1;
} }
else if (strcEQ(w, "TLSv1.1")) {
thisopt = SSL_PROTOCOL_TLSV1_1;
}
else if (strcEQ(w, "TLSv1.2")) {
thisopt = SSL_PROTOCOL_TLSV1_2;
}
else if (strcEQ(w, "all")) { else if (strcEQ(w, "all")) {
thisopt = SSL_PROTOCOL_ALL; thisopt = SSL_PROTOCOL_ALL;
} }

View File

@@ -501,6 +501,10 @@ static void ssl_init_ctx_protocol(server_rec *s,
cp = apr_pstrcat(p, cp = apr_pstrcat(p,
(protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""), (protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""),
(protocol & SSL_PROTOCOL_TLSV1 ? "TLSv1, " : ""), (protocol & SSL_PROTOCOL_TLSV1 ? "TLSv1, " : ""),
#ifdef HAVE_TLSV1_X
(protocol & SSL_PROTOCOL_TLSV1_1 ? "TLSv1.1, " : ""),
(protocol & SSL_PROTOCOL_TLSV1_2 ? "TLSv1.2, " : ""),
#endif
NULL); NULL);
cp[strlen(cp)-2] = NUL; cp[strlen(cp)-2] = NUL;
@@ -517,6 +521,18 @@ static void ssl_init_ctx_protocol(server_rec *s,
TLSv1_client_method() : /* proxy */ TLSv1_client_method() : /* proxy */
TLSv1_server_method(); /* server */ TLSv1_server_method(); /* server */
} }
#ifdef HAVE_TLSV1_X
else if (protocol == SSL_PROTOCOL_TLSV1_1) {
method = mctx->pkp ?
TLSv1_1_client_method() : /* proxy */
TLSv1_1_server_method(); /* server */
}
else if (protocol == SSL_PROTOCOL_TLSV1_2) {
method = mctx->pkp ?
TLSv1_2_client_method() : /* proxy */
TLSv1_2_server_method(); /* server */
}
#endif
else { /* For multiple protocols, we need a flexible method */ else { /* For multiple protocols, we need a flexible method */
method = mctx->pkp ? method = mctx->pkp ?
SSLv23_client_method() : /* proxy */ SSLv23_client_method() : /* proxy */
@@ -539,6 +555,16 @@ static void ssl_init_ctx_protocol(server_rec *s,
SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1); SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1);
} }
#ifdef HAVE_TLSV1_X
if (!(protocol & SSL_PROTOCOL_TLSV1_1)) {
SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1);
}
if (!(protocol & SSL_PROTOCOL_TLSV1_2)) {
SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_2);
}
#endif
#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE #ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
if (sc->cipher_server_pref == TRUE) { if (sc->cipher_server_pref == TRUE) {
SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);

View File

@@ -176,6 +176,10 @@
#endif #endif
#endif #endif
#ifdef SSL_OP_NO_TLSv1_2
#define HAVE_TLSV1_X
#endif
/* mod_ssl headers */ /* mod_ssl headers */
#include "ssl_util_ssl.h" #include "ssl_util_ssl.h"
@@ -316,7 +320,14 @@ typedef int ssl_opt_t;
#define SSL_PROTOCOL_SSLV2 (1<<0) #define SSL_PROTOCOL_SSLV2 (1<<0)
#define SSL_PROTOCOL_SSLV3 (1<<1) #define SSL_PROTOCOL_SSLV3 (1<<1)
#define SSL_PROTOCOL_TLSV1 (1<<2) #define SSL_PROTOCOL_TLSV1 (1<<2)
#ifdef HAVE_TLSV1_X
#define SSL_PROTOCOL_TLSV1_1 (1<<3)
#define SSL_PROTOCOL_TLSV1_2 (1<<4)
#define SSL_PROTOCOL_ALL (SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1| \
SSL_PROTOCOL_TLSV1_1|SSL_PROTOCOL_TLSV1_2)
#else
#define SSL_PROTOCOL_ALL (SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1) #define SSL_PROTOCOL_ALL (SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1)
#endif
typedef int ssl_proto_t; typedef int ssl_proto_t;
/** /**