diff mod_s2s_auth_dane/mod_s2s_auth_dane.lua @ 1262:1e84eebf3f46

mod_s2s_auth_dane: Invalidate trust if there are TLSA records but no matches, or bogus results
author Kim Alvefur <zash@zash.se>
date Fri, 03 Jan 2014 15:14:26 +0100
parents 6a37bd22c8df
children 020165014e56
line wrap: on
line diff
--- a/mod_s2s_auth_dane/mod_s2s_auth_dane.lua	Fri Jan 03 15:00:05 2014 +0100
+++ b/mod_s2s_auth_dane/mod_s2s_auth_dane.lua	Fri Jan 03 15:14:26 2014 +0100
@@ -31,7 +31,7 @@
 	local srv_choice = host_session.srv_choice;
 	if srv_hosts and srv_hosts.answer.secure and not srv_hosts[srv_choice].dane then
 		dns_lookup(function(answer)
-			if answer and #answer > 0 then
+			if answer and ( #answer > 0 or answer.bogus ) then
 				srv_hosts[srv_choice].dane = answer;
 				for i, tlsa in ipairs(answer) do
 					module:log("debug", "TLSA %s", tostring(tlsa));
@@ -48,7 +48,7 @@
 	local srv_choice = session.srv_choice;
 	local choosen = srv_hosts and srv_hosts[srv_choice];
 	if choosen and choosen.dane then
-		local use, select, match, tlsa, certdata
+		local use, select, match, tlsa, certdata, match_found
 		for i, rr in ipairs(choosen.dane) do
 			tlsa = rr.tlsa
 			module:log("debug", "TLSA %s", tostring(tlsa));
@@ -80,6 +80,7 @@
 						session.cert_chain_status = "valid"
 						-- for usage 1 the chain has to be valid already
 					end
+					match_found = true
 					break;
 				end
 			else
@@ -87,9 +88,12 @@
 				-- TODO Ca checks needs to loop over the chain and stuff
 			end
 		end
+		if not match_found then
+			(session.log or module._log)("info", "DANE validation successful");
+			session.cert_identity_status = "invalid";
+			session.cert_chain_status = "invalid";
+		end
 	end
-
-	-- TODO Optionally, if no TLSA record matches, mark connection as untrusted.
 end);
 
 function module.unload()