2fb58f
diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
2fb58f
index fedcb93..53ad621 100644
2fb58f
--- a/ext/openssl/extconf.rb
2fb58f
+++ b/ext/openssl/extconf.rb
2fb58f
@@ -169,6 +169,7 @@ have_func("SSL_CTX_set_post_handshake_auth")
2fb58f
 
2fb58f
 # added in 1.1.1
2fb58f
 have_func("EVP_PKEY_check")
2fb58f
+have_func("SSL_CTX_set_ciphersuites")
2fb58f
 
2fb58f
 # added in 3.0.0
2fb58f
 have_func("SSL_set0_tmp_dh_pkey")
2fb58f
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
2fb58f
index 4b51268..2ab8aea 100644
2fb58f
--- a/ext/openssl/ossl.h
2fb58f
+++ b/ext/openssl/ossl.h
2fb58f
@@ -43,13 +43,13 @@
2fb58f
 #ifndef LIBRESSL_VERSION_NUMBER
2fb58f
 # define OSSL_IS_LIBRESSL 0
2fb58f
 # define OSSL_OPENSSL_PREREQ(maj, min, pat) \
2fb58f
-      (OPENSSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
2fb58f
+      (OPENSSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
2fb58f
 # define OSSL_LIBRESSL_PREREQ(maj, min, pat) 0
2fb58f
 #else
2fb58f
 # define OSSL_IS_LIBRESSL 1
2fb58f
 # define OSSL_OPENSSL_PREREQ(maj, min, pat) 0
2fb58f
 # define OSSL_LIBRESSL_PREREQ(maj, min, pat) \
2fb58f
-      (LIBRESSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
2fb58f
+      (LIBRESSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
2fb58f
 #endif
2fb58f
 
2fb58f
 #if !defined(OPENSSL_NO_ENGINE) && !OSSL_OPENSSL_PREREQ(3, 0, 0)
2fb58f
diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c
2fb58f
index a61d3ee..0d3fa9a 100644
2fb58f
--- a/ext/openssl/ossl_asn1.c
2fb58f
+++ b/ext/openssl/ossl_asn1.c
2fb58f
@@ -1522,7 +1522,7 @@ Init_ossl_asn1(void)
2fb58f
      *
2fb58f
      * An Array that stores the name of a given tag number. These names are
2fb58f
      * the same as the name of the tag constant that is additionally defined,
2fb58f
-     * e.g. +UNIVERSAL_TAG_NAME[2] = "INTEGER"+ and +OpenSSL::ASN1::INTEGER = 2+.
2fb58f
+     * e.g. <tt>UNIVERSAL_TAG_NAME[2] = "INTEGER"</tt> and <tt>OpenSSL::ASN1::INTEGER = 2</tt>.
2fb58f
      *
2fb58f
      * == Example usage
2fb58f
      *
2fb58f
diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c
2fb58f
index 2a4835a..24d0da4 100644
2fb58f
--- a/ext/openssl/ossl_pkey.c
2fb58f
+++ b/ext/openssl/ossl_pkey.c
2fb58f
@@ -670,7 +670,7 @@ ossl_pkey_export_traditional(int argc, VALUE *argv, VALUE self, int to_der)
2fb58f
 	}
2fb58f
     }
2fb58f
     else {
2fb58f
-#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
2fb58f
+#if OSSL_OPENSSL_PREREQ(1, 1, 0) || OSSL_LIBRESSL_PREREQ(3, 5, 0)
2fb58f
 	if (!PEM_write_bio_PrivateKey_traditional(bio, pkey, enc, NULL, 0,
2fb58f
 						  ossl_pem_passwd_cb,
2fb58f
 						  (void *)pass)) {
2fb58f
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
2fb58f
index 9a0682a..af262d9 100644
2fb58f
--- a/ext/openssl/ossl_ssl.c
2fb58f
+++ b/ext/openssl/ossl_ssl.c
2fb58f
@@ -959,27 +959,13 @@ ossl_sslctx_get_ciphers(VALUE self)
2fb58f
     return ary;
2fb58f
 }
2fb58f
 
2fb58f
-/*
2fb58f
- * call-seq:
2fb58f
- *    ctx.ciphers = "cipher1:cipher2:..."
2fb58f
- *    ctx.ciphers = [name, ...]
2fb58f
- *    ctx.ciphers = [[name, version, bits, alg_bits], ...]
2fb58f
- *
2fb58f
- * Sets the list of available cipher suites for this context.  Note in a server
2fb58f
- * context some ciphers require the appropriate certificates.  For example, an
2fb58f
- * RSA cipher suite can only be chosen when an RSA certificate is available.
2fb58f
- */
2fb58f
 static VALUE
2fb58f
-ossl_sslctx_set_ciphers(VALUE self, VALUE v)
2fb58f
+build_cipher_string(VALUE v)
2fb58f
 {
2fb58f
-    SSL_CTX *ctx;
2fb58f
     VALUE str, elem;
2fb58f
     int i;
2fb58f
 
2fb58f
-    rb_check_frozen(self);
2fb58f
-    if (NIL_P(v))
2fb58f
-	return v;
2fb58f
-    else if (RB_TYPE_P(v, T_ARRAY)) {
2fb58f
+    if (RB_TYPE_P(v, T_ARRAY)) {
2fb58f
         str = rb_str_new(0, 0);
2fb58f
         for (i = 0; i < RARRAY_LEN(v); i++) {
2fb58f
             elem = rb_ary_entry(v, i);
2fb58f
@@ -993,14 +979,67 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
2fb58f
         StringValue(str);
2fb58f
     }
2fb58f
 
2fb58f
+    return str;
2fb58f
+}
2fb58f
+
2fb58f
+/*
2fb58f
+ * call-seq:
2fb58f
+ *    ctx.ciphers = "cipher1:cipher2:..."
2fb58f
+ *    ctx.ciphers = [name, ...]
2fb58f
+ *    ctx.ciphers = [[name, version, bits, alg_bits], ...]
2fb58f
+ *
2fb58f
+ * Sets the list of available cipher suites for this context.  Note in a server
2fb58f
+ * context some ciphers require the appropriate certificates.  For example, an
2fb58f
+ * RSA cipher suite can only be chosen when an RSA certificate is available.
2fb58f
+ */
2fb58f
+static VALUE
2fb58f
+ossl_sslctx_set_ciphers(VALUE self, VALUE v)
2fb58f
+{
2fb58f
+    SSL_CTX *ctx;
2fb58f
+    VALUE str;
2fb58f
+
2fb58f
+    rb_check_frozen(self);
2fb58f
+    if (NIL_P(v))
2fb58f
+        return v;
2fb58f
+
2fb58f
+    str = build_cipher_string(v);
2fb58f
+
2fb58f
     GetSSLCTX(self, ctx);
2fb58f
-    if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str))) {
2fb58f
+    if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str)))
2fb58f
         ossl_raise(eSSLError, "SSL_CTX_set_cipher_list");
2fb58f
-    }
2fb58f
 
2fb58f
     return v;
2fb58f
 }
2fb58f
 
2fb58f
+#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
2fb58f
+/*
2fb58f
+ * call-seq:
2fb58f
+ *    ctx.ciphersuites = "cipher1:cipher2:..."
2fb58f
+ *    ctx.ciphersuites = [name, ...]
2fb58f
+ *    ctx.ciphersuites = [[name, version, bits, alg_bits], ...]
2fb58f
+ *
2fb58f
+ * Sets the list of available TLSv1.3 cipher suites for this context.
2fb58f
+ */
2fb58f
+static VALUE
2fb58f
+ossl_sslctx_set_ciphersuites(VALUE self, VALUE v)
2fb58f
+{
2fb58f
+    SSL_CTX *ctx;
2fb58f
+    VALUE str;
2fb58f
+
2fb58f
+    rb_check_frozen(self);
2fb58f
+    if (NIL_P(v))
2fb58f
+        return v;
2fb58f
+
2fb58f
+    str = build_cipher_string(v);
2fb58f
+
2fb58f
+    GetSSLCTX(self, ctx);
2fb58f
+    if (!SSL_CTX_set_ciphersuites(ctx, StringValueCStr(str)))
2fb58f
+        ossl_raise(eSSLError, "SSL_CTX_set_ciphersuites");
2fb58f
+
2fb58f
+    return v;
2fb58f
+}
2fb58f
+#endif
2fb58f
+
2fb58f
 #ifndef OPENSSL_NO_DH
2fb58f
 /*
2fb58f
  * call-seq:
2fb58f
@@ -2703,6 +2742,9 @@ Init_ossl_ssl(void)
2fb58f
 			     ossl_sslctx_set_minmax_proto_version, 2);
2fb58f
     rb_define_method(cSSLContext, "ciphers",     ossl_sslctx_get_ciphers, 0);
2fb58f
     rb_define_method(cSSLContext, "ciphers=",    ossl_sslctx_set_ciphers, 1);
2fb58f
+#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
2fb58f
+    rb_define_method(cSSLContext, "ciphersuites=", ossl_sslctx_set_ciphersuites, 1);
2fb58f
+#endif
2fb58f
 #ifndef OPENSSL_NO_DH
2fb58f
     rb_define_method(cSSLContext, "tmp_dh=", ossl_sslctx_set_tmp_dh, 1);
2fb58f
 #endif
2fb58f
diff --git a/test/openssl/test_asn1.rb b/test/openssl/test_asn1.rb
2fb58f
index 0fd7971..c79bc14 100644
2fb58f
--- a/test/openssl/test_asn1.rb
2fb58f
+++ b/test/openssl/test_asn1.rb
2fb58f
@@ -14,7 +14,7 @@ class  OpenSSL::TestASN1 < OpenSSL::TestCase
2fb58f
       ["keyUsage","keyCertSign, cRLSign",true],
2fb58f
       ["subjectKeyIdentifier","hash",false],
2fb58f
     ]
2fb58f
-    dgst = OpenSSL::Digest.new('SHA1')
2fb58f
+    dgst = OpenSSL::Digest.new('SHA256')
2fb58f
     cert = OpenSSL::TestUtils.issue_cert(
2fb58f
       subj, key, s, exts, nil, nil, digest: dgst, not_before: now, not_after: now+3600)
2fb58f
 
2fb58f
@@ -42,7 +42,7 @@ class  OpenSSL::TestASN1 < OpenSSL::TestCase
2fb58f
     assert_equal(OpenSSL::ASN1::Sequence, sig.class)
2fb58f
     assert_equal(2, sig.value.size)
2fb58f
     assert_equal(OpenSSL::ASN1::ObjectId, sig.value[0].class)
2fb58f
-    assert_equal("1.2.840.113549.1.1.5", sig.value[0].oid)
2fb58f
+    assert_equal("1.2.840.113549.1.1.11", sig.value[0].oid)
2fb58f
     assert_equal(OpenSSL::ASN1::Null, sig.value[1].class)
2fb58f
 
2fb58f
     dn = tbs_cert.value[3] # issuer
2fb58f
@@ -189,7 +189,7 @@ class  OpenSSL::TestASN1 < OpenSSL::TestCase
2fb58f
     assert_equal(OpenSSL::ASN1::Null, pkey.value[0].value[1].class)
2fb58f
 
2fb58f
     assert_equal(OpenSSL::ASN1::BitString, sig_val.class)
2fb58f
-    cululated_sig = key.sign(OpenSSL::Digest.new('SHA1'), tbs_cert.to_der)
2fb58f
+    cululated_sig = key.sign(OpenSSL::Digest.new('SHA256'), tbs_cert.to_der)
2fb58f
     assert_equal(cululated_sig, sig_val.value)
2fb58f
   end
2fb58f
 
2fb58f
diff --git a/test/openssl/test_ns_spki.rb b/test/openssl/test_ns_spki.rb
2fb58f
index ed3be86..383931b 100644
2fb58f
--- a/test/openssl/test_ns_spki.rb
2fb58f
+++ b/test/openssl/test_ns_spki.rb
2fb58f
@@ -22,7 +22,7 @@ class OpenSSL::TestNSSPI < OpenSSL::TestCase
2fb58f
     spki = OpenSSL::Netscape::SPKI.new
2fb58f
     spki.challenge = "RandomString"
2fb58f
     spki.public_key = key1.public_key
2fb58f
-    spki.sign(key1, OpenSSL::Digest.new('SHA1'))
2fb58f
+    spki.sign(key1, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert(spki.verify(spki.public_key))
2fb58f
     assert(spki.verify(key1.public_key))
2fb58f
     assert(!spki.verify(key2.public_key))
2fb58f
diff --git a/test/openssl/test_pkey_dsa.rb b/test/openssl/test_pkey_dsa.rb
2fb58f
index 726b7db..08213df 100644
2fb58f
--- a/test/openssl/test_pkey_dsa.rb
2fb58f
+++ b/test/openssl/test_pkey_dsa.rb
2fb58f
@@ -36,8 +36,8 @@ class OpenSSL::TestPKeyDSA < OpenSSL::PKeyTestCase
2fb58f
       assert_equal true, dsa512.verify(OpenSSL::Digest.new('DSS1'), signature, data)
2fb58f
     end
2fb58f
 
2fb58f
-    signature = dsa512.sign("SHA1", data)
2fb58f
-    assert_equal true, dsa512.verify("SHA1", signature, data)
2fb58f
+    signature = dsa512.sign("SHA256", data)
2fb58f
+    assert_equal true, dsa512.verify("SHA256", signature, data)
2fb58f
 
2fb58f
     signature0 = (<<~'end;').unpack("m")[0]
2fb58f
       MCwCFH5h40plgU5Fh0Z4wvEEpz0eE9SnAhRPbkRB8ggsN/vsSEYMXvJwjGg/
2fb58f
diff --git a/test/openssl/test_pkey_ec.rb b/test/openssl/test_pkey_ec.rb
2fb58f
index ffe5a94..c06fe6f 100644
2fb58f
--- a/test/openssl/test_pkey_ec.rb
2fb58f
+++ b/test/openssl/test_pkey_ec.rb
2fb58f
@@ -98,8 +98,8 @@ class OpenSSL::TestEC < OpenSSL::PKeyTestCase
2fb58f
   def test_sign_verify
2fb58f
     p256 = Fixtures.pkey("p256")
2fb58f
     data = "Sign me!"
2fb58f
-    signature = p256.sign("SHA1", data)
2fb58f
-    assert_equal true, p256.verify("SHA1", signature, data)
2fb58f
+    signature = p256.sign("SHA256", data)
2fb58f
+    assert_equal true, p256.verify("SHA256", signature, data)
2fb58f
 
2fb58f
     signature0 = (<<~'end;').unpack("m")[0]
2fb58f
       MEQCIEOTY/hD7eI8a0qlzxkIt8LLZ8uwiaSfVbjX2dPAvN11AiAQdCYx56Fq
2fb58f
diff --git a/test/openssl/test_pkey_rsa.rb b/test/openssl/test_pkey_rsa.rb
2fb58f
index 4bb39ed..9e06e43 100644
2fb58f
--- a/test/openssl/test_pkey_rsa.rb
2fb58f
+++ b/test/openssl/test_pkey_rsa.rb
2fb58f
@@ -80,8 +80,8 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
2fb58f
   def test_sign_verify
2fb58f
     rsa1024 = Fixtures.pkey("rsa1024")
2fb58f
     data = "Sign me!"
2fb58f
-    signature = rsa1024.sign("SHA1", data)
2fb58f
-    assert_equal true, rsa1024.verify("SHA1", signature, data)
2fb58f
+    signature = rsa1024.sign("SHA256", data)
2fb58f
+    assert_equal true, rsa1024.verify("SHA256", signature, data)
2fb58f
 
2fb58f
     signature0 = (<<~'end;').unpack("m")[0]
2fb58f
       oLCgbprPvfhM4pjFQiDTFeWI9Sk+Og7Nh9TmIZ/xSxf2CGXQrptlwo7NQ28+
2fb58f
@@ -113,10 +113,10 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
2fb58f
   def test_sign_verify_raw
2fb58f
     key = Fixtures.pkey("rsa-1")
2fb58f
     data = "Sign me!"
2fb58f
-    hash = OpenSSL::Digest.digest("SHA1", data)
2fb58f
-    signature = key.sign_raw("SHA1", hash)
2fb58f
-    assert_equal true, key.verify_raw("SHA1", signature, hash)
2fb58f
-    assert_equal true, key.verify("SHA1", signature, data)
2fb58f
+    hash = OpenSSL::Digest.digest("SHA256", data)
2fb58f
+    signature = key.sign_raw("SHA256", hash)
2fb58f
+    assert_equal true, key.verify_raw("SHA256", signature, hash)
2fb58f
+    assert_equal true, key.verify("SHA256", signature, data)
2fb58f
 
2fb58f
     # Too long data
2fb58f
     assert_raise(OpenSSL::PKey::PKeyError) {
2fb58f
@@ -129,9 +129,9 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
2fb58f
       "rsa_pss_saltlen" => 20,
2fb58f
       "rsa_mgf1_md" => "SHA256"
2fb58f
     }
2fb58f
-    sig_pss = key.sign_raw("SHA1", hash, pssopts)
2fb58f
-    assert_equal true, key.verify("SHA1", sig_pss, data, pssopts)
2fb58f
-    assert_equal true, key.verify_raw("SHA1", sig_pss, hash, pssopts)
2fb58f
+    sig_pss = key.sign_raw("SHA256", hash, pssopts)
2fb58f
+    assert_equal true, key.verify("SHA256", sig_pss, data, pssopts)
2fb58f
+    assert_equal true, key.verify_raw("SHA256", sig_pss, hash, pssopts)
2fb58f
   end
2fb58f
 
2fb58f
   def test_sign_verify_raw_legacy
2fb58f
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
2fb58f
index a7607da..3ba8b39 100644
2fb58f
--- a/test/openssl/test_ssl.rb
2fb58f
+++ b/test/openssl/test_ssl.rb
2fb58f
@@ -676,10 +676,16 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
2fb58f
     #     buzz.example.net, respectively).  ...
2fb58f
     assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
2fb58f
       create_cert_with_san('DNS:baz*.example.com'), 'baz1.example.com'))
2fb58f
+
2fb58f
+    # LibreSSL 3.5.0+ doesn't support other wildcard certificates
2fb58f
+    # (it isn't required to, as RFC states MAY, not MUST)
2fb58f
+    return if libressl?(3, 5, 0)
2fb58f
+
2fb58f
     assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
2fb58f
       create_cert_with_san('DNS:*baz.example.com'), 'foobaz.example.com'))
2fb58f
     assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
2fb58f
       create_cert_with_san('DNS:b*z.example.com'), 'buzz.example.com'))
2fb58f
+
2fb58f
     # Section 6.4.3 of RFC6125 states that client should NOT match identifier
2fb58f
     # where wildcard is other than left-most label.
2fb58f
     #
2fb58f
@@ -1563,6 +1569,99 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
2fb58f
     end
2fb58f
   end
2fb58f
 
2fb58f
+  def test_ciphersuites_method_tls_connection
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+    if !tls13_supported? || !ssl_ctx.respond_to?(:ciphersuites=)
2fb58f
+      pend 'TLS 1.3 not supported'
2fb58f
+    end
2fb58f
+
2fb58f
+    csuite = ['TLS_AES_128_GCM_SHA256', 'TLSv1.3', 128, 128]
2fb58f
+    inputs = [csuite[0], [csuite[0]], [csuite]]
2fb58f
+
2fb58f
+    start_server do |port|
2fb58f
+      inputs.each do |input|
2fb58f
+        cli_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+        cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_3_VERSION
2fb58f
+        cli_ctx.ciphersuites = input
2fb58f
+
2fb58f
+        server_connect(port, cli_ctx) do |ssl|
2fb58f
+          assert_equal('TLSv1.3', ssl.ssl_version)
2fb58f
+          if libressl?(3, 4, 0) && !libressl?(3, 5, 0)
2fb58f
+            assert_equal("AEAD-AES128-GCM-SHA256", ssl.cipher[0]) 
2fb58f
+          else
2fb58f
+            assert_equal(csuite[0], ssl.cipher[0]) 
2fb58f
+          end
2fb58f
+          ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
2fb58f
+        end
2fb58f
+      end
2fb58f
+    end
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphersuites_method_nil_argument
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+    pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
2fb58f
+
2fb58f
+    assert_nothing_raised { ssl_ctx.ciphersuites = nil }
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphersuites_method_frozen_object
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+    pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
2fb58f
+
2fb58f
+    ssl_ctx.freeze
2fb58f
+    assert_raise(FrozenError) { ssl_ctx.ciphersuites = 'TLS_AES_256_GCM_SHA384' }
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphersuites_method_bogus_csuite
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+    pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
2fb58f
+
2fb58f
+    assert_raise_with_message(
2fb58f
+      OpenSSL::SSL::SSLError,
2fb58f
+      /SSL_CTX_set_ciphersuites: no cipher match/i
2fb58f
+    ) { ssl_ctx.ciphersuites = 'BOGUS' }
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphers_method_tls_connection
2fb58f
+    csuite = ['ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1.2', 256, 256]
2fb58f
+    inputs = [csuite[0], [csuite[0]], [csuite]]
2fb58f
+
2fb58f
+    start_server do |port|
2fb58f
+      inputs.each do |input|
2fb58f
+        cli_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+        cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
2fb58f
+        cli_ctx.ciphers = input
2fb58f
+
2fb58f
+        server_connect(port, cli_ctx) do |ssl|
2fb58f
+          assert_equal('TLSv1.2', ssl.ssl_version)
2fb58f
+          assert_equal(csuite[0], ssl.cipher[0])
2fb58f
+          ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
2fb58f
+        end
2fb58f
+      end
2fb58f
+    end
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphers_method_nil_argument
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+    assert_nothing_raised { ssl_ctx.ciphers = nil }
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphers_method_frozen_object
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+
2fb58f
+    ssl_ctx.freeze
2fb58f
+    assert_raise(FrozenError) { ssl_ctx.ciphers = 'ECDHE-RSA-AES128-SHA' }
2fb58f
+  end
2fb58f
+
2fb58f
+  def test_ciphers_method_bogus_csuite
2fb58f
+    ssl_ctx = OpenSSL::SSL::SSLContext.new
2fb58f
+
2fb58f
+    assert_raise_with_message(
2fb58f
+      OpenSSL::SSL::SSLError,
2fb58f
+      /SSL_CTX_set_cipher_list: no cipher match/i
2fb58f
+    ) { ssl_ctx.ciphers = 'BOGUS' }
2fb58f
+  end
2fb58f
+
2fb58f
   def test_connect_works_when_setting_dh_callback_to_nil
2fb58f
     ctx_proc = -> ctx {
2fb58f
       ctx.max_version = :TLS1_2
2fb58f
diff --git a/test/openssl/test_x509cert.rb b/test/openssl/test_x509cert.rb
2fb58f
index d696b98..4e2bd0c 100644
2fb58f
--- a/test/openssl/test_x509cert.rb
2fb58f
+++ b/test/openssl/test_x509cert.rb
2fb58f
@@ -180,6 +180,7 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
2fb58f
     assert_equal(false, certificate_error_returns_false { cert.verify(@dsa512) })
2fb58f
     cert.serial = 2
2fb58f
     assert_equal(false, cert.verify(@rsa2048))
2fb58f
+  rescue OpenSSL::X509::CertificateError # RHEL 9 disables SHA1
2fb58f
   end
2fb58f
 
2fb58f
   def test_sign_and_verify_rsa_md5
2fb58f
@@ -226,9 +227,8 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
2fb58f
     assert_equal("dsa_with_SHA256", cert.signature_algorithm)
2fb58f
     # TODO: need more tests for dsa + sha2
2fb58f
 
2fb58f
-    # SHA1 is allowed from OpenSSL 1.0.0 (0.9.8 requires DSS1)
2fb58f
-    cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha1")
2fb58f
-    assert_equal("dsaWithSHA1", cert.signature_algorithm)
2fb58f
+    cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha512")
2fb58f
+    assert_equal("dsa_with_SHA512", cert.signature_algorithm)
2fb58f
   end
2fb58f
 
2fb58f
   def test_check_private_key
2fb58f
diff --git a/test/openssl/test_x509crl.rb b/test/openssl/test_x509crl.rb
2fb58f
index bcdb0a6..146ee07 100644
2fb58f
--- a/test/openssl/test_x509crl.rb
2fb58f
+++ b/test/openssl/test_x509crl.rb
2fb58f
@@ -20,7 +20,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
 
2fb58f
     cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
2fb58f
     crl = issue_crl([], 1, now, now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(1, crl.version)
2fb58f
     assert_equal(cert.issuer.to_der, crl.issuer.to_der)
2fb58f
     assert_equal(now, crl.last_update)
2fb58f
@@ -57,7 +57,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
     ]
2fb58f
     cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
2fb58f
     crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     revoked = crl.revoked
2fb58f
     assert_equal(5, revoked.size)
2fb58f
     assert_equal(1, revoked[0].serial)
2fb58f
@@ -98,7 +98,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
 
2fb58f
     revoke_info = (1..1000).collect{|i| [i, now, 0] }
2fb58f
     crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     revoked = crl.revoked
2fb58f
     assert_equal(1000, revoked.size)
2fb58f
     assert_equal(1, revoked[0].serial)
2fb58f
@@ -124,7 +124,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
 
2fb58f
     cert = issue_cert(@ca, @rsa2048, 1, cert_exts, nil, nil)
2fb58f
     crl = issue_crl([], 1, Time.now, Time.now+1600, crl_exts,
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     exts = crl.extensions
2fb58f
     assert_equal(3, exts.size)
2fb58f
     assert_equal("1", exts[0].value)
2fb58f
@@ -160,24 +160,24 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
     assert_equal(false, exts[2].critical?)
2fb58f
 
2fb58f
     no_ext_crl = issue_crl([], 1, Time.now, Time.now+1600, [],
2fb58f
-      cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+      cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal nil, no_ext_crl.authority_key_identifier
2fb58f
   end
2fb58f
 
2fb58f
   def test_crlnumber
2fb58f
     cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
2fb58f
     crl = issue_crl([], 1, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_match(1.to_s, crl.extensions[0].value)
2fb58f
     assert_match(/X509v3 CRL Number:\s+#{1}/m, crl.to_text)
2fb58f
 
2fb58f
     crl = issue_crl([], 2**32, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_match((2**32).to_s, crl.extensions[0].value)
2fb58f
     assert_match(/X509v3 CRL Number:\s+#{2**32}/m, crl.to_text)
2fb58f
 
2fb58f
     crl = issue_crl([], 2**100, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_match(/X509v3 CRL Number:\s+#{2**100}/m, crl.to_text)
2fb58f
     assert_match((2**100).to_s, crl.extensions[0].value)
2fb58f
   end
2fb58f
@@ -185,7 +185,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
   def test_sign_and_verify
2fb58f
     cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
2fb58f
     crl = issue_crl([], 1, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(false, crl.verify(@rsa1024))
2fb58f
     assert_equal(true,  crl.verify(@rsa2048))
2fb58f
     assert_equal(false, crl_error_returns_false { crl.verify(@dsa256) })
2fb58f
@@ -195,7 +195,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
2fb58f
 
2fb58f
     cert = issue_cert(@ca, @dsa512, 1, [], nil, nil)
2fb58f
     crl = issue_crl([], 1, Time.now, Time.now+1600, [],
2fb58f
-                    cert, @dsa512, OpenSSL::Digest.new('SHA1'))
2fb58f
+                    cert, @dsa512, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(false, crl_error_returns_false { crl.verify(@rsa1024) })
2fb58f
     assert_equal(false, crl_error_returns_false { crl.verify(@rsa2048) })
2fb58f
     assert_equal(false, crl.verify(@dsa256))
2fb58f
diff --git a/test/openssl/test_x509req.rb b/test/openssl/test_x509req.rb
2fb58f
index ee9c678..a84b162 100644
2fb58f
--- a/test/openssl/test_x509req.rb
2fb58f
+++ b/test/openssl/test_x509req.rb
2fb58f
@@ -23,31 +23,31 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
2fb58f
   end
2fb58f
 
2fb58f
   def test_public_key
2fb58f
-    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
2fb58f
     req = OpenSSL::X509::Request.new(req.to_der)
2fb58f
     assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
2fb58f
 
2fb58f
-    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
2fb58f
     req = OpenSSL::X509::Request.new(req.to_der)
2fb58f
     assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
2fb58f
   end
2fb58f
 
2fb58f
   def test_version
2fb58f
-    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(0, req.version)
2fb58f
     req = OpenSSL::X509::Request.new(req.to_der)
2fb58f
     assert_equal(0, req.version)
2fb58f
 
2fb58f
-    req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(1, req.version)
2fb58f
     req = OpenSSL::X509::Request.new(req.to_der)
2fb58f
     assert_equal(1, req.version)
2fb58f
   end
2fb58f
 
2fb58f
   def test_subject
2fb58f
-    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(@dn.to_der, req.subject.to_der)
2fb58f
     req = OpenSSL::X509::Request.new(req.to_der)
2fb58f
     assert_equal(@dn.to_der, req.subject.to_der)
2fb58f
@@ -78,9 +78,9 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
2fb58f
       OpenSSL::X509::Attribute.new("msExtReq", attrval),
2fb58f
     ]
2fb58f
 
2fb58f
-    req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     attrs.each{|attr| req0.add_attribute(attr) }
2fb58f
-    req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     req1.attributes = attrs
2fb58f
     assert_equal(req0.to_der, req1.to_der)
2fb58f
 
2fb58f
@@ -101,7 +101,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
2fb58f
   end
2fb58f
 
2fb58f
   def test_sign_and_verify_rsa_sha1
2fb58f
-    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(true,  req.verify(@rsa1024))
2fb58f
     assert_equal(false, req.verify(@rsa2048))
2fb58f
     assert_equal(false, request_error_returns_false { req.verify(@dsa256) })
2fb58f
@@ -122,7 +122,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
2fb58f
   end
2fb58f
 
2fb58f
   def test_sign_and_verify_dsa
2fb58f
-    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(false, request_error_returns_false { req.verify(@rsa1024) })
2fb58f
     assert_equal(false, request_error_returns_false { req.verify(@rsa2048) })
2fb58f
     assert_equal(false, req.verify(@dsa256))
2fb58f
@@ -137,13 +137,13 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
2fb58f
   end
2fb58f
 
2fb58f
   def test_dup
2fb58f
-    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
2fb58f
+    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
2fb58f
     assert_equal(req.to_der, req.dup.to_der)
2fb58f
   end
2fb58f
 
2fb58f
   def test_eq
2fb58f
-    req1 = issue_csr(0, @dn, @rsa1024, "sha1")
2fb58f
-    req2 = issue_csr(0, @dn, @rsa1024, "sha1")
2fb58f
+    req1 = issue_csr(0, @dn, @rsa1024, "sha512")
2fb58f
+    req2 = issue_csr(0, @dn, @rsa1024, "sha512")
2fb58f
     req3 = issue_csr(0, @dn, @rsa1024, "sha256")
2fb58f
 
2fb58f
     assert_equal false, req1 == 12345