I'm building a custom SSL app and want to use session reuse for the
obvious reasons. I've hacked up cli.c (attached below) to more easily
learn openssl etc. The program connects to a server running apache and
the most recent mod_ssl. The interesting thing is that the session isn't
always reused. When the expiry log entry is made, the server gets a cache
miss even though the session id is correct. My sample size is obviously
small, but the behavior is concerning. When I run s_time, the sessions
are mostly reused (240/255) with only a few misses.
I've attached the session cache entries from using cli.c. The entries I
deleted were all normal, i.e. the SSL protocol looked fine.
Any ideas on this odd behavior? Am I missing something in cli.c?
Thanks, Bill
[16/Aug/1999 15:49:10] [info] Init: Created hash-table (250 buckets) in shared memory
(512000 bytes) for SSL session cache
[16/Aug/1999 15:49:10] [trace] Inter-Process Session Cache (SHM) Expiry: old: 0, new:
0, removed: 0
[16/Aug/1999 15:49:31] [trace] Inter-Process Session Cache: request=SET status=OK
id=8214945D194564BC5101B8B012BDC0751FC639C27FE686C2518AF12E15002848 timeout=300s
(session caching)
[16/Aug/1999 15:49:31] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=8214945D194564BC5101B8B012BDC0751FC639C27FE686C2518AF12E15002848 (session reuse)
[16/Aug/1999 15:49:35] [trace] Inter-Process Session Cache: request=SET status=OK
id=4032AC17060B837D42FC3ED537EBC5498096CA45BE6F3615E9AC4132AF071FD2 timeout=299s
(session caching)
[16/Aug/1999 15:49:35] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=4032AC17060B837D42FC3ED537EBC5498096CA45BE6F3615E9AC4132AF071FD2 (session reuse)
[16/Aug/1999 15:50:20] [trace] Inter-Process Session Cache: request=SET status=OK
id=5FA040F98CE97E5E88B524CD7F91CCBD610E1D21720EDB0F0EB905F26621ADB5 timeout=300s
(session caching)
[16/Aug/1999 15:50:20] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=5FA040F98CE97E5E88B524CD7F91CCBD610E1D21720EDB0F0EB905F26621ADB5 (session reuse)
[16/Aug/1999 15:52:06] [trace] Inter-Process Session Cache: request=SET status=OK
id=357587AD769B6E0A5D0FE5BAD590F2E36E80ECB3A5A67C985B3AA2C77BF5B1D3 timeout=300s
(session caching)
[16/Aug/1999 15:52:06] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=357587AD769B6E0A5D0FE5BAD590F2E36E80ECB3A5A67C985B3AA2C77BF5B1D3 (session reuse)
[16/Aug/1999 15:52:09] [trace] Inter-Process Session Cache: request=SET status=OK
id=2C7D6FFA46CC9F57F5E93C59AF2004308C31587F9D0582181957113018D6EF14 timeout=300s
(session caching)
[16/Aug/1999 15:52:09] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=2C7D6FFA46CC9F57F5E93C59AF2004308C31587F9D0582181957113018D6EF14 (session reuse)
[16/Aug/1999 16:02:55] [trace] Inter-Process Session Cache (SHM) Expiry: old: 5, new:
4, removed: 1
[16/Aug/1999 16:02:55] [trace] Inter-Process Session Cache: request=SET status=OK
id=BFA93C41699520A907B4C604A1A2AABE93220FE28D2ED1B6FB75428877645C8C timeout=299s
(session caching)
[16/Aug/1999 16:02:55] [trace] Inter-Process Session Cache (SHM) Expiry: old: 5, new:
5, removed: 0
[16/Aug/1999 16:02:55] [trace] Inter-Process Session Cache: request=GET status=MISSED
id=BFA93C41699520A907B4C604A1A2AABE93220FE28D2ED1B6FB75428877645C8C (session renewal)
[16/Aug/1999 16:02:55] [trace] Inter-Process Session Cache: request=SET status=OK
id=3DFEB1F293010D97D93A02E39433133CAE4872510C5DDC361408C756C00095DD timeout=300s
(session caching)
[16/Aug/1999 16:03:19] [trace] Inter-Process Session Cache (SHM) Expiry: old: 7, new:
5, removed: 2
[16/Aug/1999 16:03:19] [trace] Inter-Process Session Cache: request=SET status=OK
id=CFB37682C2CCA86551360F0E01CA83ABC4655A09690026281CB0E24A5C99946A timeout=300s
(session caching)
[16/Aug/1999 16:03:19] [trace] Inter-Process Session Cache (SHM) Expiry: old: 5, new:
5, removed: 0
[16/Aug/1999 16:03:19] [trace] Inter-Process Session Cache: request=GET status=MISSED
id=CFB37682C2CCA86551360F0E01CA83ABC4655A09690026281CB0E24A5C99946A (session renewal)
[16/Aug/1999 16:03:19] [trace] Inter-Process Session Cache: request=SET status=OK
id=CF9AD819FA474ECEF09FA1CE74F0112781188BB042AFB2DF626EC5953F0CE30C timeout=300s
(session caching)
[16/Aug/1999 16:03:20] [trace] Inter-Process Session Cache (SHM) Expiry: old: 7, new:
5, removed: 2
[16/Aug/1999 16:03:20] [trace] Inter-Process Session Cache: request=SET status=OK
id=B4C9319C1F50A00A2E92F296AF75393C247F3A037A47CC1E6BC6A42434B3C790 timeout=300s
(session caching)
[16/Aug/1999 16:03:20] [trace] Inter-Process Session Cache: request=GET status=MISSED
id=B4C9319C1F50A00A2E92F296AF75393C247F3A037A47CC1E6BC6A42434B3C790 (session renewal)
[16/Aug/1999 16:03:21] [trace] Inter-Process Session Cache: request=SET status=OK
id=D5190B883D65214EE31777E78DD0A7DC9850543EF183D5A9EC97956112155095 timeout=299s
(session caching)
[16/Aug/1999 16:03:21] [trace] Inter-Process Session Cache: request=SET status=OK
id=9E2563D5F89B073CA9C5E266975451DF131BE3AAB6CBED908A55B23D5A110389 timeout=300s
(session caching)
[16/Aug/1999 16:03:22] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=9E2563D5F89B073CA9C5E266975451DF131BE3AAB6CBED908A55B23D5A110389 (session reuse)
[16/Aug/1999 16:03:28] [trace] Inter-Process Session Cache (SHM) Expiry: old: 7, new:
4, removed: 3
[16/Aug/1999 16:03:28] [trace] Inter-Process Session Cache: request=SET status=OK
id=7806EE0F98F6F50561069D068277BB3B656A310C85460304D4FB70E0ACC95F74 timeout=300s
(session caching)
[16/Aug/1999 16:03:28] [trace] Inter-Process Session Cache: request=GET status=MISSED
id=7806EE0F98F6F50561069D068277BB3B656A310C85460304D4FB70E0ACC95F74 (session renewal)
[16/Aug/1999 16:03:28] [trace] Inter-Process Session Cache: request=SET status=OK
id=005FB8CD40F44620CC63E9E2827E47F4266698A1B02B18057E58D9343ABE5674 timeout=300s
(session caching)
[16/Aug/1999 16:03:29] [trace] Inter-Process Session Cache: request=SET status=OK
id=6E2F3EE646D9E1AFACF969E7578776347FD315F5C51B6A5BAB8981BAC9A6AD9E timeout=300s
(session caching)
[16/Aug/1999 16:03:29] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=6E2F3EE646D9E1AFACF969E7578776347FD315F5C51B6A5BAB8981BAC9A6AD9E (session reuse)
[16/Aug/1999 16:03:31] [trace] Inter-Process Session Cache: request=SET status=OK
id=5CA4745F69C826850B07AD0FE8BCF42085728F56E0A38910A71ADB497B64D6B0 timeout=299s
(session caching)
[16/Aug/1999 16:03:31] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=5CA4745F69C826850B07AD0FE8BCF42085728F56E0A38910A71ADB497B64D6B0 (session reuse)
[16/Aug/1999 16:03:32] [trace] Inter-Process Session Cache: request=SET status=OK
id=04B8F752BBF88F682B56854A9EF02621E878CB0A4C23216741376A16D3114308 timeout=300s
(session caching)
[16/Aug/1999 16:03:32] [trace] Inter-Process Session Cache: request=GET status=FOUND
id=04B8F752BBF88F682B56854A9EF02621E878CB0A4C23216741376A16D3114308 (session reuse)
[16/Aug/1999 16:32:12] [trace] Inter-Process Session Cache (SHM) Expiry: old: 9, new:
8, removed: 1
[16/Aug/1999 16:32:12] [trace] Inter-Process Session Cache: request=SET status=OK
id=81E2780BFB1207ECA4BC4DEFB66751FF8112B15FEB19AE12C50984D88C7FA615 timeout=300s
(session caching)
[16/Aug/1999 16:32:12] [trace] Inter-Process Session Cache (SHM) Expiry: old: 9, new:
9, removed: 0
[16/Aug/1999 16:32:12] [trace] Inter-Process Session Cache: request=GET status=MISSED
id=81E2780BFB1207ECA4BC4DEFB66751FF8112B15FEB19AE12C50984D88C7FA615 (session renewal)
[16/Aug/1999 16:32:12] [trace] Inter-Process Session Cache: request=SET status=OK
id=9E2F338B4390EFF01CAD7AEEDF4034C258C27FBF7E856D1C561954F21BDB7387 timeout=300s
(session caching)
//cli.c
/* cli.cpp - Minimal ssleay client for Unix
30.9.1996, Sampo Kellomaki <[EMAIL PROTECTED]> */
/* mangled to work with SSLeay-0.9.0b and OpenSSL 0.9.2b
Simplified to be even more minimal
12/98 - 4/99 Wade Scholine <[EMAIL PROTECTED]> */
#include <stdio.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <openssl/rsa.h> /* SSLeay stuff */
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/e_os.h>
#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); \
printf("CHK_SSL... exiting...\n"); exit(2); }
static int session_id_context = 1; /* anything will do */
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
{
char buf[256];
X509 *err_cert;
int err,depth;
int verify_depth = 1;
int verify_error;
err_cert = X509_STORE_CTX_get_current_cert(ctx);
err = X509_STORE_CTX_get_error(ctx);
depth = X509_STORE_CTX_get_error_depth(ctx);
X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
printf("depth=%d %s\n",depth,buf);
if (!ok) {
printf("ERROR:num=%d:%s\n",err,X509_verify_cert_error_string(err));
}
switch (ctx->error) {
case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert),buf,256);
printf("issuer= %s\n",buf);
break;
case X509_V_ERR_CERT_NOT_YET_VALID:
case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
printf("notBefore=");
/* ASN1_TIME_print(bio_err,X509_get_notBefore(ctx->current_cert));*/
printf("\n");
break;
case X509_V_ERR_CERT_HAS_EXPIRED:
case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
printf("notAfter=");
/* ASN1_TIME_print(bio_err,X509_get_notAfter(ctx->current_cert)); */
printf("\n");
break;
}
if (ok==1)
printf("Certificate is OK\n");
else
printf("Certificate DOES NOT VERIFY\n");
return(ok);
}
int main ()
{
int err;
int sd;
struct sockaddr_in sa;
SSL_CTX* ctx;
SSL* ssl;
//SSL* ssl2;
X509* server_cert;
char* str;
char buf [4096];
SSL_METHOD *meth;
BIO *conn;
SSLeay_add_ssl_algorithms();
meth = SSLv3_client_method();
SSL_load_error_strings();
ctx = SSL_CTX_new (meth); CHK_NULL(ctx);
SSL_CTX_load_verify_locations(ctx,"snakeoil-ca-rsa.crt",(char *)NULL);
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,verify_callback);
SSL_CTX_set_quiet_shutdown(ctx,1);
// Do it with a BIO
conn = BIO_new(BIO_s_connect());
if (conn == NULL)
return -1;
BIO_set_conn_port(conn, "443");
BIO_set_conn_hostname(conn, "www");
/* ----------------------------------------------- */
/* Now we have TCP conncetion. Start SSL negotiation. */
ssl = SSL_new (ctx); CHK_NULL(ssl);
SSL_set_bio(ssl, conn, conn); // BIO way
err = SSL_connect (ssl); CHK_SSL(err);
/* Get the cipher - opt */
printf ("SSL connection using %s\n", SSL_get_cipher (ssl));
/* Get server's certificate (note: beware of dynamic allocation) - opt */
server_cert = SSL_get_peer_certificate (ssl); CHK_NULL(server_cert);
printf ("Server certificate:\n");
str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
CHK_NULL(str);
printf ("\t subject: %s\n", str);
Free (str);
str = X509_NAME_oneline (X509_get_issuer_name (server_cert),0,0);
CHK_NULL(str);
printf ("\t issuer: %s\n", str);
Free (str);
/* We could do all sorts of certificate verification stuff here before
deallocating the certificate. */
X509_free (server_cert);
/* --------------------------------------------------- */
/* DATA EXCHANGE - Send a message and receive a reply. */
sprintf(buf, "GET / HTTP/1.0\r\n\r\n");
err = SSL_write (ssl, buf, strlen(buf)); CHK_SSL(err);
err = SSL_read (ssl, buf, sizeof(buf) - 1); CHK_SSL(err);
buf[err] = '\0';
printf ("Got %d chars:'%s'\n", err, buf);
// Shutdown
SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
shutdown(SSL_get_fd(ssl), 2); close(SSL_get_fd(ssl));
// SECOND CONNECTION //////////////////////////////////////////////
// Do it with a BIO
conn = BIO_new(BIO_s_connect());
if (conn == NULL)
return -1;
BIO_set_conn_port(conn, "443");
BIO_set_conn_hostname(conn, "www");
SSL_set_connect_state(ssl);
SSL_set_bio(ssl, conn, conn);
SSL_connect(ssl);
/* --------------------------------------------------- */
/* DATA EXCHANGE - Send a message and receive a reply. */
printf("***Session reused: %d\n", SSL_session_reused(ssl));
memset(buf, 0, sizeof(buf));
sprintf(buf, "GET /manual/LICENSE HTTP/1.0\r\n\r\n");
err = SSL_write (ssl, buf, strlen(buf));
CHK_SSL(err);
err = SSL_read (ssl, buf, sizeof(buf) - 1); CHK_SSL(err);
buf[err] = '\0';
printf ("Got %d chars:'%s'\n", err, buf);
// Shutdown
SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
shutdown (SSL_get_fd(ssl), 2); close(SSL_get_fd(ssl));
printf("***Session reused: %d\n", SSL_session_reused(ssl));
/* Clean up. */
close (sd);
SSL_free (ssl);
SSL_CTX_free (ctx);
}
/* EOF - cli.c */
______________________________________________________________________
Apache Interface to OpenSSL (mod_ssl) www.modssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]