Sha256: 124c5f6358c98f0ef362abf1202ab3825fd40036d0114796bba83352c23f73b7

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

require 'socket'
require 'openssl'


module SSLCheck
  class Client
    class Response
      attr_accessor :host_name, :errors

      def initialize
        self.errors = []
      end

      def raw_peer_cert=(peer_cert)
        @raw_peer_cert = peer_cert
      end

      def raw_peer_cert_chain=(peer_cert_chain)
        @raw_peer_cert_chain = peer_cert_chain
      end

      def peer_cert
        Certificate.new(@raw_peer_cert)
      end

      def ca_bundle
        @raw_peer_cert_chain.map{|ca_cert| Certificate.new(ca_cert) }
      end
    end

    def initialize
      @response = Response.new
    end

    def get(url)
      begin
        uri = determine_uri(url)

        sock = TCPSocket.new(uri.host, 443)
        ctx = OpenSSL::SSL::SSLContext.new
        ctx.set_params(:verify_mode => OpenSSL::SSL::VERIFY_PEER)

        @socket = OpenSSL::SSL::SSLSocket.new(sock, ctx).tap do |socket|
          socket.sync_close = true
          socket.connect
          @response.host_name = uri.host
          @response.raw_peer_cert = OpenSSL::X509::Certificate.new(socket.peer_cert)
          @response.raw_peer_cert_chain = socket.peer_cert_chain
        end

        @socket.sysclose
      rescue URI::InvalidURIError
        @response.errors << SSLCheck::Errors::Connection::InvalidURI.new({:name => "Invalid URI Error", :type => :invalid_uri, :message => "The URI, #{url}, is not a valid URI."})
      rescue OpenSSL::SSL::SSLError
        @response.errors << SSLCheck::Errors::Connection::SSLVerify.new({:name => "OpenSSL Verification Error", :type => :openssl_error, :message => "There was a peer verification error."})
      end

      @response
    end

    private
      def determine_uri(url)
        return URI.parse(url) if url.match(/^https\:\/\//)
        return URI.parse(url.gsub("http","https")) if url.match(/^http\:\/\//)
        return URI.parse("https://#{url}") if url.match(/^https\:\/\//).nil?
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sslcheck-0.9.2 lib/sslcheck/client.rb