# class Gem::Security::Signer

Basic OpenSSL-based package signing class.

### Attributes

cert_chain[RW]

The chain of certificates for signing including the signing certificate

digest_algorithm[R]

The digest algorithm used to create the signature

key[RW]

The private key for the signing certificate

### Public Class Methods

new(key, cert_chain, passphrase = nil) click to toggle source

Creates a new signer with an RSA `key` or path to a key, and a certificate `chain` containing X509 certificates, encoding certificates or paths to certificates.

    # File lib/rubygems/security/signer.rb, line 33
    def initialize key, cert_chain, passphrase = nil
      @cert_chain = cert_chain
      @key        = key

      unless @key then
        default_key  = File.join Gem.default_key_path
        @key = default_key if File.exist? default_key
      end

      unless @cert_chain then
        default_cert = File.join Gem.default_cert_path
        @cert_chain = [default_cert] if File.exist? default_cert
      end

      @digest_algorithm = Gem::Security::DIGEST_ALGORITHM
      @digest_name      = Gem::Security::DIGEST_NAME

      @key = OpenSSL::PKey::RSA.new File.read(@key), passphrase if
        @key and not OpenSSL::PKey::RSA === @key

      if @cert_chain then
        @cert_chain = @cert_chain.compact.map do |cert|
          next cert if OpenSSL::X509::Certificate === cert

          cert = File.read cert if File.exist? cert

          OpenSSL::X509::Certificate.new cert
        end

        load_cert_chain
      end
    end

### Public Instance Methods

sign(data) click to toggle source

Sign data with given digest algorithm

    # File lib/rubygems/security/signer.rb, line 102
    def sign data
      return unless @key

      raise Gem::Security::Exception, 'no certs provided' if @cert_chain.empty?

      if @cert_chain.length == 1 and @cert_chain.last.not_after < Time.now then
        re_sign_key
      end

      full_name = extract_name @cert_chain.last

      Gem::Security::SigningPolicy.verify @cert_chain, @key, {}, {}, full_name

      @key.sign @digest_algorithm.new, data
    end