Changeset eb4ac2ff2b9e0b43b1aa254fde4f3106f8d5386c

Show
Ignore:
Timestamp:
07/10/12 17:24:51 (2 years ago)
Author:
Theo Schlossnagle <jesus@lethargy.org>
git-committer:
Theo Schlossnagle <jesus@lethargy.org> 1341941091 -0700
git-parent:

[aa2a26950f252650791db1d942c440543fdd3992], [353258a7cab6bd5c7069ab335642da33a6c67a2a]

git-author:
Theo Schlossnagle <jesus@lethargy.org> 1341941091 -0700
Message:

Merge pull request #88 from pamaddox/master

SSL Updates For TCP and IMAP Checks

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • docs/config/modules/noit.module.imap.xml

    r23dea7e r353258a  
    282282          </variablelist> 
    283283          <para>A list of ciphers to be used in the SSL protocol (for SSL checks).</para> 
     284        </listitem> 
     285      </varlistentry> 
     286    </variablelist> 
     287    <variablelist> 
     288      <varlistentry> 
     289        <term>header_Host</term> 
     290        <listitem> 
     291          <variablelist> 
     292            <varlistentry> 
     293              <term>required</term> 
     294              <listitem> 
     295                <para>optional</para> 
     296              </listitem> 
     297            </varlistentry> 
     298            <varlistentry> 
     299              <term>allowed</term> 
     300              <listitem> 
     301                <para>.+</para> 
     302              </listitem> 
     303            </varlistentry> 
     304          </variablelist> 
     305          <para>The host header to validate against the SSL certificate (for SSL checks).</para> 
    284306        </listitem> 
    285307      </varlistentry> 
  • docs/config/modules/noit.module.tcp.xml

    r51773e8 r353258a  
    226226          </variablelist> 
    227227          <para>A list of ciphers to be used in the SSL protocol (for SSL checks).</para> 
     228        </listitem> 
     229      </varlistentry> 
     230    </variablelist> 
     231    <variablelist> 
     232      <varlistentry> 
     233        <term>header_Host</term> 
     234        <listitem> 
     235          <variablelist> 
     236            <varlistentry> 
     237              <term>required</term> 
     238              <listitem> 
     239                <para>optional</para> 
     240              </listitem> 
     241            </varlistentry> 
     242            <varlistentry> 
     243              <term>allowed</term> 
     244              <listitem> 
     245                <para>.+</para> 
     246              </listitem> 
     247            </varlistentry> 
     248          </variablelist> 
     249          <para>The host header to validate against the SSL certificate (for SSL checks).</para> 
    228250        </listitem> 
    229251      </varlistentry> 
  • src/modules-lua/noit/extras.lua

    rb4aa23f r353258a  
    2929-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
    3030 
     31local ipairs = ipairs 
    3132local string = require("string") 
    3233local table = require("table") 
     
    6869end 
    6970 
     71function check_host_header_against_certificate(host_header, cert_subject, san_list) 
     72  local san_list_check = function (array, value) 
     73    for i, line in ipairs(array) do 
     74      if line == value then 
     75        return true 
     76      else 
     77        line = string.gsub(line, '%.', "%%%.") 
     78        line = string.gsub(line, "%*", "[^\.]*") 
     79        local match = string.match(value, line) 
     80        if match == value then 
     81          return true 
     82        end 
     83      end 
     84    end 
     85    return false 
     86  end 
     87  -- First, check for SAN values if they exist - if they do, check for a match 
     88  local san_array = { } 
     89  if san_list ~= nil then 
     90    san_array = split(san_list, ", ") 
     91  end 
     92  if san_list_check(san_array, host_header) then 
     93    -- The host header was in the SAN list, so we're done 
     94    return nil 
     95  end 
     96  -- Next, pull out the CN value 
     97  local cn = string.sub(cert_subject, string.find(cert_subject, 'CN=[^/\n]*')) 
     98  if cn == nil or cn == '' then 
     99    -- no common name given, give an error 
     100    return 'CN not found in certificate' 
     101  end 
     102  cn = string.sub(cn, 4) 
     103  if cn == host_header then 
     104    -- CN and host_header match exactly, so no error 
     105    return nil 
     106  end 
     107  cn = string.gsub(cn, '%.', "%%%.") 
     108  cn = string.gsub(cn, "%*", "[^\.]*") 
     109  local match = string.match(host_header, cn) 
     110  if match == host_header then 
     111    return nil 
     112  end 
     113  return 'host header does not match CN or SANs in certificate' 
     114end 
  • src/modules-lua/noit/module/http.lua

    rf800a3f r353258a  
    294294    toReturn = string.gsub(toReturn, "%./", "") 
    295295    return toReturn 
    296 end 
    297  
    298 function san_list_check(array, value) 
    299   for i, line in ipairs(array) do 
    300     if line == value then 
    301       return true 
    302     else 
    303       line = string.gsub(line, '%.', "%%%.") 
    304       line = string.gsub(line, "%*", "[^\.]*") 
    305       local match = string.match(value, line) 
    306       if match == value then 
    307         return true 
    308       end 
    309     end 
    310   end 
    311   return false 
    312 end 
    313  
    314 function check_host_header_against_certificate(host_header, cert_subject, san_list) 
    315   -- First, check for SAN values if they exist - if they do, check for a match 
    316   local san_array = { } 
    317   if san_list ~= nil then 
    318     san_array = noit.extras.split(san_list, ", ") 
    319   end 
    320   if san_list_check(san_array, host_header) then 
    321     -- The host header was in the SAN list, so we're done 
    322     return nil 
    323   end 
    324   -- Next, pull out the CN value 
    325   local cn = string.sub(cert_subject, string.find(cert_subject, 'CN=[^/\n]*')) 
    326   if cn == nil or cn == '' then 
    327     -- no common name given, give an error 
    328     return 'CN not found in certificate' 
    329   end 
    330   cn = string.sub(cn, 4) 
    331   if cn == host_header then 
    332     -- CN and host_header match exactly, so no error 
    333     return nil 
    334   end 
    335   cn = string.gsub(cn, '%.', "%%%.") 
    336   cn = string.gsub(cn, "%*", "[^\.]*") 
    337   local match = string.match(host_header, cn) 
    338   if match == host_header then 
    339     return nil 
    340   end 
    341   return 'host header does not match CN or SANs in certificate' 
    342296end 
    343297 
     
    633587    local ssl_ctx = client:ssl_ctx() 
    634588    if ssl_ctx ~= nil then 
    635       local header_match_error = check_host_header_against_certificate(host_header, ssl_ctx.subject, ssl_ctx.san_list) 
     589      local header_match_error = nil 
     590      if host_header ~= '' then 
     591        header_match_error = noit.extras.check_host_header_against_certificate(host_header, ssl_ctx.subject, ssl_ctx.san_list) 
     592      end 
    636593      if ssl_ctx.error ~= nil then status = status .. ',sslerror' end 
    637594      if header_match_error == nil then 
  • src/modules-lua/noit/module/imap.lua

    r4fae03b r353258a  
    6868               required="optional" 
    6969               allowed=".+">A list of ciphers to be used in the SSL protocol (for SSL checks).</parameter> 
     70    <parameter name="header_Host" 
     71               required="optional" 
     72               allowed=".+">The host header to validate against the SSL certificate (for SSL checks).</parameter> 
    7073  </checkconfig> 
    7174  <examples> 
     
    163166  local _tok = 0 
    164167  local last_msg = 0 
     168  local host_header = check.config.header_Host or '' 
    165169 
    166170  if check.target_ip == nil then 
     
    191195  end 
    192196 
     197  local ca_chain =  
     198     noit.conf_get_string("/noit/eventer/config/default_ca_chain") 
     199 
     200  if check.config.ca_chain ~= nil and check.config.ca_chain ~= '' then 
     201    ca_chain = check.config.ca_chain 
     202  end 
     203 
    193204  if use_ssl == true then 
    194205    rv, err = e:ssl_upgrade_socket(check.config.certificate_file, 
    195206                                        check.config.key_file, 
    196                                         check.config.ca_chain, 
     207                                        ca_chain, 
    197208                                        check.config.ciphers) 
    198209  end  
     
    212223  local ssl_ctx = e:ssl_ctx() 
    213224  if ssl_ctx ~= nil then 
     225    local header_match_error = nil 
     226    if host_header ~= '' then 
     227      header_match_error = noit.extras.check_host_header_against_certificate(host_header, ssl_ctx.subject, ssl_ctx.san_list) 
     228    end 
    214229    if ssl_ctx.error ~= nil then status = status .. ',sslerror' end 
    215     check.metric_string("cert_error", ssl_ctx.error) 
     230    if header_match_error == nil then 
     231      check.metric_string("cert_error", ssl_ctx.error) 
     232    elseif ssl_ctx.error == nil then 
     233      check.metric_string("cert_error", header_match_error) 
     234    else 
     235      check.metric_string("cert_error", ssl_ctx.error .. ', ' .. header_match_error) 
     236    end 
    216237    check.metric_string("cert_issuer", ssl_ctx.issuer) 
    217238    check.metric_string("cert_subject", ssl_ctx.subject) 
     239    if ssl_ctx.san_list ~= nil then 
     240      check.metric_string("cert_subject_alternative_names", ssl_ctx.san_list) 
     241    end 
    218242    check.metric_uint32("cert_start", ssl_ctx.start_time) 
    219243    check.metric_uint32("cert_end", ssl_ctx.end_time) 
  • src/modules-lua/noit/module/tcp.lua

    r91e019b r353258a  
    6464               required="optional" 
    6565               allowed=".+">A list of ciphers to be used in the SSL protocol (for SSL checks).</parameter> 
     66    <parameter name="header_Host" 
     67               required="optional" 
     68               allowed=".+">The host header to validate against the SSL certificate (for SSL checks).</parameter> 
    6669  </checkconfig> 
    6770  <examples> 
     
    128131  local status = "" 
    129132  local use_ssl = false 
     133  local host_header = check.config.header_Host or '' 
    130134 
    131135  if check.config.port == nil then 
     
    147151  end 
    148152 
     153  local ca_chain =  
     154     noit.conf_get_string("/noit/eventer/config/default_ca_chain") 
     155 
     156  if check.config.ca_chain ~= nil and check.config.ca_chain ~= '' then 
     157    ca_chain = check.config.ca_chain 
     158  end 
     159 
    149160  if use_ssl == true then 
    150161    rv, err = e:ssl_upgrade_socket(check.config.certificate_file, 
    151162                                        check.config.key_file, 
    152                                         check.config.ca_chain, 
     163                                        ca_chain, 
    153164                                        check.config.ciphers) 
    154165  end  
     
    168179  local ssl_ctx = e:ssl_ctx() 
    169180  if ssl_ctx ~= nil then 
     181    local header_match_error = nil 
     182    if host_header ~= '' then 
     183      header_match_error = noit.extras.check_host_header_against_certificate(host_header, ssl_ctx.subject, ssl_ctx.san_list) 
     184    end 
    170185    if ssl_ctx.error ~= nil then status = status .. ',sslerror' end 
    171     check.metric_string("cert_error", ssl_ctx.error) 
     186    if header_match_error == nil then 
     187      check.metric_string("cert_error", ssl_ctx.error) 
     188    elseif ssl_ctx.error == nil then 
     189      check.metric_string("cert_error", header_match_error) 
     190    else 
     191      check.metric_string("cert_error", ssl_ctx.error .. ', ' .. header_match_error) 
     192    end 
    172193    check.metric_string("cert_issuer", ssl_ctx.issuer) 
    173194    check.metric_string("cert_subject", ssl_ctx.subject) 
     195    if ssl_ctx.san_list ~= nil then 
     196      check.metric_string("cert_subject_alternative_names", ssl_ctx.san_list) 
     197    end 
    174198    check.metric_uint32("cert_start", ssl_ctx.start_time) 
    175199    check.metric_uint32("cert_end", ssl_ctx.end_time)