Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for certificates for repositories #3070

Merged
merged 1 commit into from
Jul 19, 2014

Conversation

alexlarsson
Copy link
Contributor

This adds support for a /etc/docker-certs configuration file that allows you to specify tls certificate config.

Currently it has two settings:

  1. You can specify a list of root CAs in case you're using an https repository that is not signed by a default CA

  2. You can specify a per-repository client side certificate and private key to send to the server. This allows the server to e.g. verify that the client is allowed to access a particular image.

I've set up a local apache that serves as a registry with "SSLVerifyClient optional_no_ca" and a cgi script that verifies that you have a valid client side certificate. It works:

# wget --ca-certificate=/etc/pki/tls/certs/localhost.crt https://127.0.0.1/v1/_ping
--2013-12-05 18:59:57--  https://127.0.0.1/v1/_ping
Connecting to 127.0.0.1:443... connected.
HTTP request sent, awaiting response... 403 Client certificate invalid
2013-12-05 18:59:57 ERROR 403: Client certificate invalid.

# docker run 127.0.0.1/busybox echo hello
Unable to find image '127.0.0.1/busybox' (tag: latest) locally
Pulling repository 127.0.0.1/busybox
e9aa60c60128: Pulling image (latest) from 127.0.0.1/busybox 
e9aa60c60128: Pulling image (latest) from 127.0.0.1/busybox, endpoint: https://127.0.0.1/v1/ 
e9aa60c60128: Pulling dependent layers 
e9aa60c60128: Pulling metadata 
e9aa60c60128: Pulling fs layer 
e9aa60c60128: Downloading 532.3 kB
e9aa60c60128: Download complete 
hello

With the following /etc/docker-certs

{
    "roots": ["/etc/pki/tls/certs/ca-bundle.crt", "/etc/pki/tls/certs/localhost.crt"],
    "hosts": {
    "127.0.0.1":  {
        "cert": "/home/alex/client.cert",
        "key": "/home/alex/client.key"
    }
    }
}

@pnasrat
Copy link
Contributor

pnasrat commented Dec 5, 2013

FYI see also #3068

@@ -25,6 +28,82 @@ var (
ErrLoginRequired = errors.New("Authentication is required.")
)

type HostConfig struct {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Config and HostConfig might be confusing as we already have those types in docker.

@creack
Copy link
Contributor

creack commented Dec 5, 2013

This is server side only, It might be interesting to let the client change the certificate?

@alexlarsson
Copy link
Contributor Author

What do you mean by server side? Its not on the server in terms of the https connection to the registry, but it is with respect to the docker client.

It might be nice to be able to specify a custom certificate or root ca on the commandline, but I'm not sure how much that would be used. You generally want to set up the certs for a particular repository on the system once, and then use docker like normal without having to always specify it on the command line.

@creack
Copy link
Contributor

creack commented Dec 5, 2013

@alexlarsson I mean daemon side. We have this arch: client ---> daemon (server) ---> registry.

When you have the client and daemon on different machine, you might still want to be able to specify certificates.

@alexlarsson
Copy link
Contributor Author

@creack Eh? Thats exactly what this does?

You can specify the root certificates to use when the daemon does a https call to the registry.
You can also specify for a particular registry if you want to send a client side certificate to the registry when you're downloading stuff from that registry.

The whole point here is that I want to be able to set up an ISV registry (say e.g. registry.company.com) that requires a client certificate. So, when i do "docker run registry.company.com/product" i will get a HTTP/403 unless I have on my machine a valid certificate for that product.

@alexlarsson
Copy link
Contributor Author

Oh, i see what you mean, you want the client to forward the cert data so that the deamon can use it when talking to the registry?

@alexlarsson
Copy link
Contributor Author

(Its actually a bit more complex, because the client also calls registry.ExpandAndVerifyRegistryUrl() which needs the root CAs set, or it will fall back to the http (non-https) registry.)

@SvenDowideit
Copy link
Contributor

@alexlarsson can you write up some documentation for this please (including how to setup the server side, and make the client side certs)? I'm guessing a howto in docs/sources/use would be great - perhaps with a reference to it in some of the other relevant docs.

I like the idea that if this is in core already, we could then use the same mechanism to (optionally or default) secure the tcp port on the docker daemon.

@alexlarsson
Copy link
Contributor Author

@SvenDowideit Well, currently it is kinda tricky to set up the server side for client side certs, I just had a custom apache config hack to test it. I could put it up somewhere, but its not really a production thing. It would probably be better to add support for it in the docker registry code instead.

For the root CAs its pretty simple though, you just specify the CAs.

@alexlarsson
Copy link
Contributor Author

I can describe my test setup if someone else wants to test it. It is based on http://atodorov.org/blog/2011/09/15/protected-rpm-repositories-with-yum-and-ssl/

First of all, i have on my machine apache2 running with modssl. It has a non-root signed certificate, so I have
a custom cert signed for 127.0.0.1 at /etc/pki/tls/certs/localhost.crt.

Secondly, i have a client key generated via:
openssl genrsa -out /home/alex/client.key 1024
openssl req -new -x509 -text -key /home/alex/client.key -out /home/alex/client.cert

Then i expanded http://people.gnome.org/~alexl/v1.tar.gz in the /var/www/html/ directory, which contains all the files needed for a registry to serve out the "busybox" image.

Then i needed to configure apache to 1) work as a registry and 2) verify client certs
I added this as /etc/httpd/conf.d/registry.conf:

# This must be in the root context, otherwise it causes a re-negotiation
# which is not supported by the tls implementation in go
SSLVerifyClient optional_no_ca

<Location /v1>
Action cert-protected /cgi-bin/cert.cgi
SetHandler cert-protected

Header set x-docker-registry-version "0.6.2"
SetEnvIf Host (.*) custom_host=$1
Header set X-Docker-Endpoints "%{custom_host}e"
</Location>

and /var/www/cgi-bin/cert.cgi:

#!/bin/bash
if [ "$SSL_CLIENT_VERIFY" != "NONE" ]; then
    echo "Content-length: $(stat --printf='%s' $PATH_TRANSLATED)"
    echo "x-docker-registry-version: 0.6.2"
    echo "X-Docker-Endpoints: $SERVER_NAME"
    echo "X-Docker-Size: 0"
    echo

    cat $PATH_TRANSLATED
else
    echo "Status: 403 Client certificate invalid"
    echo "x-docker-registry-version: 0.6.2"
    echo
fi

This causes apache to accept (any) valid client certificate (or give 403), and emit the headers that docker relies on:

# wget https://127.0.0.1/v1/images/e9aa60c60128cad1/json
--2013-12-06 11:51:06--  https://127.0.0.1/v1/images/e9aa60c60128cad1/json
Connecting to 127.0.0.1:443... connected.
ERROR: cannot verify 127.0.0.1's certificate, issued by ‘/O=Acme Co’:
  Self-signed certificate encountered.
To connect to 127.0.0.1 insecurely, use `--no-check-certificate'.

# wget --ca-certificate=/etc/pki/tls/certs/localhost.crt https://127.0.0.1/v1/images/e9aa60c60128cad1/json
--2013-12-05 18:59:57--  https://127.0.0.1/v1/images/e9aa60c60128cad1/json
Connecting to 127.0.0.1:443... connected.
HTTP request sent, awaiting response... 403 Client certificate invalid
2013-12-05 18:59:57 ERROR 403: Client certificate invalid.

# wget -S --certificate=/home/alex/client.cert --private-key=/home/alex/client.key --ca-certificate=/etc/pki/tls/certs/localhost.crt https://127.0.0.1/v1/images/e9aa60c60128cad1/json
--2013-12-06 11:49:59--  https://127.0.0.1/v1/images/e9aa60c60128cad1/json
Connecting to 127.0.0.1:443... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Date: Fri, 06 Dec 2013 10:49:59 GMT
  Server: Apache/2.4.6 (Fedora) OpenSSL/1.0.0-fips PHP/5.5.5 mod_perl/2.0.8-dev Perl/v5.16.3
  x-docker-registry-version: 0.6.2
  X-Docker-Endpoints: 127.0.0.1
  X-Docker-Size: 0
  Content-length: 322
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
Length: 322
Saving to: ‘json’

100%[==============================================================>] 322         --.-K/s   in 0s      

2013-12-06 11:49:59 (12.0 MB/s) - ‘json’ saved [322/322]

I then add the configuration for docker in cat /etc/docker-certs

{
    "roots": ["/etc/pki/tls/certs/ca-bundle.crt", "/etc/pki/tls/certs/localhost.crt"],
    "hosts": {
    "127.0.0.1":  {
        "cert": "/home/alex/client.cert",
        "key": "/home/alex/client.key"
    }
    }
}

And can then use it:

# docker run 127.0.0.1/busybox echo hello
Unable to find image '127.0.0.1/busybox' (tag: latest) locally
Pulling repository 127.0.0.1/busybox
e9aa60c60128: Pulling image (latest) from 127.0.0.1/busybox 
e9aa60c60128: Pulling image (latest) from 127.0.0.1/busybox, endpoint: https://127.0.0.1/v1/ 
e9aa60c60128: Pulling dependent layers 
e9aa60c60128: Pulling metadata 
e9aa60c60128: Pulling fs layer 
e9aa60c60128: Downloading 532.3 kB
e9aa60c60128: Download complete 
hello

@alexlarsson
Copy link
Contributor Author

New version just renamed to RegistryConfig and RegistryHostConfig

@bodenr
Copy link

bodenr commented Dec 6, 2013

@alexlarsson +1 for the support in this PR.

I will try to find time to try out your changes in the next few days. In particular I'm trying to use docker-registry fronted by nginx with SSL enabled as outlined here: https://github.com/dotcloud/docker-registry#nginx However in my env I created the SSL certs with SAN IP/DNS as outlined here: http://grevi.ch/blog/ssl-certificate-request-with-subject-alternative-names-san

@discordianfish
Copy link
Contributor

@creack Asked me whether it's difficult to unify tls support from #3068 and this PR:

Well, we could configure the keys via the command line flags as in my PR - or configure the keys in my PR via a similar/same configuration file as here. This is more a question of taste.

Anyways, since the daemon is a client to the registry, it needs:

  • from my PR:
  • - server certificate + key so that client can connect via TLS
  • - ca certificate to authenticate clients trying to connect to it
  • from this PR
  • - client certificate + key for the registry to authenticate
  • - ca certificate to authenticate registry

Which means hell a lot of keys and certificates - but sure, it's possible and should be that hard. We could just pass the tls config from somewhere we have access to the flags to registry.NewRegistry.

@alexlarsson
Copy link
Contributor Author

I don't see the point of passing keys via the commandline (or rather, it may be useful in corner cases, but for day to day use it would be totally painful). But, there "config file" case is slightly complex in the certificate-for-registry case in that you may have a config file either on the machine the client runs on or the one that the daemon runs on, and if it is the earlier you have to actually forward the cert data rather than just the filenames. Although there are some risks forwarding private keys like that, so maybe that is not a great setup in practice.

@creack
Copy link
Contributor

creack commented Jan 3, 2014

@discordianfish @alexlarsson Tentatively scheduling for 0.7.4 next week. Let's make this happen!

@denibertovic
Copy link
Contributor

@alexlarsson Just a small nitpick: Do we really need to introduce another file (ie. /etc/docker-certs if i'm not mistaken) ? Can't we just use /etc/default/docker that we already have by default. If not then we can at least just use /etc/docker.conf or something like that, not cert specific.

@alexlarsson
Copy link
Contributor Author

@denibertovic
Some of the current init scripts do source /etc/default/docker, so if we use environment variables for these config options then it would be possible to use that file. However, doing per-host configuration via env vars seems pretty ugly to me. Do we store json maps in the env vars?

Furthermore, that file will only be read by the server. This means it cannot be used to configure certificates for the client. It also causes trouble for auto-guessing repository addresses, as if the client sees "my.local.server/my-image" and fails to connect to it because it is not using the same certs as the daemon would then it will not properly expand it to the right url and the docker commands will fail.

@alexlarsson
Copy link
Contributor Author

Neither this commit or any of the other various related cert PRs are very hard. All they do is juggle around some config options and enable them at the right place. The problem imho is to have a decent unified "UI" design for all the separate configurations that are possible:

SSL protected client<->daemon connection

  • daemon: Enable SSL, specify host cert
  • client: Specify custom root certs in case the daemon host cert is not trusted by a standard CA.

Authenticate client<->daemon connection

  • client: Specify which cert to pass to to the daemon
  • daemon: Specify how clients certs are to be verified (by a ca cert in PR#3068)

SSL protected daemon<->repository connection

  • daemon: Specify custom root certs in case the repository host cert is not trusted by a standard CA.
  • client: Must use the same as the above when expanding repository names to uris

Authenticated daemon<->repository connection

  • daemon: Specify per-repository certs/keys that will be sent when connecting via tls, which are verified by the repository to allow access
  • client: Must use the same as the above when expanding repository names to uris

All of these could be specified in multiple ways, depending on what we want. Like e.g. a config file, command line args, or env vars. However, to be practical I don't think we should only support commandline, as that would make each docker command very long when you're working with authenticated servers. There is also the added complexity that specifying e.g. a cert file on the command line of the client means we have to actually upload it to the daemon rather than pass the filename as the files may not be on the same machine.

Personally I think it would be easiest if all these were specified in the same (optional) config file in /etc. That way one could easily put it there to have both the daemon and the client read it. We should probably also have some of the options available as command line options on the client and on the daemon for easy testing.

The question to me is, do we make this a cert only config file or do we have other potential daemon configuration we want to put in there?

@denibertovic
Copy link
Contributor

I'm not sure how you and @discordianfish were going to merge you're 2 approaches. I was just nitpicking about the file name.

@alexlarsson
Copy link
Contributor Author

@denibertovic Well, the docker developers in general seem to dislike configuration files, which is why I made it a cert file configuration only. If the maintainers agree on using a generic config file we should probably call it /etc/docker.conf.

@vbatts
Copy link
Contributor

vbatts commented Mar 6, 2014

This is great, and is a business-case requirement for us. One small tweak that include several edge cases, would be to make the cert/key for a registry to be a list, rather than a single pair. Like

{
    "roots": ["/etc/pki/tls/certs/ca-bundle.crt", "/etc/pki/tls/certs/localhost.crt"],
    "hosts": {
    "127.0.0.1":  [ {
        "cert": "/home/alex/client-A.cert",
        "key": "/home/alex/client-A.key"
    },
    {
        "cert": "/home/alex/client-B.cert",
        "key": "/home/alex/client-B.key"
    } ]
    }
}

In the certificate interaction on Red Hat, you may be provided multiple cert/key pair depending on permutations of products and registration. There is encoded data in these certs that behave differently on the server-side. While this describes a specific process, the use case also applies to cert life cycling, where you may be provided future certs, and still use current valid cert.

As to how this ought to behave, I imagine it would try the first pair, and if it's a 403 or 5xx then proceed to the next pair. If a 200 or 404, then return.

@alexlarsson
Copy link
Contributor Author

I rebased the branch to current master. Will now try to look at the other ssl stuff that landed and integrate with that.

@alexlarsson
Copy link
Contributor Author

Ok. i pushed a new version of this which doesn't use the json config file, but rather just a simple filesystem layout. I'll duplicate the (long) commit text here for easy reading:

Add support for client certificates for registries

This lets you specify custom client TLS certificates and CA root for a specific registry hostname. Docker will then verify the registry against the CA and present the client cert when talking to that registry. This allows the registry to verify that the client has a proper key, indicating that the client is allowed to access the images.

A custom cert is configured by creating a directory in /etc/docker/certs with the same name as the registry hostname. Inside this directory all *.crt files are added as CA Roots (if none exists, the system default is used) and pair of files $filename.key and $filename.cert indicate a custom certificate to present to the registry.

If there are multiple certificates each one will be tried in alphabetical order, proceeding to the next if we get a 403 of 5xx response.

So, an example setup would be:

/etc/docker/certs/
└── localhost
    ├── client.cert
    ├── client.key
    └── localhost.crt

A simple way to test this setup is to use an apache server to host a registry. Just copy a registry tree into the apache root, here is an example one containing the busybox image:
http://people.gnome.org/~alexl/v1.tar.gz

Then add this conf file as /etc/httpd/conf.d/registry.conf:

# This must be in the root context, otherwise it causes a re-negotiation
# which is not supported by the tls implementation in go
SSLVerifyClient optional_no_ca

<Location /v1>
Action cert-protected /cgi-bin/cert.cgi
SetHandler cert-protected

Header set x-docker-registry-version "0.6.2"
SetEnvIf Host (.*) custom_host=$1
Header set X-Docker-Endpoints "%{custom_host}e"
</Location>

And this as /var/www/cgi-bin/cert.cgi

#!/bin/bash
if [ "$HTTPS" != "on" ]; then
    echo "Status: 403 Not using SSL"
    echo "x-docker-registry-version: 0.6.2"
    echo
    exit 0
fi
if [ "$SSL_CLIENT_VERIFY" == "NONE" ]; then
    echo "Status: 403 Client certificate invalid"
    echo "x-docker-registry-version: 0.6.2"
    echo
    exit 0
fi
echo "Content-length: $(stat --printf='%s' $PATH_TRANSLATED)"
echo "x-docker-registry-version: 0.6.2"
echo "X-Docker-Endpoints: $SERVER_NAME"
echo "X-Docker-Size: 0"
echo

cat $PATH_TRANSLATED

This will return 403 for all accessed to /v1 unless any client cert is presented. Obviously a real implementation would verify more details about the certificate.

Example client certs can be generated with:

openssl genrsa -out client.key 1024
openssl req -new -x509 -text -key client.key -out client.cert

@SvenDowideit
Copy link
Contributor

awesome - Can you add the above text as a new doc in docs/sources/use/ please?

@alexlarsson
Copy link
Contributor Author

@SvenDowideit Added

@SvenDowideit
Copy link
Contributor

Docs LGTM merci - hopefully I'll get to test it soon too

Using certificates for repository client verification
=====================================================

This lets you specify custom client TLS certificates and CA root for a specific registry hostname. Docker will then verify the registry against the CA and present the client cert when talking to that registry. This allows the registry to verify that the client has a proper key, indicating that the client is allowed to access the images.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @alexlarsson,

Can you cap the line-length at 80 chrs. max please?

@alexlarsson
Copy link
Contributor Author

Updated reflowed docs.

@alexlarsson
Copy link
Contributor Author

The CAs used here are very special. I don't think you want to add those to the system default CAs. Also, with the per-user configs you can't modify the system CAs.

Wrt distributing the client certs. This may have uses for others, but for the usecase we're looking at for this the client certificates will be the entitlement of the machine running the code, and which is something owned by each node, not something that is per-user.

@aweiteka
Copy link

For Red Hat based distros we want to support using the host subscription certificates. With this model we'll need to add links like this:

$ ls -l ~/.docker/redhat.com/*
lrwxrwxrwx. 1 root root 44 Apr 23 16:18 client-cert.pem -> /etc/pki/entitlement/123456789.pem
lrwxrwxrwx. 1 root root 48 Apr 23 16:17 client-key.pem -> /etc/pki/entitlement/123456789-key.pem
lrwxrwxrwx. 1 root root 27 Apr 23 16:16 redhat-uep.pem -> /etc/rhsm/ca/redhat-uep.pem

I would prefer a configfile or NSS DB implementation a la ~/.pki/nssdb but basic support now is preferred over waiting indefinitely for the "perfect" solution.

@alexlarsson
Copy link
Contributor Author

Any more feedback on this? Its pretty important to us.

@alexlarsson
Copy link
Contributor Author

@shykes ping?

@shykes
Copy link
Contributor

shykes commented May 8, 2014

#assignee=shykes

@alexlarsson
Copy link
Contributor Author

Updated code: rebase on master, converted docs to md, changed /etc/docker/certs to /etc/docker/certs.d

@SvenDowideit
Copy link
Contributor

Docs LGTM

@alexlarsson
Copy link
Contributor Author

Rebased on master

This lets you specify custom client TLS certificates and CA root for a
specific registry hostname. Docker will then verify the registry
against the CA and present the client cert when talking to that
registry.  This allows the registry to verify that the client has a
proper key, indicating that the client is allowed to access the
images.

A custom cert is configured by creating a directory in
/etc/docker/certs.d with the same name as the registry hostname. Inside
this directory all *.crt files are added as CA Roots (if none exists,
the system default is used) and pair of files <filename>.key and
<filename>.cert indicate a custom certificate to present to the registry.

If there are multiple certificates each one will be tried in
alphabetical order, proceeding to the next if we get a 403 of 5xx
response.

So, an example setup would be:
/etc/docker/certs.d/
└── localhost
    ├── client.cert
    ├── client.key
    └── localhost.crt

A simple way to test this setup is to use an apache server to host a
registry. Just copy a registry tree into the apache root, here is an
example one containing the busybox image:
  http://people.gnome.org/~alexl/v1.tar.gz

Then add this conf file as /etc/httpd/conf.d/registry.conf:

 # This must be in the root context, otherwise it causes a re-negotiation
 # which is not supported by the tls implementation in go
 SSLVerifyClient optional_no_ca

 <Location /v1>
 Action cert-protected /cgi-bin/cert.cgi
 SetHandler cert-protected

 Header set x-docker-registry-version "0.6.2"
 SetEnvIf Host (.*) custom_host=$1
 Header set X-Docker-Endpoints "%{custom_host}e"
 </Location>

And this as /var/www/cgi-bin/cert.cgi

 #!/bin/bash
 if [ "$HTTPS" != "on" ]; then
     echo "Status: 403 Not using SSL"
     echo "x-docker-registry-version: 0.6.2"
     echo
     exit 0
 fi
 if [ "$SSL_CLIENT_VERIFY" == "NONE" ]; then
     echo "Status: 403 Client certificate invalid"
     echo "x-docker-registry-version: 0.6.2"
     echo
     exit 0
 fi
 echo "Content-length: $(stat --printf='%s' $PATH_TRANSLATED)"
 echo "x-docker-registry-version: 0.6.2"
 echo "X-Docker-Endpoints: $SERVER_NAME"
 echo "X-Docker-Size: 0"
 echo

 cat $PATH_TRANSLATED

This will return 403 for all accessed to /v1 unless *any* client cert
is presented. Obviously a real implementation would verify more details
about the certificate.

Example client certs can be generated with:

openssl genrsa -out client.key 1024
openssl req -new -x509 -text -key client.key -out client.cert

Docker-DCO-1.1-Signed-off-by: Alexander Larsson <alexl@redhat.com> (github: alexlarsson)
@alexlarsson
Copy link
Contributor Author

Rebased again.

@shykes Any chance you can have a look at this next week?

├── client.key
└── localhost.crt

A simple way to test this setup is to use an apache server to host a
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apache.

@shykes
Copy link
Contributor

shykes commented Jul 19, 2014

Code looks fine, no regression in the automated tests. Doesn't break on existing registry endpoints.

We've been trying to test this against a registry setup which requires client certs. Right now 'docker pull' fails with an error 400, probably a SSL configuration error.

If anybody has a Docker image of this test environment, that would be great. There's a starting point on https://github.com/shykes/test-registry

Once we overcome this issue, I see no obstacle to merging.

@crosbymichael
Copy link
Contributor

LGTM

2 similar comments
@shykes
Copy link
Contributor

shykes commented Jul 19, 2014

LGTM

@vieux
Copy link
Contributor

vieux commented Jul 19, 2014

LGTM

shykes pushed a commit that referenced this pull request Jul 19, 2014
@shykes shykes merged commit c7bc929 into moby:master Jul 19, 2014
bfirsh added a commit to bfirsh/docker that referenced this pull request Jul 19, 2014
Introduced in moby#3070

Docker-DCO-1.1-Signed-off-by: Ben Firshman <ben@firshman.co.uk> (github: bfirsh)
shykes pushed a commit to shykes/docker-dev that referenced this pull request Oct 2, 2014
Introduced in moby/moby#3070

Docker-DCO-1.1-Signed-off-by: Ben Firshman <ben@firshman.co.uk> (github: bfirsh)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet