Git Product home page Git Product logo

sabayon's Introduction

Sabayon DEPRECATED. DO NOT USE.

Automated generation and renewal of ACME/Letsencrypt SSL certificates for Heroku apps.

This tool is deprecated, and will not receive further changes.
Heroku now provides automated certificate management with letsencrypt.

architecture

Setup

There are three parts to the setup:

  1. Configure SNI SSL on your app
  2. Setting up the Sabayon app
  3. Your application setup

Heroku's HTTP SNI

This project relies on Heroku's Free SSL offering.

Set up Sabayon app

Sabayon works by running a separate app that will configure letsencrypt for your main app. To get started, clone this project locally and make a new Heroku app.

$ git clone https://github.com/dmathieu/sabayon.git
$ cd sabayon
$ heroku create letsencrypt-app-for-<name>

Note: Replace <name> with the name of your app.

Now deploy your Sabayon app to Heroku

$ git push heroku

Alternatively you can deploy with the Heroku button:

Deploy

Configure Sabayon app

You will need to tell Sabayon a few things about your main app before it can generate tokens for you. You configure it via config vars.

  • ACME_APP_NAME this is the name of the Heroku application you're trying to enable SSL on.

For example:

$ heroku config:set ACME_APP_NAME=myapp -a letsencrypt-app-for-<name>

This would be valid for http://myapp.herokuapp.com.

  • ACME_DOMAIN This is a comma separated list of domains for which you want certificates. Subdomains need different certificates.

For Example:

$ heroku config:set ACME_DOMAIN="codetriage.com,www.codetriage.com" -a letsencrypt-app-for-<name>

This would be valid for http://www.codetriage.com

  • ACME_EMAIL This is your email address, it needs to be valid.
$ heroku config:set ACME_EMAIL="<youremail>@<example>.com" -a letsencrypt-app-for-<name>
  • HEROKU_TOKEN the API token for the app you're trying to enable SSL on. See the next section

Create OAuth authorization for HEROKU_TOKEN

The heroku-oauth toolbelt plugin can be used to create OAuth authorization. An access token will be generated for this authorization. This access token need to be registered as HEROKU_TOKEN variable when creating the sabayon app.

> heroku plugins:install heroku-cli-oauth
> heroku authorizations:create -d "<description-you-want>"
Created OAuth authorization.
  ID:          <heroku-client-id>
  Description: <description-you-want>
  Scope:       global
  Token:       <heroku-token>

You can retrieve authorizations information later. More info: heroku authorizations --help.

Take the output of token and use it to set the HEROKU_TOKEN on your Sabayon app:

$ heroku config:set HEROKU_TOKEN="<heroku-token>" -a letsencrypt-app-for-<name>

Set up scheduler for Sabayon

Now that you've set all the configuration variables for your Sabayon app you'll need to configure it to Run automatically.

$ heroku addons:create scheduler:standard

Visit the resources dashboard for the Sabayon app you created https://dashboard.heroku.com/apps/letsencrypt-app-for-<name>/resources (replace letsencrypt-app-for-<name> with your app's name).

Then click on "Heroku Scheduler" and add a job to run bin/sabayon daily.

heroku scheduler

The command bin/sabayon will attempt to get a new cert when your existing certificate expires (every 90 days) if the certificate is not close to expiring it will exit so it does not renew your certificiate every day.

Once you configure your application you'll want to manually run heroku run bin/sabayon -a letsencrypt-app-for-<name> and watch the output to verify a certificate is created and registered correctly. This is covered after "configuring your application".

Configuring your primary application

Sabayon works be telling letsencrypt the site it wants to generate a certificate for, such as www.codetriage.com. For the cert to be valid Letsencrypt must verify that we have access to www.codetriage.com. To do this letsencrypt will give us a custom URL and a response. Letsencrypt then expects your app to return that specific response when it hits that URL, that way it knows you own the site. For example it may say that when you visit "www.codetriage.com/dist/.well-known/acme-challenge/foo" that it expects the response text "bar". When letsencrypt lets Sabayon know these values it will set config vars on your main app such as ACME_KEY=foo and ACME_TOKEN=bar. We need to configure the main app to read in these environment variables and serve the appropriate response.

Below details how you can configure different types of websites to respond in the correct way

Static apps

For a static app change the web process type in your Procfile:

web: bin/start

Add a bin/start file to your app:

#!/usr/bin/env ruby
data = []
if ENV['ACME_KEY'] && ENV['ACME_TOKEN']
  data << {key: ENV['ACME_KEY'], token: ENV['ACME_TOKEN']}
else
  ENV.each do |k, v|
    if d = k.match(/^ACME_KEY_([0-9]+)/)
      index = d[1]

      data << {key: v, token: ENV["ACME_TOKEN_#{index}"]}
    end
  end
end

result = `mkdir -p dist/.well-known/acme-challenge`
raise result unless $?.success?
data.each do |e|
  result = `echo #{e[:key]} > dist/.well-known/acme-challenge/#{e[:token]}`
  raise result unless $?.success?
end

exec("bin/boot")

Make that file executable:

chmod +x bin/start

Commit this code then deploy your main app with those changes.

Ruby apps

Add the following rack middleware to your app:

class SabayonMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    data = []
    if ENV['ACME_KEY'] && ENV['ACME_TOKEN']
      data << { key: ENV['ACME_KEY'], token: ENV['ACME_TOKEN'] }
    else
      ENV.each do |k, v|
        if d = k.match(/^ACME_KEY_([0-9]+)/)
          index = d[1]
          data << { key: v, token: ENV["ACME_TOKEN_#{index}"] }
        end
      end
    end

    data.each do |e|
      if env["PATH_INFO"] == "/.well-known/acme-challenge/#{e[:token]}"
        return [200, { "Content-Type" => "text/plain" }, [e[:key]]]
      end
    end

    @app.call(env)
  end
end

Rails apps

Add the previous middleware in an accessible place of your application (such as lib if you're including that folder). Then make rails include that middleware before all others. In config/application.rb:

config.middleware.insert_before 0, 'SabayonMiddleware'

More info on loading middleware.

Go apps

Add the following handler to your app:

http.HandleFunc("/.well-known/acme-challenge/", func(w http.ResponseWriter, r *http.Request) {
  pt := strings.TrimPrefix(r.URL.Path, "/.well-known/acme-challenge/")
  rk := ""

  k := os.Getenv("ACME_KEY")
  t := os.Getenv("ACME_TOKEN")
  if k != "" && t != "" {
  	if pt == t {
  		rk = k
  	}
  } else {
  	for i := 1; ; i++ {
  		is := strconv.Itoa(i)
  		k = os.Getenv("ACME_KEY_" + is)
  		t = os.Getenv("ACME_TOKEN_" + is)
  		if k != "" && t != "" {
  			if pt == t {
  				rk = k
  				break
  			}
  		} else {
  			break
  		}
  	}
  }

  if rk != "" {
  	fmt.Fprint(w, rk)
  } else {
  	http.NotFound(w, r)
  }
})

Express apps

Define the following route in your app.

app.get('/.well-known/acme-challenge/:acmeToken', function(req, res, next) {
  var acmeToken = req.params.acmeToken;
  var acmeKey;

  if (process.env.ACME_KEY && process.env.ACME_TOKEN) {
    if (acmeToken === process.env.ACME_TOKEN) {
      acmeKey = process.env.ACME_KEY;
    }
  }

  for (var key in process.env) {
    if (key.startsWith('ACME_TOKEN_')) {
      var num = key.split('ACME_TOKEN_')[1];
      if (acmeToken === process.env['ACME_TOKEN_' + num]) {
        acmeKey = process.env['ACME_KEY_' + num];
      }
    }
  }

  if (acmeKey) res.send(acmeKey);
  else res.status(404).send();
});

PHP Apps

Add the following to .well-known/acme-challenge/index.php

<?php
$request = $_SERVER['REQUEST_URI'];
if(preg_match('#^/.well-known/acme-challenge/#', $request) === 0) {
    return;
}

$data = [];

if(isset($_ENV['ACME_KEY']) && isset($_ENV['ACME_TOKEN'])) {
    $data[] = [
        'key' => $_ENV['ACME_KEY'],
        'token' => $_ENV['ACME_TOKEN'],
    ];
} else {
    foreach($_ENV as $key => $value) {
        if(preg_match('#^ACME_TOKEN_([0-9]+)#', $key)) {
            $number = str_replace('ACME_TOKEN_', '', $key);
            $data[] = [
                'key' => $_ENV['ACME_KEY_'.$number],
                'token' => $_ENV['ACME_TOKEN_'.$number],
            ];
        }
    }
}

foreach($data as $pair) {
    if($pair['token'] == basename($request)) die($pair['key']);
}

Apache

Add the following to .well-known/acme-challenge/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /.well-known/acme-challenge/index.php [L]
</IfModule>

Nginx

Add this to your nginx.conf

location ^~ /.well-known/acme-challenge/ {
    allow all;
    # try to serve file directly, fallback to rewrite
    try_files $uri @rewriteacme;
}

location @rewriteacme {
    rewrite ^(.*)$ /.well-known/acme-challenge/index.php/$1 last;
}

location ^~ /.well-known/acme-challenge/index.php {
    try_files @heroku-fcgi @heroku-fcgi;
    internal;
}

Python (Flask)

Add the following route:

def find_key(token):
    if token == os.environ.get("ACME_TOKEN"):
        return os.environ.get("ACME_KEY")
    for k, v in os.environ.items():  #  os.environ.iteritems() in Python 2
        if v == token and k.startswith("ACME_TOKEN_"):
            n = k.replace("ACME_TOKEN_", "")
            return os.environ.get("ACME_KEY_{}".format(n))  # os.environ.get("ACME_KEY_%s" % n) in Python 2


@app.route("/.well-known/acme-challenge/<token>")
def acme(token):
    key = find_key(token)
    if key is None:
        abort(404)
    return key

Python (Django)

views.py:

import os

from django.http import HttpResponse, Http404


def acme_challenge(request, token):
    def find_key(token):
        if token == os.environ.get("ACME_TOKEN"):
            return os.environ.get("ACME_KEY")
        for k, v in os.environ.items():
            if v == token and k.startswith("ACME_TOKEN_"):
                n = k.replace("ACME_TOKEN_", "")
                return os.environ.get("ACME_KEY_{}".format(n))
    key = find_key(token)
    if key is None:
        raise Http404()
    return HttpResponse(key)

urls.py:

from . import views


urlpatterns = [
    # ...
    url(r'.well-known/acme-challenge/(?P<token>.+)', views.acme_challenge),
]

Elixir (Phoenix)

in router.ex:

get "/.well-known/acme-challenge/:token", App.ACME, :acme_challenge

acme.ex:

defmodule App.ACME do
  use App.Web, :controller

  def acme_challenge(conn, %{ "token" => token }) do
    case find_key_for_token(token) do
      nil -> send_resp conn, :not_found, ""
      key -> text conn, key
    end
  end

  @spec find_key_for_token(String.t) :: String.t | nil
  defp find_key_for_token(token) do
    System.get_env
    |> Map.keys
    |> Enum.find("", fn(e) -> System.get_env(e) === token end)
    |> (&Regex.replace(~r/TOKEN/, &1, "KEY")).()
    |> System.get_env
  end
end

Other HTTP implementations

In any other language, you need to be able to respond to requests on the path /.well-known/acme-challenge/$ACME_TOKEN with $ACME_KEY as the content.

Please add any other language/framework by opening a Pull Request.

Manually run bin/sabayon

Make sure you have scheduler added to your app and set up to run bin/sabayon daily. Now you'll want to manually run bin/sabayon to ensure a certificate can be provisioned:

$ heroku run bin/sabayon -a letsencrypt-app-for-<name>

The output should look something like:

2016/07/21 14:02:50 cert.create email='<name>@example.com' domains='[codetriage.com www.codetriage.com]'
2016/07/21 14:02:51 [INFO] acme: Registering account for <name>@example.com
2016/07/21 14:02:51 [INFO][codetriage.com, www.codetriage.com] acme: Obtaining bundled SAN certificate
2016/07/21 14:02:51 [INFO][codetriage.com] acme: Could not find solver for: dns-01
2016/07/21 14:02:51 [INFO][codetriage.com] acme: Could not find solver for: tls-sni-01
2016/07/21 14:02:51 [INFO][codetriage.com] acme: Trying to solve HTTP-01
2016/07/21 14:02:51 cert.validate
2016/07/21 14:03:12 cert.validated
2016/07/21 14:03:15 [INFO][codetriage.com] The server validated our request
2016/07/21 14:03:15 [INFO][www.codetriage.com] acme: Could not find solver for: dns-01
2016/07/21 14:03:15 [INFO][www.codetriage.com] acme: Trying to solve HTTP-01
2016/07/21 14:03:15 cert.validate
2016/07/21 14:03:36 cert.validated
2016/07/21 14:03:40 [INFO][www.codetriage.com] The server validated our request
2016/07/21 14:03:40 [INFO][codetriage.com, www.codetriage.com] acme: Validations succeeded; requesting certificates
2016/07/21 14:03:41 [INFO] acme: Requesting issuer cert from https://acme-v01.api.letsencrypt.org/acme/issuer-cert
2016/07/21 14:03:41 [INFO][codetriage.com] Server responded with a certificate.
2016/07/21 14:03:41 cert.created
2016/07/21 14:03:41 cert.updated

Note your website and email will be different

If you get an error that looks like:

ERROR: Challenge is invalid! http://sub.domain.eu/.well-known/acme-challenge/HPdGXEC2XEMFfbgpDxo49MNBFSmzYREn2i1U1lsEBDg

Visit the path /.well-known/acme-challenge/HPdGXEC2XEMFfbgpDxo49MNBFSmzYREn2i1U1lsEBDg for your website and verify you're getting the correct output. If not re-visit the "Configuring your primary application" section and make sure that your app will respond appropriately.

Update DNS

After configuring and successfully running Sabayon, you'll likely need to change your DNS settings. Non-SSL apps usually use a CNAME or ALIAS pointing to your-app-name.herokuapp.com, while apps with http-sni are accessible at your-app-name.com.herokudns.com. You should check your exact DNS target in your Heroku Dashboard under the Settings tab, within the Domains section. Look for "DNS Targets" under "Custom domains".

Force-reload a certificate

You can force-reload your app's certificate:

heroku run sabayon --force

sabayon's People

Contributors

brianfoshee avatar dmathieu avatar finack avatar florentmorin avatar ivoba avatar jonatack avatar kevinburke avatar oknoah avatar opicacek avatar schneems avatar sprice avatar stefan-kolb avatar steve228uk avatar sylver avatar tobiasmcnulty avatar williammayor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

sabayon's Issues

Error 400 - urn:acme:error:connection - Could not connect to url

I have this issue when use it with a Rails app. Even though I have check all steps carefully, but still don't know what going on. Can you help?

2017/01/10 15:30:40 [INFO][www.mydomain.com] The server validated our request
2017/01/10 15:30:40 acme: Error 400 - urn:acme:error:unknownHost - No valid IP addresses found for mydomain.com
Error Detail:
	Validation for mydomain.com:80
	Resolved to:

	Used:

Error 400 - urn:acme:error:connection - Could not connect to url

This happens when I run heroku run bin/sabayon -a sabayon-app

Anyone have any ideas why?

All custom domains go to appname.herokuapp.com
CNAMEs are set to appname.herokuapp.com
The app is a node express app with the sabayon code configured and it does return key back

Error Detail:
Validation for www.example.com:80
Resolved to:
123.12.123.1
Used: 123.12.123.1

When I go to the ip it resolves to, I get the default heroku "no such app page"

Asynchronous/Parallel Domain Authentication?

It seems to be the case that the process to authenticate all the domains listed in ACME_DOMAIN is a synchronous process (although I'm not certain because I'm very new to the GO language).

When the scheduler runs from Heroku, it seems to authenticate the domains in a synchronous and serial manner which means the more domains I add, the longer it takes to get a new cert.

Is this correct? If so, is there a way to make it asynchronous and parallel so that the number of domains doesn't really affect the time it takes to get a cert?

Seems to complete successfully, but site has no SSL

After enabling a Hobby account and http-sni, I was able to run sabayon for my node app. I've also added the express code.

user@users-Mac ~/D/d/mywebsite> 
heroku run sabayon --force --app mywebsite-encryptor

Running sabayon --force on ⬢ mywebsite-encryptor... up, run.7453
2016/06/25 23:38:02 cert.create email='[email protected]' domains='[mywebsite.com]'
2016/06/25 23:38:02 [INFO] acme: Registering account for [email protected]
2016/06/25 23:38:03 [INFO][mywebsite.com] acme: Obtaining bundled SAN certificate
2016/06/25 23:38:03 [INFO][mywebsite.com] acme: Could not find solver for: dns-01
2016/06/25 23:38:03 [INFO][mywebsite.com] acme: Could not find solver for: tls-sni-01
2016/06/25 23:38:03 [INFO][mywebsite.com] acme: Trying to solve HTTP-01
2016/06/25 23:38:03 cert.validate
2016/06/25 23:38:23 cert.validated
2016/06/25 23:38:24 [INFO][mywebsite.com] The server validated our request
2016/06/25 23:38:24 [INFO][mywebsite.com] acme: Validations succeeded; requesting certificates
2016/06/25 23:38:25 [INFO] acme: Requesting issuer cert from https://acme-v01.api.letsencrypt.org/acme/issuer-cert
2016/06/25 23:38:25 [INFO][mywebsite.com] Server responded with a certificate.
2016/06/25 23:38:25 cert.created
2016/06/25 23:38:26 cert.added

However, my site is not encrypted. Did I miss a step?

Unexpected EOF

Setting Sabayon up on one of my environments is returning an EOF unexpectedly. Everything seems to be setup correctly, the same way I have it setup for another environment which is working great with Sabayon. The error I see is:

$ heroku run bin/sabayon -a sabayon-for-my-app

Running bin/sabayon on ⬢ sabayon-for-my-app... up, run.1834 (Hobby)
2017/01/30 17:14:22 cert.create email='[email protected]' domains='[www.domain1.com www.domain2.com]'
2017/01/30 17:14:23 [INFO] acme: Registering account for [email protected]
2017/01/30 17:14:23 [INFO][www.domain1.com, www.domain2.com] acme: Obtaining bundled SAN certificate
2017/01/30 17:14:24 EOF

$

Settings:

ACME_APP_NAME: my-app
ACME_DOMAIN: www.domain1.com,www.domain2.com
ACME_EMAIL: [email protected]
HEROKU_TOKEN: .....

sabayon-for-my-app is using Hobby dynos; my-app is using standard dynos.

Add an alternate method to set Token & Key on main app

Just testing Sabayon on one of our apps and it works like a charm. Thanks!

In our case, as we're using preboot on our dynos, we have to wait circa 3 minutes in between each dyno restart during the domain validation step. As Sabayon seems to add each token & key for multiple domains in serial, this can end up taking a long time with even a modest list of domains.

Would you be interested in a PR for an option where instead of setting config vars on the main app we POST to an endpoint on the main app with the domain, token & key (leaving it up to the main app as to how it should store the result and reply to the challenge?)

Alternatively, I guess we could set all of the configuration variables at once, so there's only one restart no matter now many domains are in ACME_DOMAIN?

Error when running sabayon.

Hi!
Using latest revision a7ff0c2
Followed instructions in readme.
Trying to run:
heroku run bin/sabayon -a letsencrypt-app-for-mysuperapp
and getting:

Error: {"id":"not_found","message":"The requested API endpoint was not found. Are you using the right HTTP verb (i.e. `GET` vs. `POST`), and did you specify your intended version with the `Accept` header?"}

Is it currently broken? Is there a revision that I should try instead?

with force_ssl for rails?

If we're using force_ssl in a rails application then the first time Sabayon runs it is not able to pick up the HTTP endpoint and fails.

This order-of-operations is a bit of a pain to deal with -- and I'm not sure if force_ssl needs to be turned off each time a new cert is needed.

Ideally, this addon would work with force_ssl since that forces browsers to use secure cookies, among other things.

If that's simply not possible due to the LetsEncrypt specification -- is there a recommended way to handle SSL redirection without force_ssl turned on in the Rails application?

Thanks for the help!

rewrite rule for nginx and php

im sorry, i am not able to get the redirect right for php and nginx, maybe you can help me.

i tried with:


location ~ ^/.well-known/acme-challenge/(.*)$ {
    if (!-e $request_filename){
      rewrite ^(.*)$ /.well-known/acme-challenge/index.php?q=$1 last;
      break;
    }
}

location ~ \.php$ {
    try_files @heroku-fcgi @heroku-fcgi;
}

but this results in a downloaded file, so guess the redirect is fine but its not interpreted as php file.

Some clients that work with other letsencypt sites not working

After happily testing my secured app in Chrome on OSX the last day or two I've tested some other browsers and discovered it fails in Firefox OSX and Chrome Android (Your connection is not secure).

After running my domain through ssllabs.com I noticed an issue: "Chain issues: incomplete" For path #2, it lists an extra download, whereas when checking helloworld.letsencrypt.org, path #2 is listed as "sent by server"

Another issue I've noticed is that running $ openssl s_client -connect hellodial.co:443 results in the following failure yet this works for helloworld.letsencrypt.org

Problems with redirect to https

I use express and redirect users to https by default:

var forceSSL = function (req, res, next) {
  if (req.headers['x-forwarded-proto'] !== 'https') {
      return res.redirect(['https://', req.get('Host'), req.url].join(''));
  }
  return next();
};
app.use(forceSSL);  

This lets the domain authentication fail as letsencrypt connects via http. I disabled this redirect for the first certificate generation. Now it is enabled again.

Will this also cause problems when I try to renew my certificate?

Including middleware on Rails

Based on this section of the docs I tried adding
config.middleware.insert_before 0, SabayonMiddleware
to application.rb.

In my case it had to instead be
config.middleware.insert_before 0, 'SabayonMiddleware'

If you're interested the relevant Rails source appears to be
railties-x.x.x/lib/rails/configuration.rb

I'm not sure what the canonical 'Rails way' is on this but posting in hopes others can benefit.


Rails 4.1.16
macOS 10.12.1

Wrapping the Rack middleware in a gem

Firstly, I realise this has been done before (as noted in #25), though I wasn't aware of that when I began.

My approach is simpler - it's really just the middleware, and there's no dependency on Rails. It also should perform a bit better, because it caches the available ACME key/token pairs, rather than finding them from environment variables on every request.
https://github.com/pat/sabayon_middleware

This is offered purely as an alternative to what you've documented in your README. If you think it's useful for others, feel free to mention it there. If you think it is simple enough as a replacement for your middleware, that's great too. If neither of those are the case, no worries :) I've found it's useful for me, and I figure at least logging it here may help others come across it.

Also: thanks for the work on Sabayon, it's pretty neat!

Client times out

When I run the sabayon command it updates the ACME_KEY and ACME_TOKEN config vars of my production app, thus restarting it.

Then it tries to validate against the validation URL, but the app is restarting and sabayon times out.

Status: 404

Hi,

I followed the steps closely and I am getting the following error when trying to run the command manually:

{"id":"not_found","message":"The requested API endpoint was not found. Are you using the right HTTP verb (i.e. GET vs. POST), and did you specify your intended version with the Accept header?"}

Am I doing something wrong here?
Thank you!

ACME DNS challenge

Are there any plans to also integrate the possibility of the DNS challenge and integrate this with e.g. Cloudflare?
The advantage would be that the application code must not be changed.

Error when domain env includes a space around domain name

e.g., paasify.it, www.paasify.it

results in

2016/06/03 12:24:08 [INFO][paasify.it,  www.paasify.it] acme: Obtaining bundled SAN certificate
2016/06/03 12:24:08 acme: Error 400 - urn:acme:error:malformed - Error creating new authz :: Invalid character in DNS name

Can we just auto strip this inside sabayon?

Supporting SSL Endpoint certificates?

Hi @dmathieu. Would you be open to supporting Heroku's legacy SSL Endpoint certificates?

The Heroku API has endpoints for this purpose, and I'm happy to at least attempt a pull request (though my Go skills are almost non-existent). I have one app that's still on the old endpoint, and while I'd love to migrate it, it actually is the main API for a Heroku Add-on, and thus I have customers using old versions of Ruby that annoyingly don't play nicely with the SNI approach.

Just pondering whether it's worth my effort to understand enough of the Go code to make a contribution, and whether it would be merged (if I have to maintain a fork myself, it's probably a better use of my time to just pay the yearly fee for a non-letsencrypt certificate).

Running initial Sabayon causes Heroku app to restart (NodeJS/Express)

After configuring the Sabayon app and running it for the first time, it causes the target application to restart itself multiple times. Furthermore, it isn't successfully creating the certificate after validating everything twice. I've followed all the instructions, but I'm trying to figure out why this might not be working.

Whenever I try to enable the SNI lab, it says

! Couldn't find that feature.

I believe it's because the feature is now a part of Heroku paid plans. What might be going wrong that's causing the app to restart itself?

I'm using a NodeJS & Express app. I'm also running KeystoneJS as a framework, which might be getting in the way.

Is Heroku SSL add-on required?

Hi,

I followed the steps in the guide, but SSL does not seem to work. The correct environmental variables seem to have been populated on Heroku. But adding https:// to my site's URL in the browser shows Heroku's SSL cert, which is a domain mismatch since I'm on my own domain.

Wondering if here is something I'm missing.

Heroku addon

I just integrated this for my company successfully. But it takes a little while to configure and you've got to have a whole app environment for each production environment.

Would anyone else be interested in having a similar benefit packaged in a heroku addon?

Does this handle migrating from SSL:Endpoint to Heroku SSL

I'm trying to get this running on a Heroku app which already has SSL:Endpoint.

The heroku docs say that the following needs to be run heroku certs:add example.crt example.key --type sni. The key piece there being --type sni. Browsing the source I can't tell if this case is covered.

When I try running bin/sabayon I'm getting certs for 2 domains. Both validate but the result is Error 429 - urn:acme:error:rateLimited - Error creating new cert :: Too many certificates already issued for exact set of domains:. I have a hard time believing it's a rate limit issue since this was the first and only time I ran the command for these domains or under this email address.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.