Bug#1109424: unblock: puma/6.6.0-4
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: puma@packages.debian.org, athoscribeiro@gmail.com
Control: affects -1 + src:puma
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package puma
[ Reason ]
This includes a different fix for #1078640, without adding Java as a
build dependency.
[ Impact ]
puma will include a new build dependency on Java.
[ Tests ]
Regular builds and autopkgtests should run the upstream unit tests and
these should pass. I also checked the validity of the new certificates
to ensure they are valid for the trixie support period.
[ Risks ]
The fix changes example files used for unit testing purposes and reverts
a recent change which added Java as a build dependency to generate the
example certificates in build time. Any regressions would likely be seen
as FTBFS issues.
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in testing
unblock puma/6.6.0-4
diff -Nru puma-6.6.0/debian/changelog puma-6.6.0/debian/changelog
--- puma-6.6.0/debian/changelog 2025-07-16 16:51:16.000000000 -0300
+++ puma-6.6.0/debian/changelog 2025-07-17 07:20:19.000000000 -0300
@@ -1,3 +1,16 @@
+puma (6.6.0-4) unstable; urgency=medium
+
+ * Team upload.
+ * Do not generate example certificates in build time to avoid build
+ depending on Java
+ * d/p/0019-adapt-test-certs-generation.patch: adjust example certificates
+ generation script
+ * d/p/0020-update-ex-certs.patch: update example certificates to avoid a
+ regression for #1078640
+ * debian/README.source: document test certificates generation
+
+ -- Athos Ribeiro <athos@debian.org> Thu, 17 Jul 2025 07:20:19 -0300
+
puma (6.6.0-3) unstable; urgency=medium
* Team upload.
diff -Nru puma-6.6.0/debian/control puma-6.6.0/debian/control
--- puma-6.6.0/debian/control 2025-07-16 16:51:16.000000000 -0300
+++ puma-6.6.0/debian/control 2025-07-17 07:20:19.000000000 -0300
@@ -16,10 +16,7 @@
ruby-nio4r (>= 2),
ruby-rack,
ruby-rackup | ruby-rack (<< 3),
- ruby-sd-notify,
- default-jre-headless <!nocheck>,
- openssl <!nocheck>,
- ruby-certificate-authority <!nocheck>,
+ ruby-sd-notify
Standards-Version: 4.7.0
Vcs-Git: https://salsa.debian.org/ruby-team/puma.git
Vcs-Browser: https://salsa.debian.org/ruby-team/puma
diff -Nru puma-6.6.0/debian/.gitattributes puma-6.6.0/debian/.gitattributes
--- puma-6.6.0/debian/.gitattributes 2025-07-16 16:51:16.000000000 -0300
+++ puma-6.6.0/debian/.gitattributes 1969-12-31 21:00:00.000000000 -0300
@@ -1,4 +0,0 @@
-.gitattributes export-ignore
-gbp.conf export-ignore
-salsa-ci.yml export-ignore
-kali-ci.yml export-ignore
diff -Nru puma-6.6.0/debian/patches/0019-adapt-test-certs-generation.patch puma-6.6.0/debian/patches/0019-adapt-test-certs-generation.patch
--- puma-6.6.0/debian/patches/0019-adapt-test-certs-generation.patch 1969-12-31 21:00:00.000000000 -0300
+++ puma-6.6.0/debian/patches/0019-adapt-test-certs-generation.patch 2025-07-17 07:20:19.000000000 -0300
@@ -0,0 +1,80 @@
+From: Athos Ribeiro <athos@debian.org>
+Date: Thu, 17 Jul 2025 06:35:51 -0300
+Subject: Adapt test certificates generation
+
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
+Forwarded: not-needed
+Last-Update: 2025-07-15
+
+Adapt the test certificates generation process to Debian. For that, we extend
+the validity of the certificates to 11 years to try to cover the Debian support
+(and hopefully the LTS/eLTS) window as long as a build is performed 1 year
+before a release. We also require certificate_authority from the installed
+package so we can generate this certificates without external packages.
+Last-Update: 2025-07-15
+---
+ examples/generate_chain_test.rb | 9 ++++-----
+ examples/generate_client_test.rb | 2 +-
+ examples/generate_server_test.rb | 2 +-
+ 3 files changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/examples/generate_chain_test.rb b/examples/generate_chain_test.rb
+index 2676760..d84c7ae 100644
+--- a/examples/generate_chain_test.rb
++++ b/examples/generate_chain_test.rb
+@@ -11,10 +11,7 @@ certs before date will be the first of the current month
+ =end
+
+ require 'bundler/inline'
+-gemfile(true) do
+- source 'https://rubygems.org'
+- gem 'certificate_authority'
+-end
++require 'certificate_authority'
+
+ module GenerateChainCerts
+
+@@ -39,7 +36,7 @@ module GenerateChainCerts
+
+ {
+ not_before: Time.new(yr, mo, 1, 0, 0, 0, zone),
+- not_after: Time.new(yr+4, mo, 1, 0, 0, 0, zone)
++ not_after: Time.new(yr+11, mo, 1, 0, 0, 0, zone)
+ }
+ )
+ end
+@@ -83,6 +80,8 @@ module GenerateChainCerts
+ cert.subject.common_name = common_name
+ cert.serial_number.number = parent.serial_number.number + 100
+ cert.parent = parent
++ cert.not_before = before_after[:not_before]
++ cert.not_after = before_after[:not_after]
+
+ cert.key_material.generate_key
+ cert.sign!
+diff --git a/examples/generate_client_test.rb b/examples/generate_client_test.rb
+index f875916..e197428 100644
+--- a/examples/generate_client_test.rb
++++ b/examples/generate_client_test.rb
+@@ -107,7 +107,7 @@ module GenerateClientCerts
+ zone = '+00:00'
+
+ @before = Time.new yr , mo, 1, 0, 0, 0, zone
+- @after = Time.new yr+4, mo, 1, 0, 0, 0, zone
++ @after = Time.new yr+11, mo, 1, 0, 0, 0, zone
+
+ @b_exp = Time.new yr-1, mo, 1, 0, 0, 0, zone
+ @a_exp = Time.new yr , mo, 1, 0, 0, 0, zone
+diff --git a/examples/generate_server_test.rb b/examples/generate_server_test.rb
+index cf9364a..f73e660 100644
+--- a/examples/generate_server_test.rb
++++ b/examples/generate_server_test.rb
+@@ -33,7 +33,7 @@ module GenerateServerCerts
+ zone = '+00:00'
+
+ cert.not_before = Time.new yr , mo, 1, 0, 0, 0, zone
+- cert.not_after = Time.new yr+4, mo, 1, 0, 0, 0, zone
++ cert.not_after = Time.new yr+11, mo, 1, 0, 0, 0, zone
+ cert.public_key = key.public_key
+ cert.sign ca_key, SIGN_ALGORITHM.new
+ puts "New:", cert.to_text, ""
diff -Nru puma-6.6.0/debian/patches/0019-do-not-download-ca-gem.patch puma-6.6.0/debian/patches/0019-do-not-download-ca-gem.patch
--- puma-6.6.0/debian/patches/0019-do-not-download-ca-gem.patch 2025-07-16 16:51:16.000000000 -0300
+++ puma-6.6.0/debian/patches/0019-do-not-download-ca-gem.patch 1969-12-31 21:00:00.000000000 -0300
@@ -1,24 +0,0 @@
-From: =?utf-8?q?Timo_R=C3=B6hling?= <roehling@debian.org>
-Date: Wed, 16 Jul 2025 18:35:43 +0200
-Subject: Do not download certificate_authority gem
-
----
- examples/generate_chain_test.rb | 5 +----
- 1 file changed, 1 insertion(+), 4 deletions(-)
-
-diff --git a/examples/generate_chain_test.rb b/examples/generate_chain_test.rb
-index 2676760..dbe89ab 100644
---- a/examples/generate_chain_test.rb
-+++ b/examples/generate_chain_test.rb
-@@ -11,10 +11,7 @@ certs before date will be the first of the current month
- =end
-
- require 'bundler/inline'
--gemfile(true) do
-- source 'https://rubygems.org'
-- gem 'certificate_authority'
--end
-+require 'certificate_authority'
-
- module GenerateChainCerts
-
diff -Nru puma-6.6.0/debian/patches/0020-update-ex-certs.patch puma-6.6.0/debian/patches/0020-update-ex-certs.patch
--- puma-6.6.0/debian/patches/0020-update-ex-certs.patch 1969-12-31 21:00:00.000000000 -0300
+++ puma-6.6.0/debian/patches/0020-update-ex-certs.patch 2025-07-17 07:20:19.000000000 -0300
@@ -0,0 +1,1499 @@
+From: Athos Ribeiro <athos.ribeiro@canonical.com>
+Date: Tue, 15 Jul 2025 10:38:43 -0300
+Subject: Update example certificates
+
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
+Forwarded: not-needed
+Last-Update: 2025-07-15
+
+Update the example certificates so that the upstream unit tests keep
+passing throughout the next Debian release (trixie) support cycle. This
+is done by updating the certificates validity to 11 years (possibly
+covering LTS/eLTS).
+Last-Update: 2025-07-15
+---
+ examples/puma/cert_puma.pem | 30 ++++----
+ examples/puma/chain_cert/ca.crt | 33 ++++----
+ examples/puma/chain_cert/ca.key | 50 ++++++------
+ examples/puma/chain_cert/ca_chain.pem | 65 ++++++++--------
+ examples/puma/chain_cert/cert.crt | 32 ++++----
+ examples/puma/chain_cert/cert.key | 50 ++++++------
+ examples/puma/chain_cert/cert_chain.pem | 97 ++++++++++++------------
+ examples/puma/chain_cert/intermediate.crt | 32 ++++----
+ examples/puma/chain_cert/intermediate.key | 50 ++++++------
+ examples/puma/client_certs/ca.crt | 28 +++----
+ examples/puma/client_certs/ca.key | 50 ++++++------
+ examples/puma/client_certs/ca_store.jks | Bin 848 -> 848 bytes
+ examples/puma/client_certs/ca_store.p12 | Bin 2568 -> 2584 bytes
+ examples/puma/client_certs/client.crt | 30 ++++----
+ examples/puma/client_certs/client.key | 50 ++++++------
+ examples/puma/client_certs/client_expired.crt | 30 ++++----
+ examples/puma/client_certs/client_expired.key | 50 ++++++------
+ examples/puma/client_certs/client_unknown.crt | 30 ++++----
+ examples/puma/client_certs/client_unknown.key | 50 ++++++------
+ examples/puma/client_certs/keystore.jks | Bin 4392 -> 4392 bytes
+ examples/puma/client_certs/server.crt | 30 ++++----
+ examples/puma/client_certs/server.key | 50 ++++++------
+ examples/puma/client_certs/server.p12 | Bin 3408 -> 3424 bytes
+ examples/puma/client_certs/unknown_ca.crt | 28 +++----
+ examples/puma/client_certs/unknown_ca.key | 50 ++++++------
+ examples/puma/client_certs/unknown_ca_store.p12 | Bin 2592 -> 2608 bytes
+ examples/puma/encrypted_puma_keypair.pem | 56 +++++++-------
+ examples/puma/keystore.jks | Bin 2253 -> 2252 bytes
+ examples/puma/puma_keypair.pem | 50 ++++++------
+ examples/puma/server.p12 | Bin 2700 -> 2716 bytes
+ 30 files changed, 509 insertions(+), 512 deletions(-)
+
+diff --git a/examples/puma/cert_puma.pem b/examples/puma/cert_puma.pem
+index 6cbb9c1..cace838 100644
+--- a/examples/puma/cert_puma.pem
++++ b/examples/puma/cert_puma.pem
+@@ -1,21 +1,21 @@
+ -----BEGIN CERTIFICATE-----
+ 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
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/ca.crt b/examples/puma/chain_cert/ca.crt
+index 9acfe79..bcc8e26 100644
+--- a/examples/puma/chain_cert/ca.crt
++++ b/examples/puma/chain_cert/ca.crt
+@@ -1,20 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
+-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
+-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
+-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
+-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
+-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
+-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
+-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
+-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
+-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
+-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
+-8uByucqDNovFjYNMKw==
++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/ca.key b/examples/puma/chain_cert/ca.key
+index c884487..8de2968 100644
+--- a/examples/puma/chain_cert/ca.key
++++ b/examples/puma/chain_cert/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/chain_cert/ca_chain.pem b/examples/puma/chain_cert/ca_chain.pem
+index 7d500ef..7196332 100644
+--- a/examples/puma/chain_cert/ca_chain.pem
++++ b/examples/puma/chain_cert/ca_chain.pem
+@@ -1,40 +1,39 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
+-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
+-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
+-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
+-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
+-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
+-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
+-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
+-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
+-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
+-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
+-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
+-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
+-iX6YKGNd
++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
++05PKNc+5
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
+-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
+-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
+-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
+-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
+-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
+-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
+-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
+-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
+-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
+-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
+-8uByucqDNovFjYNMKw==
++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.crt b/examples/puma/chain_cert/cert.crt
+index 8467b47..89010e8 100644
+--- a/examples/puma/chain_cert/cert.crt
++++ b/examples/puma/chain_cert/cert.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjUwNzAxMDAwMDAwWhcNMzYwNzAx
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkH1hQqC0EFwYxi5+Ihqat9Yqebpk0A9x
+-ZzdO68eBSw4glnhh/+8VNB238q3nVD+0oL5oOBFVPAA34jUrrngS3LSl7tx4y1tj
+-jqn2LwKkdjAaaQn7uNKf/Ow6JX8dsaFpEUmabOzQBbhQtUDdbHmX1jgJYy8siSdU
+-ExXtNHAA+kqlif0Hcj1Xx8dlXQlLiDgdO1I5h84rjfdX+TUGwnJO5MkIZ5X5r6tE
+-hk8s/2dvbrU2AKcP+pTY4jw/fyDNd9q8OdW186RlBdS+uyX3D2hh+8aVLONQIJOx
+-wRyQaImYzHPWMDO6MuQ5/5LAxFFYWCGSLvUTdrillB0Snmppe9uGhwIDAQABo28w
+-bTAdBgNVHQ4EFgQUQT/iPOTx/zDEIgWHiraGJdrud74wCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU1V8CDxIv
+-GpM3njBhaJZ/FWJz6IcwDQYJKoZIhvcNAQENBQADggEBADHQ75un1UtxDI9oluXu
+-wEJL0515nIAKjaWFCl0Z/CGaAWkkJERk0JBxTe9J/MrYY68NYCCAusRoUoRbvcA2
+-GQ8vKae5V6/md+npZpKQznmUk+nZMzNKr+QoMY/nvtLA5tZ85fsU40H4nbvb23EY
+-3o6IiEbLD0G3FbIFtkgQ7+j9w6bvvMwd+3Ed0jSjRl4wKi4cXgD1UIyce/MVzAzT
+-bXW2SLWjfRzcTsrAnrbno5S3g+KMD1w9zGNppYiFH0zydpatKjJW18r/6XgJqoim
+-Rl5OGVnMNgIAw+S8/G3+/IIPXWHFE29R3j3oXjm/F8570TpQTYyx8wOmEr+zJPv0
+-8gU=
++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnweGJw3HXhvtIAFL6i3hzFdD5F3UG2Nm
++hIGaiKyDy71b25rkXFduG8R9i4s5rVBUdafA2OlrRDWMMrlYSudJnlB6P2jtBRxB
++7iw66vBVCBstDiKEr5xWFceG+2WpHU1peLCj72Ujuy/Xc/85S+70a9ISXItDRuyY
++tNTLi1HROioH6A0MfpvoLKxHYyoJ1dxu/eXikY8uk+J1cKogOP0jjn0VieJXptqc
++nHICV5/LmX3KC7ZxowexrQhTw81cKtx0fVeyZAHlM0rmIj23iajLqLtE+tq07P50
++OP8uABiK53L9RH55SlM/7PjDss6/VZDG7xsRBhEzaU39jOuSmZdrewIDAQABo28w
++bTAdBgNVHQ4EFgQUBt0gNG2VFq4KeC5rPkvqxlxUZpgwCwYDVR0PBAQDAgbAMBMG
++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUDH40Tp0C
++9PsflBT7LIr3BXriX84wDQYJKoZIhvcNAQENBQADggEBAIsh0gAB91/phH0XSbaV
++5X7bOvUQZBkF6VU3FMSKz1qeP7zhxhHnsTQVAWRCT4QdQ0bXzWDaUubUfS1uL9fW
++hMS6qJ/X56WjYvzUqr6Haxxc6nF2SzaZfNHC02uBOBqZaOWsf0rEv4M9A1PPPyy4
++ZO5nCLsLvReiAXViAyRO2HjXej/820fXh0uwEZgR8tUaQEt5frphr9cT/Q70kn+M
++XfpXvhGmLZ9C+0pXS0ILJRb8DccdfL6UMmQEPyfuW2OJrCDwvK3aG4KA2mdAg9Ca
++OvxCQ9WgAkMR2P7dHovoYaMsl8Nipiy/i0YeVG1rJAledWOO05xiVPdiTPkJk8JC
++PPU=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.key b/examples/puma/chain_cert/cert.key
+index ed2bd0d..790455c 100644
+--- a/examples/puma/chain_cert/cert.key
++++ b/examples/puma/chain_cert/cert.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/chain_cert/cert_chain.pem b/examples/puma/chain_cert/cert_chain.pem
+index 5f391f3..40ed0f5 100644
+--- a/examples/puma/chain_cert/cert_chain.pem
++++ b/examples/puma/chain_cert/cert_chain.pem
+@@ -1,60 +1,59 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjUwNzAxMDAwMDAwWhcNMzYwNzAx
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkH1hQqC0EFwYxi5+Ihqat9Yqebpk0A9x
+-ZzdO68eBSw4glnhh/+8VNB238q3nVD+0oL5oOBFVPAA34jUrrngS3LSl7tx4y1tj
+-jqn2LwKkdjAaaQn7uNKf/Ow6JX8dsaFpEUmabOzQBbhQtUDdbHmX1jgJYy8siSdU
+-ExXtNHAA+kqlif0Hcj1Xx8dlXQlLiDgdO1I5h84rjfdX+TUGwnJO5MkIZ5X5r6tE
+-hk8s/2dvbrU2AKcP+pTY4jw/fyDNd9q8OdW186RlBdS+uyX3D2hh+8aVLONQIJOx
+-wRyQaImYzHPWMDO6MuQ5/5LAxFFYWCGSLvUTdrillB0Snmppe9uGhwIDAQABo28w
+-bTAdBgNVHQ4EFgQUQT/iPOTx/zDEIgWHiraGJdrud74wCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU1V8CDxIv
+-GpM3njBhaJZ/FWJz6IcwDQYJKoZIhvcNAQENBQADggEBADHQ75un1UtxDI9oluXu
+-wEJL0515nIAKjaWFCl0Z/CGaAWkkJERk0JBxTe9J/MrYY68NYCCAusRoUoRbvcA2
+-GQ8vKae5V6/md+npZpKQznmUk+nZMzNKr+QoMY/nvtLA5tZ85fsU40H4nbvb23EY
+-3o6IiEbLD0G3FbIFtkgQ7+j9w6bvvMwd+3Ed0jSjRl4wKi4cXgD1UIyce/MVzAzT
+-bXW2SLWjfRzcTsrAnrbno5S3g+KMD1w9zGNppYiFH0zydpatKjJW18r/6XgJqoim
+-Rl5OGVnMNgIAw+S8/G3+/IIPXWHFE29R3j3oXjm/F8570TpQTYyx8wOmEr+zJPv0
+-8gU=
++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnweGJw3HXhvtIAFL6i3hzFdD5F3UG2Nm
++hIGaiKyDy71b25rkXFduG8R9i4s5rVBUdafA2OlrRDWMMrlYSudJnlB6P2jtBRxB
++7iw66vBVCBstDiKEr5xWFceG+2WpHU1peLCj72Ujuy/Xc/85S+70a9ISXItDRuyY
++tNTLi1HROioH6A0MfpvoLKxHYyoJ1dxu/eXikY8uk+J1cKogOP0jjn0VieJXptqc
++nHICV5/LmX3KC7ZxowexrQhTw81cKtx0fVeyZAHlM0rmIj23iajLqLtE+tq07P50
++OP8uABiK53L9RH55SlM/7PjDss6/VZDG7xsRBhEzaU39jOuSmZdrewIDAQABo28w
++bTAdBgNVHQ4EFgQUBt0gNG2VFq4KeC5rPkvqxlxUZpgwCwYDVR0PBAQDAgbAMBMG
++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUDH40Tp0C
++9PsflBT7LIr3BXriX84wDQYJKoZIhvcNAQENBQADggEBAIsh0gAB91/phH0XSbaV
++5X7bOvUQZBkF6VU3FMSKz1qeP7zhxhHnsTQVAWRCT4QdQ0bXzWDaUubUfS1uL9fW
++hMS6qJ/X56WjYvzUqr6Haxxc6nF2SzaZfNHC02uBOBqZaOWsf0rEv4M9A1PPPyy4
++ZO5nCLsLvReiAXViAyRO2HjXej/820fXh0uwEZgR8tUaQEt5frphr9cT/Q70kn+M
++XfpXvhGmLZ9C+0pXS0ILJRb8DccdfL6UMmQEPyfuW2OJrCDwvK3aG4KA2mdAg9Ca
++OvxCQ9WgAkMR2P7dHovoYaMsl8Nipiy/i0YeVG1rJAledWOO05xiVPdiTPkJk8JC
++PPU=
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
+-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
+-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
+-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
+-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
+-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
+-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
+-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
+-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
+-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
+-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
+-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
+-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
+-iX6YKGNd
++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
++05PKNc+5
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
+-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
+-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
+-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
+-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
+-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
+-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
+-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
+-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
+-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
+-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
+-8uByucqDNovFjYNMKw==
++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.crt b/examples/puma/chain_cert/intermediate.crt
+index cc9895e..501d1ad 100644
+--- a/examples/puma/chain_cert/intermediate.crt
++++ b/examples/puma/chain_cert/intermediate.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
+-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
+-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
+-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
+-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
+-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
+-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
+-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
+-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
+-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
+-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
+-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
+-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
+-iX6YKGNd
++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
++05PKNc+5
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.key b/examples/puma/chain_cert/intermediate.key
+index 9269949..a1d0df4 100644
+--- a/examples/puma/chain_cert/intermediate.key
++++ b/examples/puma/chain_cert/intermediate.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/ca.crt b/examples/puma/client_certs/ca.crt
+index c3d39dc..599b16a 100644
+--- a/examples/puma/client_certs/ca.crt
++++ b/examples/puma/client_certs/ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
+-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
+-DQEBAQUAA4IBDwAwggEKAoIBAQDPVFa7U4cqfq2Nux7VuXIUhYtaiQwxEEZuDvGI
+-tlSVzpENnqFLbqH0QsOuxGgIZofsrSf4BrCzh4AoL3qY+HgVRCmkD09FnoWjFTfT
+-X6v7QaCtUsrb7RNASrrgyP7rB9y7sp9oc8FNJQA3gtJQxghffO9zGhnEvPt8EGGU
+-axh29BYVxvQpX1Av0SkYjTgpRus1s7r50tpoDHXhKyAHP6WEEVaN/8x1p9eXqVCT
+-XIhlJJ+dgwZz/Hfnb6gr97W5G16Ceo7ybS8syKBJf2D20DOL8kLAiNpjWm9spoJi
+-oxHvFMdDB3nUqZyRO+QU8gSoQBVYYqRlEnOXvouzqslUVdbLAgMBAAGjIzAhMA8G
++DQEBAQUAA4IBDwAwggEKAoIBAQCxatlqNB98n2Huwg4TNhTx81t4RDUHyRH5YUCT
++808QrxqqhNJGOSTfLDoobeObZqm8DzhZgeiMI8TQjGoQUPntARrfmS0qwBKpERJ7
++Se2mY7J5EFZtIR4dtTlD6CPzEC1cxdgF8+2BXCb/DdSRmgEMseC32cimYZt4uumA
++ckJfmGJst18nc8R9EPZdsW1mFjGSYrfigtqEcm4UOKnBRilMhacIXHJqUKcV6oIh
++KXWraHLex62Mzfp+g9MQ2xEmOz6j/nJ/54xqmFNoIR2mZBAOvsKMQVph/EWFF8Ei
+++NMkzXYbePkKaQBLMsKnonfIpfPzm4Sg8V51oSOG5KsW4JLzAgMBAAGjIzAhMA8G
+ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
+-AQC9iO5jvBDNgDmUq8+NfsAZngWLOG7IR+Ez5h3CzGU9yzcJgn8y6PMjzhgc20le
+-WYzAHEG/KXFIfubUW/9iA8E6We0hm0LM1s9o7A9JAqsHcZ/pK2QmDW71JupU8o1z
+-3Qcu7jRzPc7zYgNwaD4/ccpJTAPGg6keV3YGN2Z5RpWykOFzP7WswaMIcKQE869c
+-Tyi8i71XkVrL+xx2pRiiNDOmfMkmm8TZ9tBP7n6BcRd556TTIxhjONvmamCraBQP
+-msPnMtb8+H3/IsMsUw02/fQTJ91FVa3t914Y24+q5xmkasyrhinTNmsa/S939P6I
+-JNNoAM6TUZrskKPtb/pMzaqn
++AQAayMxMY4+PRsjODW49e8YM+NfLIypZB9+QV432q6BTT+5KQh9DSBt1Bz5RaU1g
++tsz0sS7x0Iv7CvRwR1iDZOv8annHcjuEgxfWJ0+PBhFi2Tz1eF4EnpZt2RcJ/IMW
++xnsDLjRMASdmQxOLvxqz19fAQMAVw7ThkzicuW0ZMBX3baAf88m7w1Mu/V7P6rj5
++yw+SfZv/qNakUv2yc/2xEDRcfrYuimZAmGhM/HaPsta2BpvWJDpYe1Hq8AFWniz0
++C2epSzW+CdkpQZD/DIQmfWrWcBeb/XQ6hmouyJ6IWrgL45x7xcTLBOSAecBeZGMp
++npnO0PJN8Z/PQWz4sd8e2dIN
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/ca.key b/examples/puma/client_certs/ca.key
+index c689bd4..16a86af 100644
+--- a/examples/puma/client_certs/ca.key
++++ b/examples/puma/client_certs/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/ca_store.jks b/examples/puma/client_certs/ca_store.jks
+index f522926..9071747 100644
+--- a/examples/puma/client_certs/ca_store.jks
++++ b/examples/puma/client_certs/ca_store.jks
+@@ -1,6 +1,8 @@
+-þíþí