[squid-dev] [PATCH] sslproxy_options in peek-and-splice mode
Amos Jeffries
squid3 at treenet.co.nz
Thu Feb 12 15:33:42 UTC 2015
On 13/02/2015 3:34 a.m., Tsantilas Christos wrote:
> 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)" ?
I mean the:
} else {
+ // Set client SSL options
+ SSL_set_options(ssl, ::Config.ssl_client.parsedOptions);
+
>
> 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);
Specifically:
Must(
!csd->sslServerBump() ||
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.
Which would make step 0 or 1 for client-first right? that is fine.
For server-first it does need updating at the point the server is given
data. A jump right to step 3, or even a new "sslBumpStepServerFirst"
value at the end of the enum.
Amos
More information about the squid-dev
mailing list