[openssl-users] OpenSSL performance issue

Jakob Bohm jb-openssl at wisemo.com
Fri Dec 19 11:11:46 UTC 2014


On 19/12/2014 00:10, Prabhat Puroshottam wrote:
> I am trying to summarize the problem again, since the previous
> mail seems confusing to some of you. It might help you quickly understand
> the problem I am facing:
>
> We have a product, where Client connects to Server (Proxy Server in my
> earlier mail). Client is implemented in C and uses OpenSSL, while Server is
> implemented using Java code with BufferedInputStream and
> BufferedOutputStream. The following are my observations:
>
> 1. There is "inordinate" delay during connection establishment.
> 2. Using ssldump it was found that SSL handshake response from Server is
>      taking most of the time. Rest of the application data transfer and
>      processing hardly takes fraction of a second. The response from SSL
>      handshake by Server comes after anywhere between 2 to 13 seconds
>      after initial response sent by Client.
> 3. Subsequent analysis of the code showed that it was the first Buffered
>     Read/Write which was taking "inordinate" amount of time.
> 4. Understanding that first Buffered Read/Write was hung on SSL connection
>      completion, I introduced SSLConnect::startHandshake() so that I can
>      explicitly see where is the problem. It was observed that now
>      startHandshake() blocked for as much time as first Read/Write did.
>      Further none of the Read/Write calls block, and returned data almost
>      immediately.
>
> I would like to understand why startHandshake() is taking so long. I
> understand that it is a asynchronous call, but still the time delay is too much
> IMO. Is it something to do with the socket configuration/cipher/encryption
> used? Using ssldump I found there was absolutely no data transfer
> between the sending of client's hello request and subsequent response
> from server, so apparently all the time startHandshake() is busy doing
> something or may be nothing - what I have no idea. FWIW, this is not a
> network latency issue, 1) all the boxes are on the same network, 2) all
> other data transfers combined takes less than 0.4s.
>
> Can somebody kindly suggest what might be wrong or what can be done to
> fix this? Could it be some Socket or SSL setting, encryption/cipher used, or
> something else?
>
 From the traces in your previous questions, and the answers you have 
already
given, I guess this is what happens:

1. The difference is in how long the Java code spends during the initial key
   exchange.

2. The SSL code in the proxy, (but not the one in your own server) is 
configured
   to support Ephemeral Diffie-Hellman (DHE) handshake, which is safer, but
   potentially slower.  The slowness of DHE happens only during the 
handshake,
   because the data transmission part is the same.  For example
   RSA_AES256_SHA256 and DHE_RSA_AES_SHA256 use the same transmission
   phase, but different handshakes.  The safety of DHE is that it 
protects you
   if someone "tapes" the encrypted connection and later steal the private
   key of the proxy/server.

3. The slowest part of doing a DHE exchange is choosing a (non-secret) 
prime,
  which can be used again and again for many connections.  This is only done
  by the server end of a TLS/SSL connection.  The prime (and a few related
  numbers is known as the "DH group parameters".

4. If you were to enable DHE in an OpenSSL based server/proxy, the standard
  solution is to choose the non-secret prime during server startup, 
before any
  connection arrives.  Some programs even choose it while configuring the
  server program, storing the prime in a file.

5. From the long time spent by the Java code generating its ServerHello, I
  suspect it is generating the prime during the handshake, and choosing a
  new prime for each connection, thus wasting a lot of time.

6. Maybe there is a way to tell the Java SSL library to generate the DH
  group parameters for needed key lengths (1024, 2048 or whatever you
  need) during proxy startup, so it is ready by the time the client 
connects.

7. If you upgrade to OpenSSL 1.0.1 or later (remember to only use the
  latest letter-suffix security update of whatever version), you could also
  use an ECDHE_RSA_xxx crypto mode, these don't currently allow the
  server/proxy to generate their own group parameters, but force you
  to choose from a short list of parameters generated by professional
  spying agencies such as the NSA (the "NIST curves") or someone else
  (the "X9.62 curves", the "SECG curves" and the "WTLS curves").  So
  your computers don't spend time generating the parameters, and
  you just have to trust the professionals who chose them for you.


Enjoy

Jakob
-- 
Jakob Bohm, CIO, Partner, WiseMo A/S.  http://www.wisemo.com
Transformervej 29, 2860 Søborg, Denmark.  Direct +45 31 13 16 10
This public discussion message is non-binding and may contain errors.
WiseMo - Remote Service Management for PCs, Phones and Embedded

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mta.opensslfoundation.net/pipermail/openssl-users/attachments/20141219/6fbe42c7/attachment.html>


More information about the openssl-users mailing list