require "openssl" module HTTPI module Auth # = HTTPI::Auth::SSL # # Provides SSL client authentication. class SSL VERIFY_MODES = [:none, :peer, :fail_if_no_peer_cert, :client_once] CERT_TYPES = [:pem, :der] # Returns whether SSL configuration is present. def present? (verify_mode == :none) || (cert && cert_key) || ca_cert_file rescue TypeError, Errno::ENOENT false end # Accessor for the cert key file to validate SSL certificates. attr_accessor :cert_key_file # Accessor for the cert key password to validate SSL certificates. attr_accessor :cert_key_password # Accessor for the cert file to validate SSL connections. attr_accessor :cert_file # Accessor for the cacert file to validate SSL certificates. attr_accessor :ca_cert_file # Returns the cert type to validate SSL certificates PEM|DER. def cert_type @cert_type ||= :pem end # Sets the cert type to validate SSL certificates PEM|DER. def cert_type=(type) raise ArgumentError, "Invalid SSL cert type: #{type}" unless CERT_TYPES.include? type @cert_type = type end # Returns the SSL verify mode. Defaults to :peer. def verify_mode @verify_mode ||= :peer end # Sets the SSL verify mode. Expects one of HTTPI::Auth::SSL::VERIFY_MODES. def verify_mode=(mode) raise ArgumentError, "Invalid SSL verify mode: #{mode}" unless VERIFY_MODES.include? mode @verify_mode = mode end # Returns an OpenSSL::X509::Certificate for the +cert_file+. def cert @cert ||= (OpenSSL::X509::Certificate.new File.read(cert_file) if cert_file) end # Sets the +OpenSSL+ certificate. attr_writer :cert # Returns an OpenSSL::X509::Certificate for the +ca_cert_file+. def ca_cert @ca_cert ||= OpenSSL::X509::Certificate.new File.read(ca_cert_file) end # Sets the +OpenSSL+ ca certificate. attr_writer :ca_cert # Returns an OpenSSL::PKey::RSA for the +cert_key_file+. def cert_key @cert_key ||= (OpenSSL::PKey::RSA.new(File.read(cert_key_file), cert_key_password) if cert_key_file) end # Sets the +OpenSSL+ certificate key. attr_writer :cert_key # Returns the SSL verify mode as a OpenSSL::SSL::VERIFY_* constant. def openssl_verify_mode case verify_mode when :none then OpenSSL::SSL::VERIFY_NONE when :peer then OpenSSL::SSL::VERIFY_PEER when :fail_if_no_peer_cert then OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT when :client_once then OpenSSL::SSL::VERIFY_CLIENT_ONCE end end end end end