aboutsummaryrefslogtreecommitdiffstats
path: root/test/ssl/svr.rb
blob: 66154a1c9cb2f344371bfe5594a2caa601f29b93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env ruby

require 'socket'
require 'openssl'
require 'getopts'
begin require 'verify_cb'; rescue LoadError; end

include OpenSSL
include SSL

getopts "v", "C:", "p:2000", "c:", "k:"

p [ $OPT_p, $OPT_k, $OPT_c ]

    if $OPT_k
      p rsa = PKey::RSA.new(File.open($OPT_k).read)
    else
      p rsa = PKey::RSA.new(512){|p, n|
        case p
        when 0; putc "."  # BN_generate_prime
        when 1; putc "+"  # BN_generate_prime
        when 2; putc "*"  # searching good prime, n = #of try,
                          # but also data from BN_generate_prime
        when 3; putc "\n" # found good prime, n==0 - p, n==1 - q,
                          # but also data from BN_generate_prime
        else;   putc "*"  # BN_generate_prime
        end
      }
    end

    if $OPT_c
      p cert = X509::Certificate.new(File.open($OPT_c).read)
    else
      cert = X509::Certificate.new
      cert.version = 2
      cert.serial = 0
      name = X509::Name.new([["C","CZ"],["O","Ruby"],["CN","Test"]])
      cert.subject = name
      cert.issuer = name
      cert.not_before = Time.now
      cert.not_after = Time.now + (365*24*60*60)
      cert.public_key = rsa.public_key
      ef = X509::ExtensionFactory.new(nil,cert)
      cert.extensions = [
        ef.create_extension("basicConstraints","CA:FALSE"),
        ef.create_extension("subjectKeyIdentifier", "hash")
      ]
      ef.issuer_certificate = cert
      cert.add_extension ef.create_extension("authorityKeyIdentifier",
                                             "keyid:always,issuer:always")
      cert.add_extension ef.create_extension("nsComment",
                                             "Generated by OpenSSL for Ruby!")
      cert.sign(rsa, Digest::SHA1.new)
      puts cert.to_s
    end

ns = TCPServer.new($OPT_p)
loop do
  begin
    s = ns.accept
    STDERR.print "connect from #{s.peeraddr[3]}.\n"

    ssl = SSLSocket.new(s, cert, rsa)
    ###ssl.ca_cert = X509::Certificate.new(File.open($OPT_C).read) if $OPT_C && FileTest::file?($OPT_C)
    ssl.ca_file = $OPT_C if $OPT_C && FileTest::file?($OPT_C)
    ssl.ca_path = $OPT_C if $OPT_C && FileTest::directory?($OPT_C)
    ssl.verify_mode = VERIFY_PEER|VERIFY_FAIL_IF_NO_PEER_CERT if $OPT_v
    ssl.verify_callback = VerifyCallbackProc if defined? VerifyCallbackProc
    STDERR.print "SSLSocket initialized.\n"

    ssl.accept
    STDERR.print "SSLSocket accepted.\n"
    STDERR.print ssl.peer_cert.inspect, "\n" if ssl.peer_cert
  rescue 
    ssl.close
    s.close
    print $!, "\n"
    next
  end

  Thread.start{
    puts "Thread started"
    while line = ssl.gets
      p line
    end
    STDERR.print "connection closed.\n"
    ssl.close
    s.close
  }
end