Skip to content

Instantly share code, notes, and snippets.

@mrrooijen
Created August 15, 2012 01:30
Show Gist options
  • Save mrrooijen/3354578 to your computer and use it in GitHub Desktop.
Save mrrooijen/3354578 to your computer and use it in GitHub Desktop.
Heroku SSL Endpoint, RapidSSL

Heroku SSL Endpoint

Assumptions:

  • You want to enable SSL for your domain.
  • You want to go with RapidSSL.
  • Your domain name is www.domain.com during this example.
  • You want to encrypt requests for a single domain (no wildcard)
  • You want to apply this certificate to Heroku's SSL Endpoint

Enjoy.

Generate SSL key and request

First generate the key file for the following reasons:

  • Required to generate the Certification Request File (CSR, csr).
  • Will have to be uploaded to Heroku later.
openssl genrsa -out www.domain.com.key 2048

Now, using that new key we will generate the CSR, we need it for the following reasons:

  • Required to request a Certificate File (CRT, crt)
openssl req -new -key www.domain.com.key -out www.domain.com.csr

As you run this command, you will be asked a few questions. Just provide whatever you want. HOWEVER, for the Common Name you need to provide the actual domain name you want to create the certificate for. In this case www.domain.com. While we don't explicitly cover wildcards, if you want to request a wildcard, use *.domain.com as the Common Name.

Example:

Country Name (2 letter code) [AU]: NL
State or Province Name (full name) [Some-State]: NH
Locality Name (eg, city) []: Amsterdam
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 1337Machine
Organizational Unit Name (eg, section) []: Internets
Common Name (eg, YOUR name) []: www.domain.com
Email Address []: [email protected]

Purchase a certificate

I recommend RapidSSL. It works. Find a vendor that sells them at a reasonable price. The price for a standard SSL certificate is around $10~20/year. Wildcard SSL certificates are generally a lot more expensive, just for your information.

Pro tip: Stay away from GoDaddy.com

I personally get all my certificates at Xolphin.nl but this won't be an option for you unless you're Dutch.

You might want to try one of these:

I have not used either of these, but have a look. If not, Google around and you'll definitely find something. There are a bunch of acceptable resellers out there.

In any case, find a vendor, use your www.domain.com.csr file to request a certificate. Usually they have you paste the contents of the CSR file in to a form. Just follow the instructions provided by the vendor.

Finish the certificate

Now that you have your certificate (.crt file), simply use the rapidssl_bundle.pem in this gist, concatenate it to your purchased certificate file and produce a new file. We'll call that new file www.domain.com.bundled.crt.

Assuming your provided crt file is called www.domain.com.crt, do the following:

cat www.domain.com.crt rapidssl_bundle.pem > www.domain.com.bundled.crt

Now you're done setting up your SSL certificate.

Setup domain, enable SSL Endpoint, and apply certificates to Heroku

Add your custom domain:

heroku domains:add www.domain.com

Then add the SSL Endpoint add-on:

heroku addons:add ssl

Finally, apply your certficate with your www.domain.com.bundled.crt (aka PEM) and www.domain.com.key.

heroku certs:add ./www.domain.com.bundled.crt ./www.domain.com.key

With this in place, go ahead and run the following command to see what your ssl endpoint is.

heroku certs
Endpoint                 Common Name(s)           Expires                Trusted
-----------------------  -----------------------  ---------------------  -------
oita-4922.herokussl.com  www.domain.com           2013-06-29 08:14 CEST  True

Copy the Endpoint for www.domain.com, open your domain providers control panel and configure the DNS with the following settings:

Name Type Value
www CNAME oita-4922.herokussl.com.

See that period at the end of the value? Yup.

Also ensure you have your Heroku A records in place while you're at it so it knows what IP's to alias:

Name Type Value
@ A 174.129.212.2
@ A 75.101.145.87
@ A 75.101.163.44

Save it and that should be sufficient. Flush your DNS cache, and otherwise just reboot your local machine (flushing cache never works for me). Then try to open https://www.domain.com/ - If the changes have already propegated to your located then this should now display your application with SSL in place.

-----BEGIN CERTIFICATE-----
MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG
EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM
IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0
l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e
6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb
ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8
N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5
HI7PynvBZq+odEj7joLCniyZXHstXZu8W1eefDp6E63yoxhbK1kPzVw662gzxigd
gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC
St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w
EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js
Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw
JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B
AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x
/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O
SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61
04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4
knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK
LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
-----END CERTIFICATE-----
@sambecker
Copy link

Hi @meskyanichi thanks for this. Do you have a sense for why Heroku charges $20/mo. to facilitate an SSL certificate you're already renting it from another provider? Is it typical for a host to charge a substantial fee for this if they're not providing the actual cert?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment