jruby-openssl 0.7.4 → 0.7.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/.gemtest +0 -0
  2. data/History.txt +51 -14
  3. data/Manifest.txt +136 -79
  4. data/README.txt +1 -1
  5. data/Rakefile +17 -8
  6. data/lib/{openssl → 1.8/openssl}/bn.rb +2 -2
  7. data/lib/{openssl → 1.8/openssl}/buffering.rb +3 -1
  8. data/lib/{openssl → 1.8/openssl}/cipher.rb +0 -0
  9. data/lib/{openssl → 1.8/openssl}/config.rb +1 -1
  10. data/lib/{openssl → 1.8/openssl}/digest.rb +2 -2
  11. data/lib/{openssl → 1.8/openssl}/pkcs7.rb +0 -0
  12. data/lib/{openssl/ssl.rb → 1.8/openssl/ssl-internal.rb} +2 -2
  13. data/lib/1.8/openssl/ssl.rb +1 -0
  14. data/lib/{openssl/x509.rb → 1.8/openssl/x509-internal.rb} +8 -9
  15. data/lib/1.8/openssl/x509.rb +1 -0
  16. data/lib/{openssl.rb → 1.8/openssl.rb} +2 -11
  17. data/lib/1.9/openssl/bn.rb +35 -0
  18. data/lib/1.9/openssl/buffering.rb +448 -0
  19. data/lib/1.9/openssl/cipher.rb +65 -0
  20. data/lib/1.9/openssl/config.rb +313 -0
  21. data/lib/1.9/openssl/digest.rb +72 -0
  22. data/lib/1.9/openssl/ssl-internal.rb +177 -0
  23. data/lib/1.9/openssl/ssl.rb +2 -0
  24. data/lib/1.9/openssl/x509-internal.rb +158 -0
  25. data/lib/1.9/openssl/x509.rb +2 -0
  26. data/lib/1.9/openssl.rb +22 -0
  27. data/lib/{jopenssl → shared/jopenssl}/version.rb +1 -1
  28. data/lib/shared/jopenssl.jar +0 -0
  29. data/lib/{openssl → shared/openssl}/dummy.rb +0 -0
  30. data/lib/{openssl → shared/openssl}/dummyssl.rb +0 -0
  31. data/lib/shared/openssl/pkcs12.rb +50 -0
  32. data/lib/shared/openssl/ssl.rb +1 -0
  33. data/lib/shared/openssl/x509.rb +1 -0
  34. data/lib/shared/openssl.rb +20 -0
  35. data/test/{openssl → 1.8}/ssl_server.rb +0 -0
  36. data/test/{openssl → 1.8}/test_asn1.rb +15 -0
  37. data/test/{openssl → 1.8}/test_cipher.rb +0 -0
  38. data/test/{openssl → 1.8}/test_config.rb +0 -0
  39. data/test/{openssl → 1.8}/test_digest.rb +0 -0
  40. data/test/{openssl → 1.8}/test_ec.rb +0 -0
  41. data/test/{openssl → 1.8}/test_hmac.rb +0 -0
  42. data/test/{openssl → 1.8}/test_ns_spki.rb +0 -0
  43. data/test/{openssl → 1.8}/test_pair.rb +10 -2
  44. data/test/{openssl → 1.8}/test_pkcs7.rb +0 -0
  45. data/test/{openssl → 1.8}/test_pkey_rsa.rb +0 -0
  46. data/test/{openssl → 1.8}/test_ssl.rb +17 -20
  47. data/test/{openssl → 1.8}/test_x509cert.rb +0 -0
  48. data/test/{openssl → 1.8}/test_x509crl.rb +0 -0
  49. data/test/{openssl → 1.8}/test_x509ext.rb +0 -0
  50. data/test/{openssl → 1.8}/test_x509name.rb +0 -0
  51. data/test/{openssl → 1.8}/test_x509req.rb +0 -0
  52. data/test/{openssl → 1.8}/test_x509store.rb +0 -0
  53. data/test/{openssl → 1.8}/utils.rb +0 -0
  54. data/test/1.9/ssl_server.rb +81 -0
  55. data/test/1.9/test_asn1.rb +589 -0
  56. data/test/1.9/test_bn.rb +23 -0
  57. data/test/1.9/test_buffering.rb +88 -0
  58. data/test/1.9/test_cipher.rb +107 -0
  59. data/test/1.9/test_config.rb +288 -0
  60. data/test/1.9/test_digest.rb +118 -0
  61. data/test/1.9/test_engine.rb +15 -0
  62. data/test/1.9/test_hmac.rb +32 -0
  63. data/test/1.9/test_ns_spki.rb +50 -0
  64. data/test/1.9/test_ocsp.rb +47 -0
  65. data/test/1.9/test_pair.rb +257 -0
  66. data/test/1.9/test_pkcs12.rb +209 -0
  67. data/test/1.9/test_pkcs7.rb +151 -0
  68. data/test/1.9/test_pkey_dh.rb +72 -0
  69. data/test/1.9/test_pkey_dsa.rb +224 -0
  70. data/test/1.9/test_pkey_ec.rb +182 -0
  71. data/test/1.9/test_pkey_rsa.rb +244 -0
  72. data/test/1.9/test_ssl.rb +455 -0
  73. data/test/1.9/test_ssl_session.rb +327 -0
  74. data/test/1.9/test_x509cert.rb +217 -0
  75. data/test/1.9/test_x509crl.rb +221 -0
  76. data/test/1.9/test_x509ext.rb +69 -0
  77. data/test/1.9/test_x509name.rb +296 -0
  78. data/test/1.9/test_x509req.rb +150 -0
  79. data/test/1.9/test_x509store.rb +229 -0
  80. data/test/1.9/utils.rb +304 -0
  81. data/test/fixture/ids_in_subject_rdn_set.pem +31 -0
  82. data/test/fixture/purpose/ca/ca_config.rb +1 -1
  83. data/test/fixture/purpose/ca/gen_cert.rb +128 -0
  84. data/test/fixture/purpose/ca/newcerts/4_cert.pem +19 -0
  85. data/test/fixture/purpose/ca/serial +1 -1
  86. data/test/fixture/purpose/sslserver_no_dsig_in_keyUsage.pem +19 -0
  87. data/test/ruby/envutil.rb +208 -0
  88. data/test/ruby/ut_eof.rb +128 -0
  89. data/test/test_certificate.rb +9 -0
  90. data/test/test_java.rb +1 -1
  91. data/test/test_openssl.rb +1 -1
  92. data/test/test_pkcs7.rb +16 -0
  93. data/test/test_pkey_dsa.rb +180 -0
  94. data/test/test_pkey_rsa.rb +298 -0
  95. data/test/test_ssl.rb +1 -1
  96. data/test/test_x509store.rb +8 -0
  97. metadata +133 -73
  98. data/lib/jopenssl.jar +0 -0
  99. data/test/test_pkey.rb +0 -204
@@ -0,0 +1,455 @@
1
+ require_relative "utils"
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
6
+ def test_ctx_setup
7
+ ctx = OpenSSL::SSL::SSLContext.new
8
+ assert_equal(ctx.setup, true)
9
+ assert_equal(ctx.setup, nil)
10
+ end
11
+
12
+ def test_ctx_setup_no_compression
13
+ ctx = OpenSSL::SSL::SSLContext.new
14
+ ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_COMPRESSION
15
+ assert_equal(ctx.setup, true)
16
+ assert_equal(ctx.setup, nil)
17
+ assert_equal(OpenSSL::SSL::OP_NO_COMPRESSION,
18
+ ctx.options & OpenSSL::SSL::OP_NO_COMPRESSION)
19
+ end if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
20
+
21
+ def test_not_started_session
22
+ skip "non socket argument of SSLSocket.new is not supported on this platform" if /mswin|mingw/ =~ RUBY_PLATFORM
23
+ open(__FILE__) do |f|
24
+ assert_nil OpenSSL::SSL::SSLSocket.new(f).cert
25
+ end
26
+ end
27
+
28
+ def test_ssl_read_nonblock
29
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true) { |server, port|
30
+ sock = TCPSocket.new("127.0.0.1", port)
31
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
32
+ ssl.sync_close = true
33
+ ssl.connect
34
+ assert_raise(IO::WaitReadable) { ssl.read_nonblock(100) }
35
+ ssl.write("abc\n")
36
+ IO.select [ssl]
37
+ assert_equal('a', ssl.read_nonblock(1))
38
+ assert_equal("bc\n", ssl.read_nonblock(100))
39
+ assert_raise(IO::WaitReadable) { ssl.read_nonblock(100) }
40
+ }
41
+ end
42
+
43
+ def test_connect_and_close
44
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
45
+ sock = TCPSocket.new("127.0.0.1", port)
46
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
47
+ assert(ssl.connect)
48
+ ssl.close
49
+ assert(!sock.closed?)
50
+ sock.close
51
+
52
+ sock = TCPSocket.new("127.0.0.1", port)
53
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
54
+ ssl.sync_close = true # !!
55
+ assert(ssl.connect)
56
+ ssl.close
57
+ assert(sock.closed?)
58
+ }
59
+ end
60
+
61
+ def test_read_and_write
62
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
63
+ sock = TCPSocket.new("127.0.0.1", port)
64
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
65
+ ssl.sync_close = true
66
+ ssl.connect
67
+
68
+ # puts and gets
69
+ ITERATIONS.times{
70
+ str = "x" * 100 + "\n"
71
+ ssl.puts(str)
72
+ assert_equal(str, ssl.gets)
73
+
74
+ str = "x" * 100
75
+ ssl.puts(str)
76
+ assert_equal(str, ssl.gets("\n", 100))
77
+ assert_equal("\n", ssl.gets)
78
+ }
79
+
80
+ # read and write
81
+ ITERATIONS.times{|i|
82
+ str = "x" * 100 + "\n"
83
+ ssl.write(str)
84
+ assert_equal(str, ssl.read(str.size))
85
+
86
+ str = "x" * i * 100 + "\n"
87
+ buf = ""
88
+ ssl.write(str)
89
+ assert_equal(buf.object_id, ssl.read(str.size, buf).object_id)
90
+ assert_equal(str, buf)
91
+ }
92
+
93
+ ssl.close
94
+ }
95
+ end
96
+
97
+ def sysread_size(ssl, size)
98
+ buf = ''
99
+ while buf.bytesize < size
100
+ buf += ssl.sysread(size - buf.bytesize)
101
+ end
102
+ buf
103
+ end
104
+
105
+ def test_sysread_chunks
106
+ args = {}
107
+ args[:server_proc] = proc { |ctx, ssl|
108
+ while line = ssl.gets
109
+ if line =~ /^STARTTLS$/
110
+ ssl.accept
111
+ next
112
+ end
113
+ ssl.write("0" * 800)
114
+ ssl.write("1" * 200)
115
+ ssl.close
116
+ break
117
+ end
118
+ }
119
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, args){|server, port|
120
+ sock = TCPSocket.new("127.0.0.1", port)
121
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
122
+ ssl.sync_close = true
123
+ ssl.connect
124
+ ssl.syswrite("hello\n")
125
+ assert_equal("0" * 200, sysread_size(ssl, 200))
126
+ assert_equal("0" * 200, sysread_size(ssl, 200))
127
+ assert_equal("0" * 200, sysread_size(ssl, 200))
128
+ assert_equal("0" * 200, sysread_size(ssl, 200))
129
+ assert_equal("1" * 200, sysread_size(ssl, 200))
130
+ ssl.close
131
+ }
132
+ end
133
+
134
+ def test_sysread_buffer
135
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
136
+ sock = TCPSocket.new("127.0.0.1", port)
137
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
138
+ ssl.sync_close = true
139
+ ssl.connect
140
+ ITERATIONS.times{|i|
141
+ # the given buffer is cleared before concatenating.
142
+ # NB: SSLSocket#readpartial depends sysread.
143
+ str = "x" * i * 100 + "\n"
144
+ ssl.syswrite(str)
145
+ buf = "asdf"
146
+ assert_equal(buf.object_id, ssl.sysread(0, buf).object_id)
147
+ assert_equal("", buf)
148
+
149
+ buf = "asdf"
150
+ read = ssl.sysread(str.size, buf)
151
+ assert(!read.empty?)
152
+ assert_equal(buf.object_id, read.object_id)
153
+ assert_equal(str[0, buf.bytesize], buf)
154
+ sysread_size(ssl, str.bytesize - buf.bytesize) # drop unread bytes
155
+
156
+ ssl.syswrite(str)
157
+ read = ssl.sysread(str.size, nil)
158
+ assert(!read.empty?)
159
+ assert_equal(str[0, read.bytesize], read)
160
+ sysread_size(ssl, str.bytesize - read.bytesize) # drop unread bytes
161
+ }
162
+ ssl.close
163
+ }
164
+ end
165
+
166
+ def test_client_auth
167
+ vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
168
+ start_server(PORT, vflag, true){|server, port|
169
+ assert_raise(OpenSSL::SSL::SSLError, Errno::ECONNRESET){
170
+ sock = TCPSocket.new("127.0.0.1", port)
171
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
172
+ ssl.connect
173
+ }
174
+
175
+ ctx = OpenSSL::SSL::SSLContext.new
176
+ ctx.key = @cli_key
177
+ ctx.cert = @cli_cert
178
+ sock = TCPSocket.new("127.0.0.1", port)
179
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
180
+ ssl.sync_close = true
181
+ ssl.connect
182
+ ssl.puts("foo")
183
+ assert_equal("foo\n", ssl.gets)
184
+ ssl.close
185
+
186
+ called = nil
187
+ ctx = OpenSSL::SSL::SSLContext.new
188
+ ctx.client_cert_cb = Proc.new{ |sslconn|
189
+ called = true
190
+ [@cli_cert, @cli_key]
191
+ }
192
+ sock = TCPSocket.new("127.0.0.1", port)
193
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
194
+ ssl.sync_close = true
195
+ ssl.connect
196
+ assert(called)
197
+ ssl.puts("foo")
198
+ assert_equal("foo\n", ssl.gets)
199
+ ssl.close
200
+ }
201
+ end
202
+
203
+ def test_client_ca
204
+ ctx_proc = Proc.new do |ctx|
205
+ ctx.client_ca = [@ca_cert]
206
+ end
207
+
208
+ vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
209
+ start_server(PORT, vflag, true, :ctx_proc => ctx_proc){|server, port|
210
+ ctx = OpenSSL::SSL::SSLContext.new
211
+ client_ca_from_server = nil
212
+ ctx.client_cert_cb = Proc.new do |sslconn|
213
+ client_ca_from_server = sslconn.client_ca
214
+ [@cli_cert, @cli_key]
215
+ end
216
+ sock = TCPSocket.new("127.0.0.1", port)
217
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
218
+ ssl.sync_close = true
219
+ ssl.connect
220
+ assert_equal([@ca], client_ca_from_server)
221
+ ssl.close
222
+ }
223
+ end
224
+
225
+ def test_starttls
226
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, false){|server, port|
227
+ sock = TCPSocket.new("127.0.0.1", port)
228
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
229
+ ssl.sync_close = true
230
+ str = "x" * 1000 + "\n"
231
+
232
+ OpenSSL::TestUtils.silent do
233
+ ITERATIONS.times{
234
+ ssl.puts(str)
235
+ assert_equal(str, ssl.gets)
236
+ }
237
+ starttls(ssl)
238
+ end
239
+
240
+ ITERATIONS.times{
241
+ ssl.puts(str)
242
+ assert_equal(str, ssl.gets)
243
+ }
244
+
245
+ ssl.close
246
+ }
247
+ end
248
+
249
+ def test_parallel
250
+ GC.start
251
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
252
+ ssls = []
253
+ 10.times{
254
+ sock = TCPSocket.new("127.0.0.1", port)
255
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
256
+ ssl.connect
257
+ ssl.sync_close = true
258
+ ssls << ssl
259
+ }
260
+ str = "x" * 1000 + "\n"
261
+ ITERATIONS.times{
262
+ ssls.each{|ssl|
263
+ ssl.puts(str)
264
+ assert_equal(str, ssl.gets)
265
+ }
266
+ }
267
+ ssls.each{|ssl| ssl.close }
268
+ }
269
+ end
270
+
271
+ def test_verify_result
272
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
273
+ sock = TCPSocket.new("127.0.0.1", port)
274
+ ctx = OpenSSL::SSL::SSLContext.new
275
+ ctx.set_params
276
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
277
+ assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
278
+ assert_equal(OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN, ssl.verify_result)
279
+
280
+ sock = TCPSocket.new("127.0.0.1", port)
281
+ ctx = OpenSSL::SSL::SSLContext.new
282
+ ctx.set_params(
283
+ :verify_callback => Proc.new do |preverify_ok, store_ctx|
284
+ store_ctx.error = OpenSSL::X509::V_OK
285
+ true
286
+ end
287
+ )
288
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
289
+ ssl.connect
290
+ assert_equal(OpenSSL::X509::V_OK, ssl.verify_result)
291
+
292
+ sock = TCPSocket.new("127.0.0.1", port)
293
+ ctx = OpenSSL::SSL::SSLContext.new
294
+ ctx.set_params(
295
+ :verify_callback => Proc.new do |preverify_ok, store_ctx|
296
+ store_ctx.error = OpenSSL::X509::V_ERR_APPLICATION_VERIFICATION
297
+ false
298
+ end
299
+ )
300
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
301
+ assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
302
+ assert_equal(OpenSSL::X509::V_ERR_APPLICATION_VERIFICATION, ssl.verify_result)
303
+ }
304
+ end
305
+
306
+ def test_exception_in_verify_callback_is_ignored
307
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
308
+ sock = TCPSocket.new("127.0.0.1", port)
309
+ ctx = OpenSSL::SSL::SSLContext.new
310
+ ctx.set_params(
311
+ :verify_callback => Proc.new do |preverify_ok, store_ctx|
312
+ store_ctx.error = OpenSSL::X509::V_OK
313
+ raise RuntimeError
314
+ end
315
+ )
316
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
317
+ OpenSSL::TestUtils.silent do
318
+ # SSLError, not RuntimeError
319
+ assert_raise(OpenSSL::SSL::SSLError) { ssl.connect }
320
+ end
321
+ assert_equal(OpenSSL::X509::V_ERR_CERT_REJECTED, ssl.verify_result)
322
+ ssl.close
323
+ }
324
+ end
325
+
326
+ def test_sslctx_set_params
327
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
328
+ sock = TCPSocket.new("127.0.0.1", port)
329
+ ctx = OpenSSL::SSL::SSLContext.new
330
+ ctx.set_params
331
+ assert_equal(OpenSSL::SSL::VERIFY_PEER, ctx.verify_mode)
332
+ assert_equal(OpenSSL::SSL::OP_ALL, ctx.options)
333
+ ciphers = ctx.ciphers
334
+ ciphers_versions = ciphers.collect{|_, v, _, _| v }
335
+ ciphers_names = ciphers.collect{|v, _, _, _| v }
336
+ assert(ciphers_names.all?{|v| /ADH/ !~ v })
337
+ assert(ciphers_versions.all?{|v| /SSLv2/ !~ v })
338
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
339
+ assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
340
+ assert_equal(OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN, ssl.verify_result)
341
+ }
342
+ end
343
+
344
+ def test_post_connection_check
345
+ sslerr = OpenSSL::SSL::SSLError
346
+
347
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
348
+ sock = TCPSocket.new("127.0.0.1", port)
349
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
350
+ ssl.connect
351
+ assert_raise(sslerr){ssl.post_connection_check("localhost.localdomain")}
352
+ assert_raise(sslerr){ssl.post_connection_check("127.0.0.1")}
353
+ assert(ssl.post_connection_check("localhost"))
354
+ assert_raise(sslerr){ssl.post_connection_check("foo.example.com")}
355
+
356
+ cert = ssl.peer_cert
357
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "localhost.localdomain"))
358
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "127.0.0.1"))
359
+ assert(OpenSSL::SSL.verify_certificate_identity(cert, "localhost"))
360
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "foo.example.com"))
361
+ }
362
+
363
+ now = Time.now
364
+ exts = [
365
+ ["keyUsage","keyEncipherment,digitalSignature",true],
366
+ ["subjectAltName","DNS:localhost.localdomain",false],
367
+ ["subjectAltName","IP:127.0.0.1",false],
368
+ ]
369
+ @svr_cert = issue_cert(@svr, @svr_key, 4, now, now+1800, exts,
370
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
371
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
372
+ sock = TCPSocket.new("127.0.0.1", port)
373
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
374
+ ssl.connect
375
+ assert(ssl.post_connection_check("localhost.localdomain"))
376
+ assert(ssl.post_connection_check("127.0.0.1"))
377
+ assert_raise(sslerr){ssl.post_connection_check("localhost")}
378
+ assert_raise(sslerr){ssl.post_connection_check("foo.example.com")}
379
+
380
+ cert = ssl.peer_cert
381
+ assert(OpenSSL::SSL.verify_certificate_identity(cert, "localhost.localdomain"))
382
+ assert(OpenSSL::SSL.verify_certificate_identity(cert, "127.0.0.1"))
383
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "localhost"))
384
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "foo.example.com"))
385
+ }
386
+
387
+ now = Time.now
388
+ exts = [
389
+ ["keyUsage","keyEncipherment,digitalSignature",true],
390
+ ["subjectAltName","DNS:*.localdomain",false],
391
+ ]
392
+ @svr_cert = issue_cert(@svr, @svr_key, 5, now, now+1800, exts,
393
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
394
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
395
+ sock = TCPSocket.new("127.0.0.1", port)
396
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
397
+ ssl.connect
398
+ assert(ssl.post_connection_check("localhost.localdomain"))
399
+ assert_raise(sslerr){ssl.post_connection_check("127.0.0.1")}
400
+ assert_raise(sslerr){ssl.post_connection_check("localhost")}
401
+ assert_raise(sslerr){ssl.post_connection_check("foo.example.com")}
402
+ cert = ssl.peer_cert
403
+ assert(OpenSSL::SSL.verify_certificate_identity(cert, "localhost.localdomain"))
404
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "127.0.0.1"))
405
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "localhost"))
406
+ assert(!OpenSSL::SSL.verify_certificate_identity(cert, "foo.example.com"))
407
+ }
408
+ end
409
+
410
+ def test_tlsext_hostname
411
+ return unless OpenSSL::SSL::SSLSocket.instance_methods.include?(:hostname)
412
+
413
+ ctx_proc = Proc.new do |ctx, ssl|
414
+ foo_ctx = ctx.dup
415
+
416
+ ctx.servername_cb = Proc.new do |ssl2, hostname|
417
+ case hostname
418
+ when 'foo.example.com'
419
+ foo_ctx
420
+ when 'bar.example.com'
421
+ nil
422
+ else
423
+ raise "unknown hostname #{hostname.inspect}"
424
+ end
425
+ end
426
+ end
427
+
428
+ server_proc = Proc.new do |ctx, ssl|
429
+ readwrite_loop(ctx, ssl)
430
+ end
431
+
432
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, :ctx_proc => ctx_proc, :server_proc => server_proc) do |server, port|
433
+ 2.times do |i|
434
+ sock = TCPSocket.new("127.0.0.1", port)
435
+ ctx = OpenSSL::SSL::SSLContext.new
436
+ if defined?(OpenSSL::SSL::OP_NO_TICKET)
437
+ # disable RFC4507 support
438
+ ctx.options = OpenSSL::SSL::OP_NO_TICKET
439
+ end
440
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
441
+ ssl.sync_close = true
442
+ ssl.hostname = (i & 1 == 0) ? 'foo.example.com' : 'bar.example.com'
443
+ ssl.connect
444
+
445
+ str = "x" * 100 + "\n"
446
+ ssl.puts(str)
447
+ assert_equal(str, ssl.gets)
448
+
449
+ ssl.close
450
+ end
451
+ end
452
+ end
453
+ end
454
+
455
+ end