jruby-openssl 0.7.4 → 0.7.6.1

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.
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