Sha256: fd86afeb293d3e452a24e7ceba86237fb338d4f07ec55dbc404886e93e31bb64

Contents?: true

Size: 1.98 KB

Versions: 16

Compression:

Stored size: 1.98 KB

Contents

require 'net/http'
require 'openssl'

URIS = [
  URI('https://rubygems.org'),
  URI('https://s3.amazonaws.com'),
  URI('https://d2chzxaqi4y7f8.cloudfront.net'),
  URI('https://rubygems.global.ssl.fastly.net'),
]

def connect_to uri, store
  http = Net::HTTP.new uri.hostname, uri.port

  http.use_ssl = uri.scheme.downcase == 'https'
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.cert_store = store

  http.get '/'

  true
rescue OpenSSL::SSL::SSLError
  false
end

def load_certificates io
  cert_texts =
    io.read.scan(/^-{5}BEGIN CERTIFICATE-{5}.*?^-{5}END CERTIFICATE-{5}/m)

  cert_texts.map do |cert_text|
    OpenSSL::X509::Certificate.new cert_text
  end
end

def show_certificates certificates
  certificates.each do |certificate|
    p certificate.subject.to_a
  end
end

def store_for certificates
  store = OpenSSL::X509::Store.new
  certificates.each do |certificate|
    store.add_cert certificate
  end

  store
end

def test_certificates certificates, uri
  1.upto certificates.length do |n|
    puts "combinations of #{n} certificates"
    certificates.combination(n).each do |combination|
      match = test_uri uri, combination

      if match then
        $needed_combinations << match
        puts
        return
      else
        print '.'
      end
    end
    puts
  end
end

def test_uri uri, certificates
  store = store_for certificates

  verified = connect_to uri, store

  return certificates if verified

  nil
end

def write_certificates certificates
  certificates.each do |certificate|
    subject = certificate.subject.to_a
    name = (subject.assoc('CN') || subject.assoc('OU'))[1]
    name = name.delete ' .-'

    open "lib/rubygems/ssl_certs/#{name}.pem", 'w' do |io|
      io.write certificate.to_pem
    end
  end
end

certificates = load_certificates ARGF
puts "loaded #{certificates.length} certificates"

$needed_combinations = []

URIS.each do |uri|
  puts uri

  test_certificates certificates, uri
end

needed = $needed_combinations.flatten.uniq

write_certificates needed

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
rubygems-update-2.0.17 util/update_bundled_ca_certificates.rb
rubygems-update-2.0.16 util/update_bundled_ca_certificates.rb
rubygems-update-2.0.15 util/update_bundled_ca_certificates.rb
rubygems-update-1.8.30 util/update_bundled_ca_certificates.rb
rubygems-update-1.8.29 util/update_bundled_ca_certificates.rb
rubygems-update-2.1.11 util/update_bundled_ca_certificates.rb
rubygems-update-2.0.14 util/update_bundled_ca_certificates.rb
rubygems-update-2.1.10 util/update_bundled_ca_certificates.rb
rubygems-update-2.0.13 util/update_bundled_ca_certificates.rb
rubygems-update-2.0.12 util/update_bundled_ca_certificates.rb
rubygems-update-2.1.9 util/update_bundled_ca_certificates.rb
rubygems-update-2.1.8 util/update_bundled_ca_certificates.rb
rubygems-update-2.1.7 util/update_bundled_ca_certificates.rb
rubygems-update-1.8.28 util/update_bundled_ca_certificates.rb
rubygems-update-2.0.11 util/update_bundled_ca_certificates.rb
rubygems-update-2.1.6 util/update_bundled_ca_certificates.rb