Hi

Please consider the attached patch that makes x509 xertificate validity
(notBeofre and notAfter) available in environement for the tls-verify
script.

I use it to monitor OpenVPN certificate expirations in Nagios. I can 
share the Nagios bits with whoever is interested.

-- 
Emmanuel Dreyfus
m...@netbsd.org
--- src/openvpn/ssl_verify.c.orig       2013-01-28 16:07:44.000000000 +0100
+++ src/openvpn/ssl_verify.c    2013-01-30 09:40:32.000000000 +0100
@@ -399,8 +399,10 @@
     )
 {
   char envname[64];
   char *serial = NULL;
+  char *notBefore = NULL;
+  char *notAfter = NULL;
   struct gc_arena gc = gc_new ();

   /* Save X509 fields in environment */
 #ifdef ENABLE_X509_TRACK
@@ -435,8 +437,19 @@
   serial = x509_get_serial(peer_cert, &gc);
   openvpn_snprintf (envname, sizeof(envname), "tls_serial_%d", cert_depth);
   setenv_str (es, envname, serial);

+  /* export Validity */
+  if ((notBefore = x509_get_validity_notBefore(peer_cert, &gc)) != NULL) {
+    openvpn_snprintf (envname, sizeof(envname), "tls_notbefore_%d", 
cert_depth);
+    setenv_str (es, envname, notBefore);
+  }
+
+  if ((notAfter = x509_get_validity_notAfter(peer_cert, &gc)) != NULL) {
+    openvpn_snprintf (envname, sizeof(envname), "tls_notafter_%d", cert_depth);
+    setenv_str (es, envname, notAfter);
+  }
+
   gc_free(&gc);
 }

 /*
--- src/openvpn/ssl_verify_backend.h.orig       2013-01-30 11:34:30.000000000 
+0100
+++ src/openvpn/ssl_verify_backend.h    2013-01-30 11:38:06.000000000 +0100
@@ -124,8 +124,36 @@
  */
 char *x509_get_serial (openvpn_x509_cert_t *cert, struct gc_arena *gc);

 /*
+ * Return the certificate's notBefore validity
+ *
+ * The notBefore validity number is returned as a string with 
+ * format YYmmddHHMMSSZ
+ *
+ * @param cert         Certificate to retrieve the notBefore validity from.
+ * @param gc           Garbage collection arena to use when allocating string.
+ *
+ * @return             The certificate's notBefore validity
+ */
+char * x509_get_validity_notBefore (openvpn_x509_cert_t *cert,
+    struct gc_arena *gc);
+
+/*
+ * Return the certificate's notAfter validity
+ *
+ * The notAfter validity number is returned as a string with 
+ * format YYmmddHHMMSSZ
+ *
+ * @param cert         Certificate to retrieve the notAfter validity from.
+ * @param gc           Garbage collection arena to use when allocating string.
+ *
+ * @return             The certificate's notAfter validity
+ */
+char * x509_get_validity_notAfter (openvpn_x509_cert_t *cert,
+    struct gc_arena *gc);
+
+/*
  * Save X509 fields to environment, using the naming convention:
  *
  * X509_{cert_depth}_{name}={value}
  *
--- src/openvpn/ssl_verify_openssl.c.orig       2013-01-28 16:07:44.000000000 
+0100
+++ src/openvpn/ssl_verify_openssl.c    2013-01-30 09:32:29.000000000 +0100
@@ -237,8 +237,32 @@

   return serial;
 }

+char *
+x509_get_validity_notBefore (openvpn_x509_cert_t *cert, struct gc_arena *gc)
+{
+  unsigned char *buf;
+
+  if ((buf = ASN1_STRING_data(X509_get_notBefore(cert))) == NULL)
+    return NULL;
+
+  return string_alloc(buf, gc);
+}
+
+
+char *
+x509_get_validity_notAfter (openvpn_x509_cert_t *cert, struct gc_arena *gc)
+{
+  unsigned char *buf;
+
+  if ((buf = ASN1_STRING_data(X509_get_notAfter(cert))) == NULL)
+    return NULL;
+
+  return string_alloc(buf, gc);
+}
+
+
 unsigned char *
 x509_get_sha1_hash (X509 *cert, struct gc_arena *gc)
 {
   char *hash = gc_malloc(SHA_DIGEST_LENGTH, false, gc);
--- src/openvpn/ssl_verify_polarssl.c.orig      2013-01-30 09:36:41.000000000 
+0100
+++ src/openvpn/ssl_verify_polarssl.c   2013-01-30 09:37:42.000000000 +0100
@@ -140,8 +140,21 @@

   return buf;
 }

+char *
+x509_get_validity_notBefore (openvpn_x509_cert_t *cert, struct gc_arena *gc)
+{
+  return NULL;
+}
+
+
+char *
+x509_get_validity_notAfter (openvpn_x509_cert_t *cert, struct gc_arena *gc)
+{
+  return NULL;
+}
+
 unsigned char *
 x509_get_sha1_hash (x509_cert *cert, struct gc_arena *gc)
 {
   unsigned char *sha1_hash = gc_malloc(SHA_DIGEST_LENGTH, false, gc);

Reply via email to