Print errors for more frequent certificate failures

Hrvoje Niksic <[email protected]> Thu, 07 Jul 2005 17:31:22 +0200
Newsgroups gmane.comp.web.wget.patches
Message-ID <[email protected]>
This enables printing of (hopefully) more readable error messages for
more frequent certificate problems.

2005-07-07  Hrvoje Niksic  <[email protected]>

	* openssl.c (ssl_check_certificate): Print custom error messages
	for frequent X509 certificate problems.

Index: src/openssl.c
===================================================================
--- src/openssl.c	(revision 2008)
+++ src/openssl.c	(working copy)
@@ -509,19 +509,34 @@
   vresult = SSL_get_verify_result (conn);
   if (vresult != X509_V_OK)
     {
-      /* #### We might want to print saner (and translatable) error
-	 messages for several frequently encountered errors.  The
-	 candidates would include
-	 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY,
-	 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN,
-	 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT,
-	 X509_V_ERR_CERT_NOT_YET_VALID, X509_V_ERR_CERT_HAS_EXPIRED,
-	 and possibly others.  The current approach would still be
-	 used for the less frequent failure cases.  */
+      char *issuer = X509_NAME_oneline (X509_get_issuer_name (cert), 0, 0);
       logprintf (LOG_NOTQUIET,
-		 _("%s: Certificate verification error for %s: %s\n"),
-		 severity, escnonprint (host),
-		 X509_verify_cert_error_string (vresult));
+		 _("%s: cannot verify %s's certificate, issued by `%s':\n"),
+		 severity, escnonprint (host), escnonprint (issuer));
+      /* Try to print more user-friendly (and translated) messages for
+	 the frequent verification errors.  */
+      switch (vresult)
+	{
+	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
+	  logprintf (LOG_NOTQUIET,
+		     _("  Unable to locally verify the issuer's authority.\n"));
+	  break;
+	case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
+	case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
+	  logprintf (LOG_NOTQUIET, _("  Self-signed certificate encountered.\n"));
+	  break;
+	case X509_V_ERR_CERT_NOT_YET_VALID:
+	  logprintf (LOG_NOTQUIET, _("  Issued certificate not yet valid.\n"));
+	  break;
+	case X509_V_ERR_CERT_HAS_EXPIRED:
+	  logprintf (LOG_NOTQUIET, _("  Issued certificate has expired.\n"));
+	  break;
+	default:
+	  /* For the less frequent error strings, simply provide the
+	     OpenSSL error message.  */
+	  logprintf (LOG_NOTQUIET, "  %s\n",
+		     X509_verify_cert_error_string (vresult));
+	}
       success = false;
       /* Fall through, so that the user is warned about *all* issues
 	 with the cert (important with --no-check-certificate.)  */