Hi All, I've been banging my head against the wall for the last few days trying to get session renegotiation working in a server I'm working on, and I'm hoping someone here can give me a clue. I'm using openssl-0.9.8i.
Our server has one background thread constantly calling SSL_read() to drain incoming data. There are multiple threads generating outgoing data but all the SSL_write() calls are serialized with a semaphore. All I/O is blocking. The sockets are very long lived, so the renegotiation is used to periodically switch session keys. I've done a fair bit of web searching, and have found conflicting information on how to properly trigger a renegotiation, with different suggestions for server side vs. client side. A typical server side example is SSL_renegotiate(); SSL_do_handshake(); ssl->state = SSL_ST_ACCEPT; SSL_do_handshake(); while a typical client side example is SSL_renegotiate(); SSL_do_handshake(); Looking in O'Reilly's Network Security WIth Open SSL, it seems that as of 0.9.7 I can just do SSL_renegotiate() from either side of a connection and the underlying library will just do the right thing and I can use SSL_renegotiate_pending() to determine if/when the renegotiation has completed. The problem I'm running into is that this last approach seems to sometimes work, but periodically I get errors up from SSL_read() or SSL_write(). For example, "decryption failed or bad record mac" or "ssl handshake failure". I get the feeling I'm missing some piece of this puzzle. Can anyone help me out? Thanks, Wayne.