|
|
@@ -2,6 +2,7 @@ require 'erb' |
|
|
|
require 'logging' |
|
|
|
require 'parallel' |
|
|
|
require 'thread' |
|
|
|
require 'yaml' |
|
|
|
|
|
|
|
module SSLCheck |
|
|
|
module SSLLabs |
|
|
@@ -10,10 +11,12 @@ module SSLCheck |
|
|
|
autoload :Server, 'sslcheck/server' |
|
|
|
autoload :Grade, 'sslcheck/grade' |
|
|
|
|
|
|
|
PARALLEL_ANALYSIS = 20 |
|
|
|
SYN_TIMEOUT = 600 |
|
|
|
@@log = Logging.logger[SSLCheck] |
|
|
|
|
|
|
|
def self.grade(hostname, port=443) |
|
|
|
timeout 600 do |
|
|
|
timeout SYN_TIMEOUT do |
|
|
|
Grade.new Server.new hostname, port |
|
|
|
end |
|
|
|
rescue Exception => e |
|
|
@@ -21,10 +24,11 @@ module SSLCheck |
|
|
|
NoSslTlsGrade.new NoSslTlsServer.new hostname, port |
|
|
|
end |
|
|
|
|
|
|
|
def self.analyze(hosts, output) |
|
|
|
def self.analyze(hosts, output, groups = nil) |
|
|
|
results = {} |
|
|
|
semaphore = Mutex.new |
|
|
|
Parallel.each hosts, progress: 'Testing', in_threads: 10 do |description, host| |
|
|
|
Parallel.each hosts, progress: 'Analysing', in_threads: PARALLEL_ANALYSIS, |
|
|
|
finish: lambda { |item, _, _| puts item[1] } do |description, host| |
|
|
|
result = SSLCheck.grade host.strip |
|
|
|
semaphore.synchronize do |
|
|
|
if results.include? description |
|
|
@@ -35,6 +39,8 @@ module SSLCheck |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
results = Hash[groups.collect { |g| [g, results[g]] }] if groups |
|
|
|
|
|
|
|
results.each do |d, _| |
|
|
|
results[d].sort! do |a, b| |
|
|
|
cmp = score(a) <=> score(b) |
|
|
@@ -48,7 +54,19 @@ module SSLCheck |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
File.write "output/#{output}.html", ERB.new(File.read('output/sslcheck.erb')).result(binding) |
|
|
|
File.write output, ERB.new(File.read('output/sslcheck.erb')).result(binding) |
|
|
|
end |
|
|
|
|
|
|
|
def self.analyze_from_file(file, output) |
|
|
|
config = YAML.load_file file |
|
|
|
hosts = [] |
|
|
|
groups = [] |
|
|
|
config.each do |c| |
|
|
|
d, hs = c['description'], c['hostnames'] |
|
|
|
groups << d |
|
|
|
hs.each { |host| hosts << [d, host] } |
|
|
|
end |
|
|
|
self.analyze hosts, output, groups |
|
|
|
end |
|
|
|
|
|
|
|
private |
|
|
|