Full_Name: Paolo Di Martino
Version: 2.4.6
OS: Linux RedHat 6.0
Submission from: (NULL) (193.207.124.39)
When I access to some location with
SSLClientVerify require
directive, the browser continue to ask me a certificate for every
object loaded from the location (html frames, images.....).
The log file [trace] said:
"Changed client verification type will force full renegotiation"
But this was changed only for the first access request.
I mean, if the directory is the same, next access requests have the
same verification type.
Take a look at the source code:
In pkg.sslmod/ssl_engine_kernel.c function ssl_hook_Access,
in the per-directory stuff there is a check between nVerify
and nVerifyOld to test if the directory configuration is
changed in order to decide if it is the case to force a (full-quick)
renegotiation or not.
When a new connections is established (within the same session)
a default value for the ssl->verify_mode is set and
the nVerifyOld tecnic is gone because there is no way to retrieve
the real old verification mode.
To solve the problem I've added a real_verify_mode field in the
SSL_SESSION structure and patched my source code with a function
that update the session cache entry with the changed value of
real_verify_mode.
My first think is to take care of it inside the SSL_Session_cache.
But to do this I changed some OpenSSL source files too.
Maybe I should talk with them too?
Is this a bug or it's my missunderstanding?
Patch follows
Index: ssl_engine_kernel.c
file: mod_ssl-2.4.6-1.3.9/pkg.sslmod/ssl_engine_kernel.c
Version mod_ssl: 2.4.6
@@ -823,6 +823,6 @@
if (dc->nVerifyClient != SSL_CVERIFY_UNSET) {
/* remember old state */
- nVerifyOld = SSL_get_verify_mode(ssl);
+ nVerifyOld = ssl->session->real_verify_mode;
/* configure new state */
nVerify = SSL_VERIFY_NONE;
@@ -1075,3 +1075,7 @@
#endif
+ if(dc->nVerifyClient!=SSL_CVERIFY_UNSET){
+ ssl->session->real_verify_mode=nVerify;
+ ssl_UpdateSessionCacheEntry(ssl,ssl->session);
+ }
return rc;
}
@@ -1682,2 +1682,2
ssl_scache_id2sz(pNew->session_id, pNew->session_id_length),
- t-time(NULL));
+ t-time(NULL),pNew->real_verify_mode);
@@ -1691,1 +1691,42
+int ssl_UpdateSessionCacheEntry(SSL *ssl, SSL_SESSION *pNew)
+{
+ conn_rec *conn;
+ server_rec *s;
+ SSLSrvConfigRec *sc;
+ long t;
+ BOOL rc;
+
+ /*
+ * Get Apache context back through OpenSSL context
+ */
+ conn = (conn_rec *)SSL_get_app_data(ssl);
+ s = conn->server;
+ sc = mySrvConfig(s);
+
+ ssl_scache_remove(s,pNew);
+
+ /*
+ * Store the SSL_SESSION in the inter-process cache with the
+ * same expire time, so it expires automatically there, too.
+ */
+ t = (SSL_get_time(pNew) + sc->nSessionCacheTimeout);
+ rc = ssl_scache_store(s, pNew, t);
+
+ /*
+ * Log this cache operation
+ */
+ ssl_log(s, SSL_LOG_TRACE, "Inter-Process Session Cache: "
+ "request=SET status=%s id=%s timeout=%ds (session caching)
verify=%d
+",
+ rc == TRUE ? "OK" : "BAD",
+ ssl_scache_id2sz(pNew->session_id, pNew->session_id_length),
+ t-time(NULL),pNew->real_verify_mode);
+
+ /*
+ * return 0 which means to OpenSSL that the pNew is still
+ * valid and was not freed by us with SSL_SESSION_free().
+ */
+ return 0;
+}
+
______________________________________________________________________
Apache Interface to OpenSSL (mod_ssl) www.modssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]