@@ -65,159 +65,274 @@ def test_add_file_path
65
65
tmpfile and tmpfile . close!
66
66
end
67
67
68
- def test_verify
69
- # OpenSSL uses time(2) while Time.now uses clock_gettime(CLOCK_REALTIME),
70
- # and there may be difference.
71
- now = Time . now - 3
68
+ def test_verify_simple
72
69
ca_exts = [
73
- [ "basicConstraints" , "CA:TRUE" , true ] ,
74
- [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
70
+ [ "basicConstraints" , "CA:TRUE" , true ] ,
71
+ [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
75
72
]
73
+ ca1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Root CA" )
74
+ ca1_key = Fixtures . pkey ( "rsa-1" )
75
+ ca1_cert = issue_cert ( ca1 , ca1_key , 1 , ca_exts , nil , nil )
76
+ ca2 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Intermediate CA" )
77
+ ca2_key = Fixtures . pkey ( "rsa-2" )
78
+ ca2_cert = issue_cert ( ca2 , ca2_key , 2 , ca_exts , ca1_cert , ca1_key )
79
+
76
80
ee_exts = [
77
- [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
81
+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
78
82
]
79
- ca1_cert = issue_cert ( @ca1 , @rsa2048 , 1 , ca_exts , nil , nil )
80
- ca2_cert = issue_cert ( @ca2 , @rsa1024 , 2 , ca_exts , ca1_cert , @rsa2048 ,
81
- not_after : now +1800 )
82
- ee1_cert = issue_cert ( @ee1 , @dsa256 , 10 , ee_exts , ca2_cert , @rsa1024 )
83
- ee2_cert = issue_cert ( @ee2 , @dsa512 , 20 , ee_exts , ca2_cert , @rsa1024 )
84
- ee3_cert = issue_cert ( @ee2 , @dsa512 , 30 , ee_exts , ca2_cert , @rsa1024 ,
85
- not_before : now -100 , not_after : now -1 )
86
- ee4_cert = issue_cert ( @ee2 , @dsa512 , 40 , ee_exts , ca2_cert , @rsa1024 ,
87
- not_before : now +1000 , not_after : now +2000 , )
88
-
89
- revoke_info = [ ]
90
- crl1 = issue_crl ( revoke_info , 1 , now , now +1800 , [ ] ,
91
- ca1_cert , @rsa2048 , OpenSSL ::Digest . new ( 'SHA1' ) )
92
- revoke_info = [ [ 2 , now , 1 ] , ]
93
- crl1_2 = issue_crl ( revoke_info , 2 , now , now +1800 , [ ] ,
94
- ca1_cert , @rsa2048 , OpenSSL ::Digest . new ( 'SHA1' ) )
95
- revoke_info = [ [ 20 , now , 1 ] , ]
96
- crl2 = issue_crl ( revoke_info , 1 , now , now +1800 , [ ] ,
97
- ca2_cert , @rsa1024 , OpenSSL ::Digest . new ( 'SHA1' ) )
98
- revoke_info = [ ]
99
- crl2_2 = issue_crl ( revoke_info , 2 , now -100 , now -1 , [ ] ,
100
- ca2_cert , @rsa1024 , OpenSSL ::Digest . new ( 'SHA1' ) )
101
-
102
- assert_equal ( true , ca1_cert . verify ( ca1_cert . public_key ) ) # self signed
103
- assert_equal ( true , ca2_cert . verify ( ca1_cert . public_key ) ) # issued by ca1
104
- assert_equal ( true , ee1_cert . verify ( ca2_cert . public_key ) ) # issued by ca2
105
- assert_equal ( true , ee2_cert . verify ( ca2_cert . public_key ) ) # issued by ca2
106
- assert_equal ( true , ee3_cert . verify ( ca2_cert . public_key ) ) # issued by ca2
107
- assert_equal ( true , crl1 . verify ( ca1_cert . public_key ) ) # issued by ca1
108
- assert_equal ( true , crl1_2 . verify ( ca1_cert . public_key ) ) # issued by ca1
109
- assert_equal ( true , crl2 . verify ( ca2_cert . public_key ) ) # issued by ca2
110
- assert_equal ( true , crl2_2 . verify ( ca2_cert . public_key ) ) # issued by ca2
83
+ ee1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 1" )
84
+ ee1_key = Fixtures . pkey ( "rsa-3" )
85
+ ee1_cert = issue_cert ( ee1 , ee1_key , 10 , ee_exts , ca2_cert , ca2_key )
111
86
87
+ # Nothing trusted
112
88
store = OpenSSL ::X509 ::Store . new
113
- assert_equal ( false , store . verify ( ca1_cert ) )
114
- assert_not_equal ( OpenSSL ::X509 ::V_OK , store . error )
89
+ assert_equal ( false , store . verify ( ee1_cert , [ ca2_cert , ca1_cert ] ) )
90
+ assert_equal ( OpenSSL ::X509 ::V_ERR_SELF_SIGNED_CERT_IN_CHAIN , store . error )
91
+ assert_match ( /self.signed/i , store . error_string )
115
92
116
- assert_equal ( false , store . verify ( ca2_cert ) )
117
- assert_not_equal ( OpenSSL ::X509 ::V_OK , store . error )
93
+ # CA1 trusted, CA2 missing
94
+ store = OpenSSL ::X509 ::Store . new
95
+ store . add_cert ( ca1_cert )
96
+ assert_equal ( false , store . verify ( ee1_cert ) )
97
+ assert_equal ( OpenSSL ::X509 ::V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY , store . error )
118
98
99
+ # CA1 trusted, CA2 supplied
100
+ store = OpenSSL ::X509 ::Store . new
119
101
store . add_cert ( ca1_cert )
120
- assert_equal ( true , store . verify ( ca2_cert ) )
102
+ assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] ) )
103
+ assert_match ( /ok/i , store . error_string )
121
104
assert_equal ( OpenSSL ::X509 ::V_OK , store . error )
122
- assert_equal ( "ok" , store . error_string )
123
- chain = store . chain
124
- assert_equal ( 2 , chain . size )
125
- assert_equal ( @ca2 . to_der , chain [ 0 ] . subject . to_der )
126
- assert_equal ( @ca1 . to_der , chain [ 1 ] . subject . to_der )
105
+ assert_equal ( [ ee1_cert , ca2_cert , ca1_cert ] , store . chain )
106
+ end
127
107
128
- store . purpose = OpenSSL ::X509 ::PURPOSE_SSL_CLIENT
129
- assert_equal ( false , store . verify ( ca2_cert ) )
130
- assert_not_equal ( OpenSSL ::X509 ::V_OK , store . error )
108
+ def test_verify_callback
109
+ ca_exts = [
110
+ [ "basicConstraints" , "CA:TRUE" , true ] ,
111
+ [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
112
+ ]
113
+ ca1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Root CA" )
114
+ ca1_key = Fixtures . pkey ( "rsa-1" )
115
+ ca1_cert = issue_cert ( ca1 , ca1_key , 1 , ca_exts , nil , nil )
116
+ ca2 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Intermediate CA" )
117
+ ca2_key = Fixtures . pkey ( "rsa-2" )
118
+ ca2_cert = issue_cert ( ca2 , ca2_key , 2 , ca_exts , ca1_cert , ca1_key )
131
119
132
- store . purpose = OpenSSL ::X509 ::PURPOSE_CRL_SIGN
133
- assert_equal ( true , store . verify ( ca2_cert ) )
134
- assert_equal ( OpenSSL ::X509 ::V_OK , store . error )
120
+ ee_exts = [
121
+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
122
+ ]
123
+ ee1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 1" )
124
+ ee1_key = Fixtures . pkey ( "rsa-3" )
125
+ ee1_cert = issue_cert ( ee1 , ee1_key , 10 , ee_exts , ca2_cert , ca2_key )
135
126
136
- store . add_cert ( ca2_cert )
137
- store . purpose = OpenSSL ::X509 ::PURPOSE_SSL_CLIENT
138
- assert_equal ( true , store . verify ( ee1_cert ) )
139
- assert_equal ( true , store . verify ( ee2_cert ) )
140
- assert_equal ( OpenSSL ::X509 ::V_OK , store . error )
141
- assert_equal ( "ok" , store . error_string )
142
- chain = store . chain
143
- assert_equal ( 3 , chain . size )
144
- assert_equal ( @ee2 . to_der , chain [ 0 ] . subject . to_der )
145
- assert_equal ( @ca2 . to_der , chain [ 1 ] . subject . to_der )
146
- assert_equal ( @ca1 . to_der , chain [ 2 ] . subject . to_der )
147
- assert_equal ( false , store . verify ( ee3_cert ) )
148
- assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_HAS_EXPIRED , store . error )
149
- assert_match ( /expire/i , store . error_string )
150
- assert_equal ( false , store . verify ( ee4_cert ) )
151
- assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_NOT_YET_VALID , store . error )
152
- assert_match ( /not yet valid/i , store . error_string )
127
+ # verify_callback on X509::Store is called with proper arguments
128
+ cb_calls = [ ]
129
+ store = OpenSSL ::X509 ::Store . new
130
+ store . verify_callback = -> ( preverify_ok , sctx ) {
131
+ cb_calls << [ preverify_ok , sctx . current_cert ]
132
+ preverify_ok
133
+ }
134
+ store . add_cert ( ca1_cert )
135
+ assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] ) )
136
+ assert_equal ( 3 , cb_calls . size )
137
+ assert_equal ( [ true , ca1_cert ] , cb_calls [ 0 ] )
138
+ assert_equal ( [ true , ca2_cert ] , cb_calls [ 1 ] )
139
+ assert_equal ( [ true , ee1_cert ] , cb_calls [ 2 ] )
153
140
141
+ # verify_callback can change verification result
142
+ store = OpenSSL ::X509 ::Store . new
143
+ store . verify_callback = -> ( preverify_ok , sctx ) {
144
+ next preverify_ok if sctx . current_cert != ee1_cert
145
+ sctx . error = OpenSSL ::X509 ::V_ERR_APPLICATION_VERIFICATION
146
+ false
147
+ }
148
+ store . add_cert ( ca1_cert )
149
+ assert_equal ( false , store . verify ( ee1_cert , [ ca2_cert ] ) )
150
+ assert_equal ( OpenSSL ::X509 ::V_ERR_APPLICATION_VERIFICATION , store . error )
151
+
152
+ # Exception raised by verify_callback is currently suppressed, and is
153
+ # treated as a non-truthy return (with warning)
154
+ store = OpenSSL ::X509 ::Store . new
155
+ store . verify_callback = -> ( preverify_ok , sctx ) {
156
+ raise "suppressed"
157
+ }
158
+ store . add_cert ( ca1_cert )
159
+ assert_warning ( /exception in verify_callback/ ) {
160
+ assert_equal ( false , store . verify ( ee1_cert , [ ca2_cert ] ) )
161
+ }
162
+
163
+ # The block given to X509::Store#verify replaces it
164
+ called = nil
165
+ store = OpenSSL ::X509 ::Store . new
166
+ store . verify_callback = -> ( preverify_ok , sctx ) { called = :store ; preverify_ok }
167
+ store . add_cert ( ca1_cert )
168
+ blk = proc { |preverify_ok , sctx | called = :block ; preverify_ok }
169
+ assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] , &blk ) )
170
+ assert_equal ( :block , called )
171
+ end
172
+
173
+ def test_verify_purpose
174
+ ca_exts = [
175
+ [ "basicConstraints" , "CA:TRUE" , true ] ,
176
+ [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
177
+ ]
178
+ ca1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Root CA" )
179
+ ca1_key = Fixtures . pkey ( "rsa-1" )
180
+ ca1_cert = issue_cert ( ca1 , ca1_key , 1 , ca_exts , nil , nil )
181
+
182
+ ee_exts = [
183
+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
184
+ ]
185
+ ee1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 1" )
186
+ ee1_key = Fixtures . pkey ( "rsa-3" )
187
+ ee1_cert = issue_cert ( ee1 , ee1_key , 10 , ee_exts , ca1_cert , ca1_key )
188
+
189
+ # Purpose not set
154
190
store = OpenSSL ::X509 ::Store . new
155
191
store . add_cert ( ca1_cert )
156
- store . add_cert ( ca2_cert )
157
- store . time = now + 1500
158
192
assert_equal ( true , store . verify ( ca1_cert ) )
159
- assert_equal ( true , store . verify ( ca2_cert ) )
160
- assert_equal ( true , store . verify ( ee4_cert ) )
161
- store . time = now + 1900
193
+ assert_equal ( true , store . verify ( ee1_cert ) )
194
+
195
+ # Purpose set to X509::PURPOSE_SSL_CLIENT; keyUsage is checked
196
+ store = OpenSSL ::X509 ::Store . new
197
+ store . purpose = OpenSSL ::X509 ::PURPOSE_CRL_SIGN
198
+ store . add_cert ( ca1_cert )
162
199
assert_equal ( true , store . verify ( ca1_cert ) )
163
- assert_equal ( false , store . verify ( ca2_cert ) )
164
- assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_HAS_EXPIRED , store . error )
165
- assert_equal ( false , store . verify ( ee4_cert ) )
166
- assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_HAS_EXPIRED , store . error )
167
- store . time = now + 4000
168
200
assert_equal ( false , store . verify ( ee1_cert ) )
169
- assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_HAS_EXPIRED , store . error )
170
- assert_equal ( false , store . verify ( ee4_cert ) )
171
- assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_HAS_EXPIRED , store . error )
201
+ end
202
+
203
+ def test_verify_validity_period
204
+ # Creating test certificates with validity periods:
205
+ #
206
+ # now-5000 now-1000 now+1000 now+5000
207
+ # CA1:|---------------------------------------------------------------|
208
+ # EE1:|---------------------------------------------------------------|
209
+ # EE2:|-------------------------|
210
+ # EE3: |-------------------------|
211
+ now = Time . now
212
+ ca_exts = [
213
+ [ "basicConstraints" , "CA:TRUE" , true ] ,
214
+ [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
215
+ ]
216
+ ca1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Root CA" )
217
+ ca1_key = Fixtures . pkey ( "rsa-1" )
218
+ ca1_cert = issue_cert ( ca1 , ca1_key , 1 , ca_exts , nil , nil ,
219
+ not_before : now - 5000 , not_after : now + 5000 )
220
+
221
+ ee_exts = [
222
+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
223
+ ]
224
+ ee1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 1" )
225
+ ee1_key = Fixtures . pkey ( "rsa-1" )
226
+ ee1_cert = issue_cert ( ee1 , ee1_key , 11 , ee_exts , ca1_cert , ca1_key ,
227
+ not_before : now - 5000 , not_after : now + 5000 )
228
+ ee2 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 2" )
229
+ ee2_key = Fixtures . pkey ( "rsa-2" )
230
+ ee2_cert = issue_cert ( ee2 , ee2_key , 12 , ee_exts , ca1_cert , ca1_key ,
231
+ not_before : now - 5000 , not_after : now - 1000 )
232
+ ee3 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 3" )
233
+ ee3_key = Fixtures . pkey ( "rsa-3" )
234
+ ee3_cert = issue_cert ( ee3 , ee3_key , 13 , ee_exts , ca1_cert , ca1_key ,
235
+ not_before : now + 1000 , not_after : now + 5000 )
172
236
173
- # the underlying X509 struct caches the result of the last
174
- # verification for signature and not-before. so the following code
175
- # rebuilds new objects to avoid site effect.
176
- store . time = Time . now - 4000
177
- assert_equal ( false , store . verify ( OpenSSL ::X509 ::Certificate . new ( ca2_cert ) ) )
237
+ # Using system time
238
+ store = OpenSSL ::X509 ::Store . new
239
+ store . add_cert ( ca1_cert )
240
+ assert_equal ( true , store . verify ( ee1_cert ) )
241
+ assert_equal ( false , store . verify ( ee2_cert ) )
242
+ assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_HAS_EXPIRED , store . error )
243
+ assert_equal ( false , store . verify ( ee3_cert ) )
178
244
assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_NOT_YET_VALID , store . error )
179
- assert_equal ( false , store . verify ( OpenSSL ::X509 ::Certificate . new ( ee1_cert ) ) )
245
+
246
+ # Time set to now-2000; EE2 is still valid
247
+ store = OpenSSL ::X509 ::Store . new
248
+ store . time = now - 2000
249
+ store . add_cert ( ca1_cert )
250
+ assert_equal ( true , store . verify ( ee1_cert ) )
251
+ assert_equal ( true , store . verify ( ee2_cert ) )
252
+ assert_equal ( false , store . verify ( ee3_cert ) )
180
253
assert_equal ( OpenSSL ::X509 ::V_ERR_CERT_NOT_YET_VALID , store . error )
254
+ end
181
255
256
+ def test_verify_with_crl
257
+ ca_exts = [
258
+ [ "basicConstraints" , "CA:TRUE" , true ] ,
259
+ [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
260
+ ]
261
+ ca1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Root CA" )
262
+ ca1_key = Fixtures . pkey ( "rsa-1" )
263
+ ca1_cert = issue_cert ( ca1 , ca1_key , 1 , ca_exts , nil , nil )
264
+ ca2 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=Intermediate CA" )
265
+ ca2_key = Fixtures . pkey ( "rsa-2" )
266
+ ca2_cert = issue_cert ( ca2 , ca2_key , 2 , ca_exts , ca1_cert , ca1_key )
267
+
268
+ ee_exts = [
269
+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
270
+ ]
271
+ ee1 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 1" )
272
+ ee1_key = Fixtures . pkey ( "rsa-3" )
273
+ ee1_cert = issue_cert ( ee1 , ee1_key , 10 , ee_exts , ca2_cert , ca2_key )
274
+ ee2 = OpenSSL ::X509 ::Name . parse_rfc2253 ( "CN=EE 2" )
275
+ ee2_key = Fixtures . pkey ( "rsa-3" )
276
+ ee2_cert = issue_cert ( ee2 , ee2_key , 20 , ee_exts , ca2_cert , ca2_key )
277
+
278
+ # OpenSSL uses time(2) while Time.now uses clock_gettime(CLOCK_REALTIME),
279
+ # and there may be difference, so giving 50 seconds margin.
280
+ now = Time . now - 50
281
+ revoke_info = [ ]
282
+ ca1_crl1 = issue_crl ( revoke_info , 1 , now , now +1800 , [ ] , ca1_cert , ca1_key , "sha256" )
283
+ revoke_info = [ [ 2 , now , 1 ] , ]
284
+ ca1_crl2 = issue_crl ( revoke_info , 2 , now , now +1800 , [ ] , ca1_cert , ca1_key , "sha256" )
285
+
286
+ revoke_info = [ [ 20 , now , 1 ] , ]
287
+ ca2_crl1 = issue_crl ( revoke_info , 1 , now , now +1800 , [ ] , ca2_cert , ca2_key , "sha256" )
288
+ revoke_info = [ ]
289
+ ca2_crl2 = issue_crl ( revoke_info , 2 , now -100 , now -1 , [ ] , ca2_cert , ca2_key , "sha256" )
290
+
291
+ # CRL check required, but no CRL supplied
292
+ store = OpenSSL ::X509 ::Store . new
293
+ store . flags = OpenSSL ::X509 ::V_FLAG_CRL_CHECK
294
+ store . add_cert ( ca1_cert )
295
+ assert_equal ( false , store . verify ( ca2_cert ) )
296
+ assert_equal ( OpenSSL ::X509 ::V_ERR_UNABLE_TO_GET_CRL , store . error )
297
+
298
+ # Intermediate CA revoked EE2
182
299
store = OpenSSL ::X509 ::Store . new
183
- store . purpose = OpenSSL ::X509 ::PURPOSE_ANY
184
300
store . flags = OpenSSL ::X509 ::V_FLAG_CRL_CHECK
185
301
store . add_cert ( ca1_cert )
186
- store . add_crl ( crl1 ) # revoke no cert
187
- store . add_crl ( crl2 ) # revoke ee2_cert
188
- assert_equal ( true , store . verify ( ca1_cert ) )
189
- assert_equal ( true , store . verify ( ca2_cert ) )
190
- assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] ) )
302
+ store . add_crl ( ca1_crl1 ) # revoke no cert
303
+ store . add_crl ( ca2_crl1 ) # revoke ee2_cert
304
+ assert_equal ( true , store . verify ( ca2_cert ) )
305
+ assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] ) )
191
306
assert_equal ( false , store . verify ( ee2_cert , [ ca2_cert ] ) )
192
307
308
+ # Root CA revoked Intermediate CA; Intermediate CA revoked EE2
193
309
store = OpenSSL ::X509 ::Store . new
194
- store . purpose = OpenSSL ::X509 ::PURPOSE_ANY
195
310
store . flags = OpenSSL ::X509 ::V_FLAG_CRL_CHECK
196
311
store . add_cert ( ca1_cert )
197
- store . add_crl ( crl1_2 ) # revoke ca2_cert
198
- store . add_crl ( crl2 ) # revoke ee2_cert
199
- assert_equal ( true , store . verify ( ca1_cert ) )
312
+ store . add_crl ( ca1_crl2 ) # revoke ca2_cert
313
+ store . add_crl ( ca2_crl1 ) # revoke ee2_cert
200
314
assert_equal ( false , store . verify ( ca2_cert ) )
201
- assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] ) ,
202
- "This test is expected to be success with OpenSSL 0.9.7c or later." )
315
+ # Validity of intermediate CAs is not checked by default
316
+ assert_equal ( true , store . verify ( ee1_cert , [ ca2_cert ] ) )
203
317
assert_equal ( false , store . verify ( ee2_cert , [ ca2_cert ] ) )
204
318
205
- store . flags =
206
- OpenSSL ::X509 ::V_FLAG_CRL_CHECK |OpenSSL ::X509 ::V_FLAG_CRL_CHECK_ALL
207
- assert_equal ( true , store . verify ( ca1_cert ) )
319
+ # Same as above, but with OpenSSL::X509::V_FLAG_CRL_CHECK_ALL
320
+ store = OpenSSL ::X509 ::Store . new
321
+ store . flags = OpenSSL ::X509 ::V_FLAG_CRL_CHECK |OpenSSL ::X509 ::V_FLAG_CRL_CHECK_ALL
322
+ store . add_cert ( ca1_cert )
323
+ store . add_crl ( ca1_crl2 ) # revoke ca2_cert
324
+ store . add_crl ( ca2_crl1 ) # revoke ee2_cert
208
325
assert_equal ( false , store . verify ( ca2_cert ) )
209
326
assert_equal ( false , store . verify ( ee1_cert , [ ca2_cert ] ) )
210
327
assert_equal ( false , store . verify ( ee2_cert , [ ca2_cert ] ) )
211
328
329
+ # Expired CRL supplied
212
330
store = OpenSSL ::X509 ::Store . new
213
- store . purpose = OpenSSL ::X509 ::PURPOSE_ANY
214
- store . flags =
215
- OpenSSL ::X509 ::V_FLAG_CRL_CHECK |OpenSSL ::X509 ::V_FLAG_CRL_CHECK_ALL
331
+ store . flags = OpenSSL ::X509 ::V_FLAG_CRL_CHECK |OpenSSL ::X509 ::V_FLAG_CRL_CHECK_ALL
216
332
store . add_cert ( ca1_cert )
217
333
store . add_cert ( ca2_cert )
218
- store . add_crl ( crl1 )
219
- store . add_crl ( crl2_2 ) # issued by ca2 but expired.
220
- assert_equal ( true , store . verify ( ca1_cert ) )
334
+ store . add_crl ( ca1_crl1 )
335
+ store . add_crl ( ca2_crl2 ) # issued by ca2 but expired
221
336
assert_equal ( true , store . verify ( ca2_cert ) )
222
337
assert_equal ( false , store . verify ( ee1_cert ) )
223
338
assert_equal ( OpenSSL ::X509 ::V_ERR_CRL_HAS_EXPIRED , store . error )
0 commit comments