On 14.11.2013 12:54, Joe Orton wrote:
> I've also always been a sceptic of this (mis)feature, so I hate to be 
> one to defend it.  But demand comes from:
> 
> a) people who want the ability to do filesystem backups without exposing 
> private keys to the set of admins who can read such backups; or e.g. 
> stick keys on NFS mounts, a similar requirement there.

Hmm ok, these can be considered (IMO somewhat contrived) use cases,
though I think it's possible to suggest workarounds should we decide to
completely drop support for encrypted private keys (e.g. exclude the
unencrypted key from the backup, and store an encrypted one in parallel
/ decrypt the encrypted files to a RAM disk and let httpd load them from
there and similar).

Let me note that that "other" popular open-source HTTP server doesn't
have any useful support for encrypted private keys... it will just pop
up OpenSSL's default "Enter PEM pass phrase:" prompt (once for each
ssl_certificate_key directive, with a single chance of entering the
correct pass phrase for each), and on receiving SIGHUP will simply abort
the config reload. IOW, lack of support for encrypted private keys does
not seem like a "must have" feature for an HTTP server these days.

> b) people who like or are required to follow "security by checklist" or 
> "security by regulator"; some auditor has "No Plaintext Keys !!!" on the 
> checklist, and so we must not use plaintext keys, no argument.

Oh yes these auditors I like in particular. Probably the same ones who
think that not ticking the "Mark this key as exportable" option when
importing a key into the Windows cert store does indeed prevent people
from extracting them (see
https://www.isecpartners.com/tools/application-security/jailbreak.aspx
for evidence to the contrary).

> I'm most sceptical of all about (b) as motivation for increasing 
> software complexity, but (a) I can at least appreciate.

Does this mean you would object to the eventual removal of support for
encrypted private key files in mod_ssl?

To get a step further, I put a snapshot of my WIP patch for lifting the
"no more than 3 certs/keys" limit with ssl_pphrase_Handle etc. under

  https://people.apache.org/~kbrand/mod_ssl_pkey_2013-11-17_wip.patch

It includes a fairly large number of changes (which I would most likely
split into smaller pieces when committing to trunk), but my hope is that
other people could give it a try and provide feedback. Brief list of
notable changes:

- do not index keys by algorithm (use a simple int index)

- repurpose ssl_pphrase_Handle as ssl_load_encrypted_pkey (and
  only use when needed, i.e. when encountering an encrypted key)

- change the prompt for the "builtin" dialog to also show the
  filename (but drop the algorithm type, also for the "exec" dialog)

- remove the "myCtxVarGet abomination" (replace with a pphrase_cb_arg_t
  struct, which currently keeps most of the existing variable names,
  for the sake of better comparability with the previous code)

- move the SSL_CONF_cmd invocations after the ssl_init_server_cert
  call, so that it can be used as either a complement of
  the SSLCertificate[Key]File directives, or as a substitute
  (when including "PrivateKey" and "Certificate" commands)

- drop SSL_read_X509 from ssl_util_ssl.c (no longer needed)

- remove SGC related bits (SGC has been dead for years)

- drop the code for supporting SSLPKCS7CertificateFile (was never
  documented, either SSLCertificateChainFile and/or SSLCertificateFile
  serve the same purpose, and a PKCS#7 file can be trivially converted
  into a file for use with SSLCertificateChainFile)

One issue I'm facing with the current implementation is that when
relying on SSL_CTX_use_certificate_file/
SSL_CTX_use_certificate_chain_file to configure the cert, there's no way
to get at the X509 * which really got configured for the SSL_CTX
(remember that we're compiling with OPENSSL_NO_SSL_INTERN for OpenSSL
1.0.0 or later).

Steve, could you consider adding SSL_CTX_get_certificate, which would
allow retrieving the "current cert" (i.e. one set by the last
SSL_CTX_use_certificate* call)? And perhaps SSL_CTX_get_privatekey as
its companion, at the same time? Without SSL_CTX_get_certificate at
least, we can't call ssl_stapling_init_cert, unfortunately.

Feedback would be much appreciated (in particular from people who rely
on encrypted keys and could give the patch a try with their existing
config).

Kaspar

Reply via email to