Sha256: bf459b7076447abfde0f3e04585b8c730edf8720065d09aa063f368f8009caa8

Contents?: true

Size: 1.22 KB

Versions: 1

Compression:

Stored size: 1.22 KB

Contents

require 'base64'
require 'plist'

module ApplePushCerts
  class SignedCSR < String

    def initialize(vendor_p12_path, p12_password, customer_csr)
      vendor_p12 = OpenSSL::PKCS12.new(File.open(vendor_p12_path).read, p12_password)

      csr_der         = customer_csr.to_der
      signed_csr_der  = vendor_p12.key.sign(OpenSSL::Digest::SHA1.new, csr_der)

      request = {
        'PushCertRequestCSR'        => Base64.encode64(csr_der),
        'PushCertCertificateChain'  => certificate_chain(vendor_p12),
        'PushCertSignature'         => Base64.encode64(signed_csr_der)
      }

      # Apple doesn't like tab characters in the plist
      plist = Plist::Emit.dump(request).gsub(/\t/,'')
      
      signed_csr = Base64.encode64 plist

      super signed_csr
    end

    private

    def certificate_chain(vendor_p12)
      apple_root          = path_to_pem CONFIG[:apple_root_certificate_path]
      apple_intermediate  = path_to_pem CONFIG[:apple_intermediate_certificate_path]
      vendor_cert         = vendor_p12.certificate.to_pem

      [apple_root, apple_intermediate, vendor_cert].join
    end

    def path_to_pem(path)
      cert = OpenSSL::X509::Certificate.new File.open(path).read
      cert.to_pem
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
apple_push_certs-0.0.1 lib/apple_push_certs/signed_csr.rb