@@ -378,4 +378,68 @@ def test_verify
378378 assert_equal ( false , store . verify ( ee2_cert ) )
379379 end
380380
381+ def test_verify_same_subject_ca
382+
383+ puts JOpenSSL ::VERSION if defined? JRUBY_VERSION
384+
385+ @rsa1 = OpenSSL ::PKey ::RSA . generate 2048
386+ @rsa2 = OpenSSL ::PKey ::RSA . generate 2048
387+ @rsa3 = OpenSSL ::PKey ::RSA . generate 2048
388+ @rsa4 = OpenSSL ::PKey ::RSA . generate 2048
389+ @dsa1 = OpenSSL ::PKey ::DSA . generate 512
390+ @dsa2 = OpenSSL ::PKey ::DSA . generate 512
391+ @ca_same = OpenSSL ::X509 ::Name . parse ( "/DC=com/DC=same-name/CN=CA" )
392+ @ca_other = OpenSSL ::X509 ::Name . parse ( "/DC=co/DC=anotherOne/CN=CA" )
393+ @ee1 = OpenSSL ::X509 ::Name . parse ( "/DC=com/DC=example/CN=ServerCert1" )
394+ @ee2 = OpenSSL ::X509 ::Name . parse ( "/DC=com/DC=example/CN=ServerCert2" )
395+ @ee4 = OpenSSL ::X509 ::Name . parse ( "/DC=com/DC=example/CN=ServerCert4" )
396+
397+ now = Time . at ( Time . now . to_i )
398+ not_before = now - 365 * 24 * 60 * 60
399+ not_after = now + 24 * 60 * 60
400+ ca_exts1 = [
401+ [ "basicConstraints" , "CA:TRUE" , true ] ,
402+ [ "keyUsage" , "cRLSign,keyCertSign" , true ] ,
403+ ]
404+ ca_exts2 = [
405+ [ "basicConstraints" , "CA:TRUE" , true ] ,
406+ [ "keyUsage" , "keyCertSign" , true ] ,
407+ ]
408+ ee_exts = [
409+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
410+ ]
411+ ca1_cert = issue_cert ( @ca_same , @rsa1 , 1 , not_before , now - 60 * 60 , ca_exts1 ,
412+ nil , nil , OpenSSL ::Digest ::SHA1 . new )
413+ ca2_cert = issue_cert ( @ca_same , @rsa2 , 2 , not_before , not_after , ca_exts2 ,
414+ nil , nil , OpenSSL ::Digest ::SHA1 . new )
415+ ca3_cert = issue_cert ( @ca_other , @rsa3 , 3 , not_before , not_after , ca_exts1 ,
416+ nil , nil , OpenSSL ::Digest ::SHA1 . new )
417+ ca4_cert = issue_cert ( @ca_same , @rsa4 , 4 , not_before , not_after , ca_exts1 ,
418+ nil , nil , OpenSSL ::Digest ::SHA1 . new )
419+ ee1_cert = issue_cert ( @ee1 , @dsa1 , 10 , now - 60 , now + 1800 , ee_exts ,
420+ ca1_cert , @rsa1 , OpenSSL ::Digest ::SHA1 . new )
421+ ee2_cert = issue_cert ( @ee2 , @dsa2 , 20 , now - 60 , now + 1800 , ee_exts ,
422+ ca2_cert , @rsa2 , OpenSSL ::Digest ::SHA1 . new )
423+ ee4_cert = issue_cert ( @ee4 , @dsa2 , 20 , now - 60 , now + 1800 , ee_exts ,
424+ ca4_cert , @rsa4 , OpenSSL ::Digest ::SHA1 . new )
425+
426+ cert_store = OpenSSL ::X509 ::Store . new
427+ cert_store . add_cert ca1_cert
428+ cert_store . add_cert ca2_cert
429+ cert_store . add_cert ca3_cert
430+ cert_store . add_cert ca4_cert
431+
432+ ok = cert_store . verify ( ee1_cert )
433+ assert_equal 'certificate signature failure' , cert_store . error_string
434+ assert_equal false , ok
435+
436+ ok = cert_store . verify ( ee2_cert )
437+ assert_equal 'ok' , cert_store . error_string
438+ assert_equal true , ok
439+
440+ ok = cert_store . verify ( ee4_cert )
441+ assert_equal 'certificate signature failure' , cert_store . error_string
442+ assert_equal false , ok # OpenSSL 1.1.1 behavior
443+ end
444+
381445end
0 commit comments