[squid-dev] [PATCH] sslproxy_options in peek-and-splice mode
Tsantilas Christos
chtsanti at users.sourceforge.net
Thu Feb 12 14:34:18 UTC 2015
On 02/12/2015 01:48 PM, Amos Jeffries wrote:
> On 12/02/2015 11:31 p.m., Tsantilas Christos wrote:
>> On 02/11/2015 09:48 PM, Amos Jeffries wrote:
>>> On 12/02/2015 12:45 a.m., Tsantilas Christos wrote:
>>>> On 02/11/2015 01:54 AM, Amos Jeffries wrote:
>>>>> On 9/02/2015 6:43 a.m., Tsantilas Christos wrote:
>>>>>> Bug description:
>>>>>>
>>>>>> - Squid sslproxy_options deny the use of TLSv1_2 SSL protocol:
>>>>>> sslproxy_options NO_TLSv1_2
>>>>>> - Squid uses peek mode for bumped connections.
>>>>>> - Web client sends an TLSv1_2 hello message and squid in peek
>>>>>> mode,
>>>>>> forwards the client hello message to server
>>>>>> - Web server respond with an TLSv1_2 hello message
>>>>>> - Squid while parsing server hello message aborts with an error
>>>>>> because sslproxy_options deny the use ot TLSv1_2 protocol.
>>>>>>
>>>>>> This patch fixes squid to ignore sslproxy_options in peek or stare
>>>>>> bumping mode.
>>>>>
>>>>> As I understand it the action of applying the options to the context
>>>>> removes from the context cipher references etc which are not possible.
>>>>>
>>>>> Since peek and stare are non-final states I can easily imagine that
>>>>> OpenSSL library negotiates ciphers which the options would otherwise
>>>>> prohibit. Then when the options get applied to the context it find
>>>>> itself using an algorithm which does not exist.
>>>>
>>>> The context SSL_CTX objects are bases to create the SSL objects which
>>>> are responsible for the negotiation with the other side (server in this
>>>> case).
>>>> The SSL created, inherits the options from CTXa nd we are adding our
>>>> options to SSL object.
>>>> The SSL library will use these options to build client hello message,
>>>> parse server hello message and select algorithms/ciphers and other
>>>> features to establish SSL connection.
>>>>
>>>> In my patch the options applied to the squid client SSL objects
>>>> immediately after created, in the case of bump-server-first, or
>>>> bump-client-first.
>>>>
>>>> In the cases of peek or stare we are not setting any options. This is
>>>> because we are sending a hello message which is the same or similar with
>>>> the client hello message, so we can not apply options. Else the peek or
>>>> stare will fail...
>>>>
>>>
>>> What I means is the code flow is roughly like this yes?
>>>
>>> 1) bump
>>> 2) splice
>>> 3) peek then bump
>>> 4) stare then bump
>>> 5) peek then splice
>>> 6) stare then splice
>>>
>>> In which of those cases are the options set?
>>> all cases ending in bump or splice.
>>
>> The important factor here is the bumping step.
>> in bump case (1,3,4)
>> - if the decision is to bump in bumpStep1 or bumpStep2 then the squid
>> SSL client options are set.
>> - If the decision for bumping taken in bumpStep3, the the squid SSL
>> client options are NOT set.
>>
>> in splice case (2,5 or 6) :
>> - if we splice on bumpStep1 or on bumpStep2, then we are not using
>> squid SSL client code at all, so the options does not play any role on
>> this case.
>> - If we splice on bumpStep3 we have use squid SSL client, but in this
>> case the options are not set.
>>
>>
>> After the bumpStep2 completed we have received the client hello message,
>> but we do not sent any response (server hello). At the same time we are
>> starting to initiate the connection to the SSL server. This is mean that
>> we are going to set SSL client hello message which is depends on SSL
>> client code. So:
>> - If we know that we will going to bump the connection, we can safely
>> set SSL client options. This is because the squid SSL client will
>> initiate a normal SSL connection.
>> - If we are going to stare, or peek then the client hello message we
>> are going to sent must be similar to the client-to-squid SSL hello
>> message. In this case we can not control SSL features using options,
>> else the SSL negotiation will fail.
>
> So you're saying the src/ssl/PeerConnector.cc else-condition never gets
> run after a peek and/or stare ?
Do you mean the "if (csd->sslBumpMode == Ssl::bumpPeek ||
csd->sslBumpMode == Ssl::bumpStare)" ?
Yes the "else" never gets run when peek or stare mode selected in
bumpStep2 bumping step.
>
> Then please add a Must(step <= 2) check at the start of that else
> condition right before setting the SSL client options. If that works
> properly I am happy for this to go in.
Requires a code like the following:
Must(csd->sslServerBump()->step<=Ssl::bumpStep2);
This is will not work. In client-first bumping mode or in server-first
bumping mode where we are not applying the peek-and-splice procedure the
step is not updated.
Also my sense is that in client-first bumping mode the
csd->sslServerBump() is NULL.
>
> NP: the above explanation may be worth adding to the commit message as
> an explanation for what the line "This patch fixes squid to ignore
> sslproxy_options in peek or stare bumping mode" actually means.
OK, I will try to add some explanations in commit message.
>
>
> Amos
More information about the squid-dev
mailing list