fakessl 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -7,7 +7,7 @@ FakeSSL impersonates an HTTPS server and prints the client requests.
7
7
  Download and unzip the master zip from github and execute the following into fakessl dir
8
8
 
9
9
  $ gem build ./fakessl.gemspec
10
- $ gem install fakessl-0.0.1.gem
10
+ $ gem install fakessl-0.0.3.gem
11
11
 
12
12
  Or install it as:
13
13
 
@@ -15,18 +15,35 @@ Or install it as:
15
15
 
16
16
  ## Usage
17
17
 
18
- $ sudo fakessl -s localhost -p 443
18
+ Generate a certificate:
19
+
20
+ $ fakessl -g test.org
21
+ [+] Generating fake key and certificate for test.org
22
+
23
+ Use the previous certificate and key to setup a fake HTTPS server on port 443:
24
+
25
+ $ sudo fakessl -c test.org.cert -k test.org.key -p 443
26
+ Password:
27
+ [+] Fake test.org is listening on port 443
28
+ [+] Client requests are:
29
+ => GET /advv HTTP/1.1
30
+
31
+ Single command line to generate certificate and key and setup the HTTPS server:
32
+
33
+ $ sudo fakessl -g test.org -p 443
19
34
  Password:
20
- [+] Generating fake SSL certificate for localhost
21
- Generating a 4096 bit RSA private key
22
- ........++
23
- ................................................................++
24
- writing new private key to 'localhost.key'
25
- -----
26
- [+] Fake localhost is listening on port 443
35
+ [+] Generating fake key and certificate for test.org
36
+ [+] Fake test.org is listening on port 443
27
37
  [+] Client requests are:
28
38
  => GET /byy.html HTTP/1.1
29
39
 
40
+ In case you need to use it with a browser that checks the authenticity
41
+ of the certificate you need to import the generated certificate as trusted.
42
+ Firefox example.
43
+ Go to Edit -> Preferences -> Advanced -> View Certificates -> Servers -> Import
44
+ -> Choose the certificate from your drive after generating it.
45
+ Then select the imported certificate and click on the button "Edit Trust...".
46
+ Inside the Firefox window enable "Trust the authenticity of this certificate"
30
47
 
31
48
  ## Contributing
32
49
 
data/bin/fakessl CHANGED
@@ -14,13 +14,23 @@ options = {}
14
14
 
15
15
  optparse = OptionParser.new do |opts|
16
16
 
17
- opts.banner = "Usage: ./fakessl.rb -s HOSTNAME -p PORT"
17
+ opts.banner = "Usage: fakessl -g DOMAIN_NAME -p PORT\n" \
18
+ "Examples:\n" \
19
+ "1. Only generate fake certificates: fakessl -g test.org\n" \
20
+ "2. Generate fake certificate and setup server: fakessl -g test.org -p 5000\n" \
21
+ "3. Setup server using other external certificates: fakessl -c domain.cert -k domain.key -p 5000\n"
18
22
  opts.on('-h', '--help', 'Display this menu') do
19
23
  puts opts
20
24
  exit
21
25
  end
22
- opts.on('-s', '--server HOSTNAME', 'Server that FakeSSL should impersonate') do |f|
23
- options[:server] = f
26
+ opts.on('-g', '--generate DOMAIN_NAME', 'FakeSSL certificate generation') do |f|
27
+ options[:domain] = f
28
+ end
29
+ opts.on('-c', '--certificate FILE', 'FakeSSL certificate') do |f|
30
+ options[:certificate] = f
31
+ end
32
+ opts.on('-k', '--key FILE', 'FakeSSL private key') do |f|
33
+ options[:key] = f
24
34
  end
25
35
  opts.on('-p', '--port PORT', 'Port that FakeSSL should bind eg. 443') do |f|
26
36
  if f.is_integer?
@@ -35,12 +45,23 @@ end
35
45
 
36
46
  optparse.parse!
37
47
 
38
- if (!(options[:server].nil?) && !(options[:port].nil?))
48
+ if options[:domain] && options[:port].nil?
49
+ cert = FakeSSL::Cert.new(options[:domain])
50
+ cert.generate
51
+
52
+ elsif options[:domain] && options[:port]
53
+ cert = FakeSSL::Cert.new(options[:domain])
54
+ cert.generate
55
+ server = FakeSSL::Server.new(options[:port])
56
+
57
+ elsif (!(options[:certificate].nil?) && !(options[:key].nil?) && !(options[:port].nil?))
39
58
  if Integer(options[:port]) < 1025
40
59
  raise "Must run as root" unless Process.uid == 0
41
60
  end
42
- server = FakeSSL.new(options[:server],options[:port])
61
+ cert = FakeSSL::cert_path(options[:certificate],options[:key])
62
+ server = FakeSSL::Server.new(options[:port])
63
+
43
64
  else
44
- $stdout.puts "[-] Mandatory Parameter is missing, try fakessl.rb -h"
65
+ puts "[-] Mandatory Parameter is missing, try `fakessl -h`"
45
66
  end
46
67
 
@@ -1,45 +1,88 @@
1
1
  require 'socket'
2
2
  require 'openssl'
3
3
 
4
- class FakeSSL
5
-
6
- def initialize(hostname,lport)
7
- @hostname = hostname
8
- @lport = lport.to_i
9
- $stdout.puts "[+] Generating fake SSL certificate for #{@hostname}"
10
- generate_certificate
11
- sslServer = server_setup
12
- $stdout.puts "[+] Fake #{@hostname} is listening on port #{@lport}"
13
- get_request(sslServer)
14
- end
4
+ module FakeSSL
15
5
 
16
- def generate_certificate
17
- %x[openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=#{@hostname}" -keyout #{@hostname}.key -out #{@hostname}.cert]
18
- end
6
+ class << self; attr_accessor :domain, :cert, :key; end
19
7
 
20
- def server_setup
21
- server = TCPServer.new('localhost', @lport)
22
- sslContext = OpenSSL::SSL::SSLContext.new
23
- #certificate
24
- sslContext.cert = OpenSSL::X509::Certificate.new(File.open("#{@hostname}.cert"))
25
- #private key
26
- sslContext.key = OpenSSL::PKey::RSA.new(File.open("#{@hostname}.key"))
27
- sslServer = OpenSSL::SSL::SSLServer.new(server,sslContext)
28
- return sslServer
8
+ FakeSSL.domain = nil
9
+ FakeSSL.cert = nil
10
+ FakeSSL.key = nil
11
+
12
+ def FakeSSL.cert_path(fcert, fkey)
13
+ FakeSSL.cert = fcert
14
+ FakeSSL.key = fkey
15
+ FakeSSL.domain = fcert.chomp(".cert")
29
16
  end
30
17
 
31
- def get_request(sslServer)
32
- $stdout.puts "[+] Client requests are: "
33
- loop do
34
- conn = sslServer.accept
35
- lineIn = conn.gets
36
- if !lineIn.nil?
37
- $stdout.puts "=> " + lineIn
38
- end
18
+ class Cert
19
+ def initialize(domain)
20
+ FakeSSL.domain = domain
39
21
  end
22
+
23
+ public
24
+ def generate
25
+ puts "[+] Generating fake key and certificate for #{FakeSSL.domain}"
26
+ #generate keys
27
+ key = OpenSSL::PKey::RSA.new 4096
28
+ open "#{FakeSSL.domain}.key", 'w' do |io| io.write key.to_pem end
29
+
30
+ #generate certificate
31
+ name = OpenSSL::X509::Name.parse "CN=#{FakeSSL.domain}/DC=server"
32
+ cert = OpenSSL::X509::Certificate.new
33
+ cert.version = 2
34
+ cert.serial = 0
35
+ cert.not_before = Time.now
36
+ cert.not_after = Time.now + ( 3600 * 24 * 365 )
37
+ cert.public_key = key.public_key
38
+ cert.subject = name
39
+
40
+ #selfsign certificate
41
+ cert.issuer = name
42
+ cert.sign key, OpenSSL::Digest::SHA1.new
43
+ open "#{FakeSSL.domain}.cert", 'w' do |io| io.write cert.to_pem end
44
+ end
40
45
  end
41
46
 
42
- private :generate_certificate, :server_setup, :get_request
47
+ class Server
48
+ def initialize(lport)
49
+ @lport = lport.to_i
50
+ sslServer = server_setup
51
+ puts "[+] Fake #{FakeSSL.domain} is listening on port #{@lport}"
52
+ get_request(sslServer)
53
+ end
54
+
55
+ private
56
+ def server_setup
57
+ server = TCPServer.new('localhost', @lport)
58
+ sslContext = OpenSSL::SSL::SSLContext.new
59
+ #certificate
60
+ if FakeSSL.cert.nil?
61
+ sslContext.cert = OpenSSL::X509::Certificate.new(File.open("#{FakeSSL.domain}.cert"))
62
+ else
63
+ sslContext.cert = OpenSSL::X509::Certificate.new(File.open("#{FakeSSL.cert}"))
64
+ end
65
+ #private key
66
+ if FakeSSL.key.nil?
67
+ sslContext.key = OpenSSL::PKey::RSA.new(File.open("#{FakeSSL.domain}.key"))
68
+ else
69
+ sslContext.key = OpenSSL::PKey::RSA.new(File.open("#{FakeSSL.key}"))
70
+ end
71
+ sslServer = OpenSSL::SSL::SSLServer.new(server,sslContext)
72
+ return sslServer
73
+ end
74
+
75
+ def get_request(sslServer)
76
+ puts "[+] Client requests are: "
77
+ loop do
78
+ conn = sslServer.accept
79
+ lineIn = conn.gets
80
+ if !lineIn.nil?
81
+ puts "=> " + lineIn
82
+ end
83
+ end
84
+ end
85
+ end
43
86
 
44
87
  end
45
88
 
@@ -1,3 +1,3 @@
1
1
  module Fakessl
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fakessl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-14 00:00:00.000000000 Z
12
+ date: 2013-01-02 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: FakeSSL impersonates an HTTPS server and prints the client requests
15
15
  email:
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
48
  version: '0'
49
49
  requirements: []
50
50
  rubyforge_project:
51
- rubygems_version: 1.8.24
51
+ rubygems_version: 1.8.23
52
52
  signing_key:
53
53
  specification_version: 3
54
54
  summary: FakeSSL impersonates an HTTPS server and prints the client requests