[sr-dev] git:master:043ce0e7: stirshaken: Properly handle intermediary/chain certificates when caching certificates

Henning Westerholt hw at gilawa.com
Mon Dec 12 07:48:44 CET 2022


Module: kamailio
Branch: master
Commit: 043ce0e75eae04f356cd539f2146df6846a169e2
URL: https://github.com/kamailio/kamailio/commit/043ce0e75eae04f356cd539f2146df6846a169e2

Author: Trevor Peirce <trev at acrovoice.ca>
Committer: Henning Westerholt <hw at gilawa.com>
Date: 2022-12-12T07:48:38+01:00

stirshaken: Properly handle intermediary/chain certificates when caching certificates

- requires patch to libstirshaken (PR 124) to do anything
- if patched version of libstirshaken detected, uses new methods to store all intermediary certs
- unrelated minor logging tweaks

---

Modified: src/modules/stirshaken/stirshaken_mod.c

---

Diff:  https://github.com/kamailio/kamailio/commit/043ce0e75eae04f356cd539f2146df6846a169e2.diff
Patch: https://github.com/kamailio/kamailio/commit/043ce0e75eae04f356cd539f2146df6846a169e2.patch

---

diff --git a/src/modules/stirshaken/stirshaken_mod.c b/src/modules/stirshaken/stirshaken_mod.c
index 6f2ec8fa03e..b64396b0ab7 100644
--- a/src/modules/stirshaken/stirshaken_mod.c
+++ b/src/modules/stirshaken/stirshaken_mod.c
@@ -207,18 +207,21 @@ static stir_shaken_status_t shaken_callback(stir_shaken_callback_arg_t *arg)
 
 					diff = now_s - attr.st_mtime;
 
-					LM_DBG("Checking cached certificate against expiration setting of %zus (now is: %zu, file modification timestamp is: %zu, difference is: %zu)\n",
+					LM_DBG("Checking cached certificate against expiration setting of %zus (now is: %lu, file modification timestamp is: %lu, difference is: %lu)\n",
 						stirshaken_vs_cache_expire_s, now_s, attr.st_mtime, diff);
 
 					if (diff > stirshaken_vs_cache_expire_s) {
-						LM_WARN("Cached certificate %s is behind expiration threshold (%zu > %zu). Need to download new certificate...\n", cert_full_path, diff, stirshaken_vs_cache_expire_s);
+						LM_NOTICE("Cached certificate %s is behind expiration threshold (%lu > %zu). Need to download new certificate...\n", cert_full_path, diff, stirshaken_vs_cache_expire_s);
 						goto exit;
 					} else {
-						LM_WARN("Cached certificate %s is valid for next %zus\n", cert_full_path, stirshaken_vs_cache_expire_s - diff);
+						LM_NOTICE("Cached certificate %s is valid for next %lus\n", cert_full_path, stirshaken_vs_cache_expire_s - diff);
 					}
 				}
-
+#ifdef STIR_SHAKEN_CAN_RW_X509_FULLCHAIN
+				if (STIR_SHAKEN_STATUS_OK != stir_shaken_load_x509_from_file_fullchain(&ss, &cache_copy, cert_full_path)) {
+#else
 				if (!(cache_copy.x = stir_shaken_load_x509_from_file(&ss, cert_full_path))) {
+#endif
 					LM_ERR("Cannot load X509 from file %s\n", cert_full_path);
 					goto exit;
 				}
@@ -443,10 +446,14 @@ static int stirshaken_handle_cache(stir_shaken_context_t *ss, stir_shaken_passpo
 			}
 		}
 
-		LM_DBG("Saving fresh certificate %s in cache (with name: %s)...\n", x5u, cert_full_path);
-
+#ifdef STIR_SHAKEN_CAN_RW_X509_FULLCHAIN
+		LM_DBG("Saving fresh certificate+chain %s to cache as %s\n", x5u, cert_full_path);
+		if (STIR_SHAKEN_STATUS_OK != stir_shaken_x509_to_disk_fullchain(ss, cert->x, cert->xchain, cert_full_path)) {
+#else
+		LM_DBG("Saving fresh certificate %s to cache as %s\n", x5u, cert_full_path);
 		if (STIR_SHAKEN_STATUS_OK != stir_shaken_x509_to_disk(ss, cert->x, cert_full_path)) {
-			LM_ERR("Failed to write cert %s to disk (as: %s)", x5u, cert_full_path);
+#endif
+			LM_ERR("Failed to cache certificate %s to disk", x5u);
 		}
 
 	} else {
@@ -485,7 +492,8 @@ static int ki_stirshaken_check_identity(sip_msg_t *msg)
 	ibody = hf->body;
 
 	if (STIR_SHAKEN_STATUS_OK != stir_shaken_vs_sih_verify(&ss, vs, ibody.s, &cert_out, &passport_out)) {
-		LM_ERR("SIP Identity Header did not pass verification\n");
+		LM_ERR("SIP Identity Header did not pass verification: %s", stir_shaken_get_error(&ss, NULL));
+
 		stirshaken_print_error_details(&ss);
 		goto fail;
 	}




More information about the sr-dev mailing list