Am 14.04.2016 um 02:57 schrieb Daniel Ruggeri:
On 4/13/2016 2:22 PM, Rainer Jung wrote:
We could pass the worker name from mod_proxy to mod_ssl via a
connection note, similar to currently already passing the SNI name via
the connection note proxy-request-hostname.
+1 on the connection note idea, but see below about having to inform the
callback function about too much information
On 4/13/2016 10:04 AM, Graham Leggett wrote:
What I had in mind was a syntax where the certs were named, for example:
SSLProxyCertificate foo /path/to/foo.cert
Followed somewhere else by:
<Proxy …>
SSLProxyEnable foo
</Proxy>
On one hand, this is an attractive idea because we have already
conditioned users/administrators to think about naming things via config
as you can do with authn providers and aliases.
On another hand, there are two gotchas I see. Giving something a name in
the configuration does not necessarily mean anything to the file or
certificate store because they aren't married in the same way that authn
providers and their aliases are. That is, if a different team/individual
manages the certificate store than the server configuration, the two
would have to keep in sync with additions or removals. This can be a
PITA if you have a short certificate lifecycle and have to renew often.
PLUS, there are cases where there may be many certificates in the file.
Combine that with the previous point and you could have a nightmare.
Perhaps in addition to or instead of aliases via config, something more
"dynamic" could be used where a DN, CN or some other attribute about the
cert that was parsed during startup becomes the representation?
<vhost...>
...
#As today
SSLProxyMachineCertificateFile /path/to/file
<Proxy ...>
#Plus new stuff
SSLProxyMachineCertificateCN myIdentity
#or
SSLProxyMachineCertificateDN /C=US/ST=Missouri/L=St.
Louis/O=BitNebula/CN=DanielRuggeri.bitnebula.com
</Proxy>
</vhost>
This could be a really clean solution because the proxy can just pass
this name or DN to the ssl module in a note and the ssl module could
make the selection of certs from that data.
Stashing this (completely untested and thrown together) code around line
1778 in modules/ssl/ssl_engine_kernel.c could be all that's needed in
mod_ssl....
char *preferred_name;
......
if (preferred_name) {
for (i = 0; i < sk_X509_INFO_num(certs); i++) {
X509_NAME *name;
info = sk_X509_INFO_value(certs, i);
name = X509_get_subject_name(inf->x509);
for(j = 0; j < X509_NAME_entry_count(name); j++) {
const char *this_name = //something
if (strcmp(preferred_name, this_name) == 0) {
modssl_proxy_info_log(c, info, APLOGNO(02279)
"found acceptable cert");
modssl_set_cert_info(info, x509, pkey);
return TRUE;
}
}
}
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, APLOGNO(000000)
SSLPROXY_CERT_CB_LOG_FMT
"server configuration requested certificate name %s"
"but it was not found in the certificate store",
preferred_name);
}
I haven't cracked open the proxy code to see what it would take to
collapse this down to a per proxy/worker/etc, but it doesn't seem like
terrible endeavor.
Yeah that's looks very feasible and would allow the actual use case. I
was wondering whether more SSLProxy* directives would benefit from a per
backend config possibility. And as a variation of Graham's suggestion, I
was thinking about (example)
<Proxy http://mycluster>
SSLProxyMachineCertificateFile /path/to/file
... proxy settings ...
</Proxy>
In the vhost config we would not then have an array or hash of ssl proxy
ocnfig setting. The key to the hash would be "http://mycluster" in the
example above. And mod_proxy would forward "http://mycluster" to mod_ssl
via connection notes to allow mod_ssl to select the right proxy ssl config.
So there would be no additional name "foo", instead we would reuse the
name of the worker from the surrounding proxy block. The selection of
the certificate would still happen based on the CA, but it would be
selected from the right store (the one associated with "http://mycluster").
I see your point about having to administer more ssl files outside of
the config, ie. client cert files or directories per backend. I would
hope that those would be manageable by choosing some naming convention
for the file names.
Your idea to allow selecting a client cert based on CN or DN sounds
attractive to me as well. But since it wouldn't help with other per
backend settings (like different Verify settings) we might even think
about combining both. As long as your only problem would be client
certs, you can select via CN or DN and keep the config vhost global, but
once you need more adjustments per backend, you would start to configure
SSLProxy* inside <Proxy ...>.
WDYT?
Regards,
Rainer