# File lib/rubygems/security.rb, line 408
    def self.build_self_signed_cert(email_addr, opt = {})
      Gem.ensure_ssl_available
      opt = OPT.merge(opt)
      path = { :key => nil, :cert => nil }

      # split email address up
      cn, dcs = email_addr.split('@')
      dcs = dcs.split('.')

      # munge email CN and DCs
      cn = cn.gsub(opt[:munge_re], '_')
      dcs = dcs.map { |dc| dc.gsub(opt[:munge_re], '_') }
      
      # create DN
      name = "CN=#{cn}/" << dcs.map { |dc| "DC=#{dc}" }.join('/')
      name = OpenSSL::X509::Name::parse(name)

      # build private key
      key = opt[:key_algo].new(opt[:key_size])

      # method name pretty much says it all :)
      verify_trust_dir(opt[:trust_dir], opt[:perms][:trust_dir])

      # if we're saving the key, then write it out
      if opt[:save_key]
        path[:key] = opt[:save_key_path] || (opt[:output_fmt] % 'private_key')
        File.open(path[:key], 'wb') do |file| 
          file.chmod(opt[:perms][:signing_key])
          file.write(key.to_pem) 
        end
      end
      
      # build self-signed public cert from key
      cert = build_cert(name, key, opt)

      # if we're saving the cert, then write it out
      if opt[:save_cert]
        path[:cert] = opt[:save_cert_path] || (opt[:output_fmt] % 'public_cert')
        File.open(path[:cert], 'wb') do |file| 
          file.chmod(opt[:perms][:signing_cert])
          file.write(cert.to_pem)
        end
      end

      # return key, cert, and paths (if applicable)
      { :key => key, :cert => cert, 
        :key_path => path[:key], :cert_path => path[:cert] }
    end