Re: Regression/Bug report: crypt_private_key_file (for crypt_global_private_key) no longer supports inline base64 (from userdb) in dev branch
Ömer Güven via dovecot <[email protected]> Tue, 7 Apr 2026 10:04:32 +0200
| Newsgroups | gmane.mail.imap.dovecot |
|---|---|
| Message-ID | <[email protected]> |
Yes, that didn‘t work either (by removing inline: from the variable and setting it in the config). I discovered yesterday that you can set „crypt_private_key_file“ in userdb and that this sets the global private key file (note that there is no prefix/named filter). I can live with that, but I guess the correct way should‘ve be „crypt_global_private_key/user/crypt_private_key_file“, but latter is non-functional, despite documented. (Named list filter „user“ is set with empty content in config, so it should exist, but isn‘t reachable from userdb…) > Am 07.04.2026 um 07:11 schrieb Aki Tuomi <[email protected]>: > >> On 05/04/2026 22:18 EEST Ömer Güven via dovecot <[email protected]> wrote: >> >> >> Hi, >> >> I’ve run into what appears to be a regression (or at least a behavioral change) in Dovecot 3.3.0+ / current HEAD regarding crypt_private_key_file handling for the crypt_global_private_key. >> >> I don‘t use per-folder user keys but a global encryption key per user. >> >> Previously, it was possible to provide the private key via userdb using an inline base64:-encoded PEM directly to the crypt_global_private_key_file and Dovecot would correctly parse and use it. >> >> With the latest config scheme change, this no longer works, as you cannot really set named config variables from userdb. I did workaround by setting a custom userdb variable and setting the needed named/filter variables manually in the config file. >> To make it work, I had to enclose the config in a „protocol imap“ scope. >> The crypt_global_public_key_file is accessible from userdb (as it is not within a named filter scope), so inline-base64 works as with Dovecot 2.3+. >> >> When using the following workaround to reach the scoped variables, Dovecot tries to load the file „inline:BASE64ENCODEDPEM“ as a literal filename (error open(inline:AB….C==) failed): >> >> protocol imap { >> crypt_global_private_key user { >> crypt_private_key_file = %{userdb:private_key_file} >> crypt_private_key_password = %{userdb:private_key_password} >> } >> } >> >> As a workaround, I now have to: >> • store the private key as a file (e.g. %{home}/privkey.pem) >> • pass only the password via userdb >> • inject the path indirectly via static config + userdb variables >> >> This works, but is less elegant: >> >> protocol imap { >> crypt_global_private_key user { >> crypt_private_key_file = %{home}/privkey.pem >> crypt_private_key_password = %{userdb:private_key_password} >> } >> } >> >> Again, with the new named filter mechanism, it’s no longer possible to directly inject such config values via userdb, which makes fully dynamic per-user key provisioning harder. I now have to export all encrypted private keys from the database to the users home directory. >> >> Ömer >> Hi, >> I've run into what appears to be a regression (or at least a behavioral >> change) in Dovecot 3.3.0+ / current HEAD regarding crypt_private_key_file >> handling for the crypt_global_private_key. >> I don`t use per-folder user keys but a global encryption key per user. >> Previously, it was possible to provide the private key via userdb using an >> inline base64:-encoded PEM directly to the crypt_global_private_key_file >> and Dovecot would correctly parse and use it. >> With the latest config scheme change, this no longer works, as you cannot >> really set named config variables from userdb. I did workaround by setting >> a custom userdb variable and setting the needed named/filter variables >> manually in the config file. >> To make it work, I had to enclose the config in a "protocol imap" scope. >> The crypt_global_public_key_file is accessible from userdb (as it is not >> within a named filter scope), so inline-base64 works as with Dovecot 2.3+. >> When using the following workaround to reach the scoped variables, Dovecot >> tries to load the file "inline:BASE64ENCODEDPEM" as a literal filename >> (error open(inline:AB....C==) failed): > >> } >> >> As a workaround, I now have to: >> o store the private key as a file (e.g. %{home}/privkey.pem) >> o pass only the password via userdb >> o inject the path indirectly via static config + userdb >> variables >> This works, but is less elegant: >> >> protocol imap { >> >> crypt_global_private_key user { >> >> crypt_private_key_file = %{home}/privkey.pem >> >> crypt_private_key_password = %{userdb:private_key_password} >> >> } >> >> } >> >> Again, with the new named filter mechanism, it's no longer possible to >> directly inject such config values via userdb, which makes fully dynamic >> per-user key provisioning harder. I now have to export all encrypted >> private keys from the database to the users home directory. >> Oemer >> _______________________________________________ >> dovecot mailing list -- [email protected] >> To unsubscribe send an email to [email protected] > > > Hi! > > Did you try > > protocol imap { > crypt_global_private_key user { > crypt_private_key_file = inline:%{userdb:private_key_file} > crypt_private_key_password = %{userdb:private_key_password} > } > } > > See https://doc.dovecot.org/2.4.3/core/settings/types.html#file > > Aki _______________________________________________ dovecot mailing list -- [email protected] To unsubscribe send an email to [email protected]