Hi,
i am using Tomcat based on APR/OpenSSL and have observed that shutdown behavior
in bad case is not clean. For example if OpenSSL verify callback verify the
peer certificate(s) and verification is failed e.g. unknown_certificate,
revoked etc. OpenSSL sets a handshake error with an alert message
"unknown_certificate etc.". But this alert is not sent to the peer. I traced
with wireshark. The following method in OpenSSLEngine.unwrap is invoked and
throws the SSLException.
private int pendingReadableBytesInSSL() throws SSLException {
// NOTE: Calling a fake read is necessary before calling
pendingReadableBytesInSSL because // SSL_pending will return 0 if
OpenSSL has not started the current TLS record // See
https://www.openssl.org/docs/manmaster/ssl/SSL_pending.html int
lastPrimingReadResult = SSL.readFromSSL(ssl, EMPTY_ADDR, 0); // priming read
// check if SSL_read returned <= 0. In this case we need to check the error
and see if it was something // fatal. if (lastPrimingReadResult
<= 0) { // Check for OpenSSL errors caused by the priming read
long error = SSL.getLastErrorNumber(); if (error !=
SSL.SSL_ERROR_NONE) { String err = SSL.getErrorString(error);
if (logger.isDebugEnabled()) {
logger.debug(sm.getString("engine.readFromSSLFailed", Long.toString(error),
Integer.toString(lastPrimingReadResult), err));
} // There was an internal error -- shutdown
shutdown(); throw new SSLException(err); } }
return SSL.pendingReadableBytesInSSL(ssl); }
The exception is thrown because OpenSSL has already set an error for
verification failed. But there is still data (alert data with first byte 21) in
BIO that has not been transferred.
For my application a clean shutdown is a critical requirement. Is there
anything already in discussion about this issue or should i report as a bug?
Kind Regards,
Rashid Mahmood