Re-opening the database with WebAuthn User Verification
Checks
- [x] I have read the Wiki, searched the open issues, and still think this is a new bug.
Explain the problem clearly and succinctly:
With an already unlocked database KeePassDX does not require to re-open the database when asked to do WebAuthn with User Verification.
Describe what you expected to happen:
KeePassDX would perform User Verification that is ask to re-open the database if it is already open.
KeePassDX version:
4.2.4
Build:
Free
Database version:
No response
File provider (content:// URI)
No response
Android version:
No response
Android device:
No response
Additional context:
User Verification should be done regardless of whether the database has been unlocked earlier or not. Seems like the behaviour is the same as with KeePassXC: https://passkeys.dev/docs/reference/known-issues/ . KeePassDX isn't on the known-issues-list yet because passkey support in KeePassDX is so new but it will soon be on the list I think.
When User Verification isn't performed correctly the authentication isn't multi factor. If the requirement is multi factor KeePassDX users will have to be asked for another factor of authentication like a password while other passkey users can log in without one. I run an authentication middleware service and I would like to offer KeePassDX users an easier life by not asking them for an additional factor of authentication.
P.S. Thank you for implementing passkey support in KeePassDX. Support in open source Passkey Providers for phones has scarce. Also kudos for getting KeePassDX on the aaguid.json list pretty quickly. I use that list for names and logos in the passkey registration UI.
I don't understand the workflow you are asking for. Do you want to close the database that is just already open by the user and then ask to open it again? We need to ask ourselves why verification is necessary. If the database is open, it means that the user has just authenticated themselves or that he changed the close settings to keep authentication active (or in this case, the database open) for longer and that's his choice, so that means it has been verified in any case.
Seems like the behaviour is the same as with KeePassXC
That's normal, we came to the same conclusions. That's the whole principle behind KeePass: if the database is open, it means that the user has been authenticated and verified.
KeePassDX isn't on the known-issues-list yet because passkey support in KeePassDX is so new but it will soon be on the list I think.
It would be a misinterpretation if KeePassDX were on that list. As I think it's a misinterpretation for KeePassXC.
Let's imagine that KeePassDX had set this behavior of closing the database before authentication as the default setting. Everyone would disable this feature one way or another. If we impose it without setting, users will not understand why it is necessary, and a version without this behavior will inevitably appear.
P.S. Thank you for implementing passkey support in KeePassDX. Support in open source Passkey Providers for phones has scarce. Also kudos for getting KeePassDX on the aaguid.json list pretty quickly. I use that list for names and logos in the passkey registration UI.
This is a major security feature, and if only closed-source or online credential providers were available, people would not have realized that the technology can be used with better privacy only locally.
Whether to close the database or not is just a technicality. I suggested that as the most straightforward solution because some users prefer to just use a password for the database while someone else might want to use biometrics while the third person may want to use the Screen Lock. What ever is used for User Verification should probably be the same thing that is used to open the database because that is what the user wants and is familiar with.
The core of the issue is User Verification. The passkey dev community and the Passkey Provider implementators by and large interpret that returning the UV flag to the RP to mean that UV has been done right now. Not 5 minutes ago or an hour ago or what ever the timeout is. A concrete example of a problematic situation would be you forgetting your phone on the table when going to refill your drink in McDonalds: a 3rd party can take your phone and log in anywhere they want with KeePassDX telling the RP that it has verified that this user is who he claims to be.
The passkey dev community by and large plus the vast majority of Passkey Provider implementations require that UV is done right now if they are to tell the RP that it has been done. As someone who operates an authentication middleware service it isn't for me to decide what I consider to be adequately strong authentication. I only offer what each service requests and when I know that an authenticator interprets the spec in a lax manner returning the UV flag when it hasn't actually been performed I can't trust that flag. I have to ask KeePassDX (and KeePassXC) users to provide a password on top of the passkey when ever MFA is required. Having the token (phone in this case) is one factor and UV is the second factor. When I can't trust that UV has really been done I have to find some other way to provide the second factor of authentication which is gonna be way less convenient for the user.
The passkey dev community and the Passkey Provider implementators by and large interpret that returning the UV flag to the RP to mean that UV has been done right now. Not 5 minutes ago or an hour ago or what ever the timeout is.
I understand the idea, but I'm going to play devil's advocate. Can you tell me where to find the documentation that says it's about time, because I've never seen that.
https://www.w3.org/TR/webauthn-2/#user-verification : User verification MAY be instigated through various authorization gesture modalities; for example, through a touch plus pin code, password entry, or biometric recognition (e.g., presenting a fingerprint) [ISOBiometricVocabulary]. The intent is to distinguish individual users.
https://web.dev/articles/webauthn-user-verification : User verification is an optional layer of security that seeks to assert that the correct person was present during authentication, not just some person, as user presence asserts. On smartphones, this is usually done by using the screen-lock mechanism, whether that be a biometric or either a PIN or password. Whether user verification was performed is reported in the "UV" flag that is returned in the authenticator data during passkey registration and authentication
In the case of KeePass, this is done when the database is opened. The purpose of KeePass is to let users manage their own storage and authentication methods. If we explain clearly that an open KeePass database in KeePassDX is equivalent to an authenticated and verified user, then there is no reason why this should not correspond to the definition.
A concrete example of a problematic situation would be you forgetting your phone on the table when going to refill your drink in McDonalds: a 3rd party can take your phone and log in anywhere they want with KeePassDX telling the RP that it has verified that this user is who he claims to be.
The entire implementation of KeePass is based on the assumption that an open database implies that the user is currently using it. This means that he opened his database to perform an action on his credentials. If he puts down his phone and doesn't lock his database, it's clearly his fault. There are tons of ways to easily lock a database with KeePassDX.
Afterwards, in most cases when you want to use the database for Passkey, it is already closed, so that meets the need. But honestly, in your scenario, User Verification is the least of his worries, the database is already open, so the Passkeys and any credentials are clearly accessible in entries.
And to go further, the problem would be the same if the user had already connected to the middleware before leaving their phone on the table, it stays connected for a certain amount of time, even if it only concerns a single service. And what if someone duplicates a fingerprint from a glass? We can always find a way around it.
I only offer what each service requests and when I know that an authenticator interprets the spec in a lax manner returning the UV flag when it hasn't actually been performed I can't trust that flag
Honestly, I don't think I'm interprets the spec in a lax manner. Just because it doesn't match what you're used to seeing doesn't mean it's not a correct implementation.
I have to ask KeePassDX (and KeePassXC) users to provide a password on top of the passkey when ever MFA is required. Having the token (phone in this case) is one factor and UV is the second factor. When I can't trust that UV has really been done I have to find some other way to provide the second factor of authentication which is gonna be way less convenient for the user.
Even if we implement another user validation system from KeePassDX, other middleware will not bother to look at the implementation and will add another factor anyway, which will be a double penalty.
For me, the issue is more about informing. I could improve the onboarding process by clearly stating that the database must be closed after each use. It is the user's responsibility to manage their database; it has always been that way, and that is why KeePass exists. I am of course open to discussion.
I don't have a strong opinion either way about who is right and who is wrong. Maybe you are right and the industry norm is wrong. In any case the expectation in the industry is that when the UV flag is set it means that UV was performed specifically for the login event in question.
The issue is that KeePassDX doesn't treat UV the way that the established norm in the industry is. It does something unexpected. Some sites are unwilling to use authenticators that aren't in the official FIDO metadata at all because you can never know what you get. I try to allow authenticators as widely as possible but bring them all to about the same level by requesting an additional factor of authentication when necessary.
Right now I am asking KeePassDX (and KeePassXC) users for an additional factor of authenticaton because the UV flag doesn't mean what it means by the established industry norm. I would 100% stop asking for another factor of authentication if the UV flag was in line with the established industry norm.
I totally get where you're coming from, and it's pretty cool to warn people. Companies don't always think of every possible scenario, so it's up to us to communicate.
If this really needs to be implemented, would it be enough to simply add the verification already in place to unlock the phone?
Because closing and reopening the database is counterproductive, and can take time to unlock depending on cipher.
On the other hand, if there is no phone unlocking or if the feature is disabled in the settings, so not much to do, but it will be enabled by default to comply with the standard.
In my mind the database doesn't need to be closed and re-opened because the issue is about UV. I merely suggested that as an option because it would trigger the mechanism the user would be most familiar with and expect to see.
Just performing the same verification you would to open the database but not actually closing the database first would be great.
There may not be a screen lock at all on the phone but there is always some kind of a mechanism (like a passphrase) to unlock the database, right? If there is no mechanism at all to perform UV (no biometrics, no screen lock, no passphrase) I suppose the right way would be to set the UV flag to false in the response.
Yes, there is always a mechanism for opening the database, but it is not designed to work in a vacuum. The principle is to open an encrypted file, so if the user has set it to 5 seconds of encryption, we would have to reopen a database that is already open for no reason in a workflow that makes no sense and just wait.
To solve the time issue, since the base is already open, it's possible to store the hash of the credentials in the service of the opened database and compare it to the one entered by the user. This will be not so easy because we will have to correctly manage asynchronous credentials such as physical keys with challenge response.
I'm not thrilled with this solution because, frankly, it requires a lot of development work and complicates the architecture and the workflow without offering any real benefits.
And working in my spare time on a standard that KeePassDX already complies with, simply because large companies that earn infinitely more than I do have a different interpretation and don't understand the basic principle behind KeePass, doesn't really make me want to do it. I didn't become a developer to write useless code.
Since there's absolutely no guarantee that other middleware won't add further checks to complicate the workflow even more. I think you're going to have to come up with some good arguments to convince me, can you tell me what the real advantage of doing so is? If the disadvantage is being on the same list as KeePassXC, then I will write an article and redirect to this thread to communicate on the subject.
I cannot guarantee anything except that I will simplify the login flow on my end for KeePassDX users if the UV flag works in a way that is expected in the industry. Nor is there anything else I can say or do to convince you to do anything. You seem to already know the situation quite well.
Okay, I understand. In that case, I'll think about it calmly. I'll study the technical constraints and see if there's a way to do things properly.
I am no expert but wouldn't it make ok with asking for biometrics when accessng passkey even if database is open? (Or I didn't understand what has been said)
@Matth7878 The problem with this solution is that it may not be used if the user does not have a registered biometric fingerprint (and it adds another step to using a passkey when the database is closed if the code must remain consistent).
So the best technical implementation solution is to use the database credential but it's for me a misinterpreted functional constraint, which brings us back to my previous message. I still want to understand what is really holding things up.
Maybe we just need to talk it out to resolve the situation. @timcappalli I invite you to join the discussion. What do you think about this topic? I may not have all the validators' concerns.
I asked a WebAuthn dev who has implemented the RP side of it about this issue. His view on it was "I understand what he is saying, the WebAuthn specification is horrid and perhaps does not clearly mention this requirement: that the user needs to be verified for this operation (if UV was required by the RP), and a previous user verification result should not be reused."
He also mentioned: "I asked John Bradley (CTAP spec author) about this in a conference in 2023. I asked if there was a 'freshness' type attribute so we knew when the UV had been performed. He said there was no need, and it should always be 'fresh'."
I asked a WebAuthn dev who has implemented the RP side of it about this issue. His view on it was "I understand what he is saying, the WebAuthn specification is horrid and perhaps does not clearly mention this requirement: that the user needs to be verified for this operation (if UV was required by the RP), and a previous user verification result should not be reused."
Do you have the name of that developer? We can invite them to the discussion. Because the current implementation does not contradict this; it simply means that unlocking the database is considered the current verification and that the previous opening of the database cannot be reused. Which is completely the case.
He also mentioned: "I asked John Bradley (CTAP spec author) about this in a conference in 2023. I asked if there was a 'freshness' type attribute so we knew when the UV had been performed. He said there was no need, and it should always be 'fresh'."
Once again, the term “fresh” can perfectly describe an open database. When it is closed, it is no longer fresh.
I have also looked into this myself in few repos, and I am not the only one who finds that this standard is misinterpreted and used to force things without any added security, it only complicates the user workflow. I am willing to be fair, but this simply pushes me even more to address the issue, which is more of a problem of standards.
Linked to https://github.com/keepassxreboot/keepassxc/issues/10406 https://community.bitwarden.com/t/passkey-user-verification-independent-of-vault-unlock-method/68375 https://community.bitwarden.com/t/does-bitwarden-need-to-do-user-verification-anew-for-each-authentication-ceremony/68682/4
@jwbizz08 Can we have your opinion on the subject? Thank you
Hi, one of the authors of the "horrid" WebAuthn specification here... I've been avoiding replying as some past discussions on this topic resulted in some very hostile behavior against me across many venues. But I do think it's important to clarify the open questions.
User verification must always be performed during the assertion ceremony itself. This is normatively defined in the specification.
https://www.w3.org/TR/webauthn-3/#user-verification
The technical process by which an authenticator locally authorizes the invocation of the authenticatorMakeCredential and authenticatorGetAssertion operations.
https://www.w3.org/TR/webauthn-3/#enum-userVerificationRequirement
The Relying Party requires user verification for the operation and will fail the overall ceremony if the response does not have the UV flag set. The client MUST return an error if user verification cannot be performed.
The UV flag SHALL be set if and only if the authenticator performed user verification.
Short version, if UV is required in the request, the credential manager must perform UV or abort the request. When UV is preferred, the credential manager and client can determine what is best for users (so in the case of a recent vault unlock, you may not ask for UV, but the UV response needs to be false. For example, on Apple's macOS platform, if a laptop lid is closed, and a biometric sensor is unavailable, a preferred request will not perform UV (asking the user to enter their system password to use a passkey is a bit odd for users, similar to a master password for a vault).
Some credential managers use a device PIN for user verification when device biometrics are not possible. That being said, this is usually only an issue in desktop browser extension contexts. The mobile OS platforms make user verification very easy to implement for credential managers, and it results in a good experience for users.
Some other background that may be helpful. Last year I proposed a way for credential managers to convey the last time the vault was unlocked in the response, so that RPs could potentially avoid challenging for additional factors when an unlock was "fresh enough". This was an effort to try to meet halfway, while not changing the normative meaning of user verification (which has been in use for 7+ years). Unfortunately the credential managers companies who engage in the development of WebAuthn did not want to pursue that path.
Hi, one of the authors of the "horrid" WebAuthn specification here... I've been avoiding replying as some past discussions on this topic resulted in some very hostile behavior against me across many venues. But I do think it's important to clarify the open questions.
I absolutely do not want any hostility on this project. I am very grateful for what you do, so please don't think that there are any attacks here, on the contrary. I even invited you to this discussion so that you could give your honest opinion and expertise for a healthy and balanced debate.
Some credential managers use a device PIN for user verification when device biometrics are not possible. That being said, this is usually only an issue in desktop browser extension contexts. The mobile OS platforms make user verification very easy to implement for credential managers, and it results in a good experience for users.
If we are forced to do so, I was thinking of an incremental implementation, i.e., using the device's unlock system if it is enabled (your solution @Matth7878 after all), and if it is not, simply redirecting the user to enable it or ask to close de database and explain directly to the user why this constraint exists with an article.
Some other background that may be helpful. Last year I proposed a way for credential managers to convey the last time the vault was unlocked in the response, so that RPs could potentially avoid challenging for additional factors when an unlock was "fresh enough". This was an effort to try to meet halfway, while not changing the normative meaning of user verification (which has been in use for 7+ years). Unfortunately the credential managers companies who engage in the development of WebAuthn did not want to purse that path.
That's a very interesting topic. Can you tell us more about the solution you wanted to implement? Because if the credential manager companies that are driving development don't want it for reasons that aren't purely technical, it opens up an even broader discussion on the debate.
That's a very interesting topic. Can you tell us more about the solution you wanted to implement? Because if the credential manager companies that are driving development don't want it for reasons that aren't purely technical, it opens up an even broader discussion on the debate.
Here's the issue: https://github.com/w3c/webauthn/issues/2034
Okay, so I've read the discussion carefully and thought about this:
From WebAuthn WG Call on 26/3/25: The 3rd party passkey providers, for which this issue was targeted, were unwilling to solve the issue in this manner, and there was little interest from the working group in pushing this work forward regardless. The problem that this was aimed at fixing still persists in some providers.
from @nicksteele https://github.com/w3c/webauthn/issues/2034#issuecomment-2755429180 clearly indicates that the problem has not really been solved.
There are several factors at play here, the actual implementation and storage method of keys significantly impacts how a user's verification by a Passkey Provider is interpreted during the assertion ceremony, This point stems from a very simple observation: users usually do not have direct access to their private keys after passkey provider authentication (but this is not true in all cases, particularly in the case of KeePass). So this makes the UV standard logical in most workgroup configurations (as described before), but not when the user has access to all their keys as soon as they authenticate in anyway (it does not solve any security issues for KeePass, at best, it only reassures the relying party).
So, in KeePassDX, as I said in my previous messages, it suffices to start from the observation that an open vault implies a verified user. And if this point is disputed, is an interpretation and might not be seen as part of the ceremony, so we modify the UX to make it fit so that it is no longer subject to interpretation. If UV is required and it is not standard to define a time frame (as described in the last comment, and given that it is a matter of disinterest) which would, moreover, be arbitrary, then we might as well return to the basic definition of User Verification and place the user's responsibility at the center of their own verification. Just let's make sure that it is the user who explicitly verifies it by asking them directly if they consider the opening of their Vault to be verified during the ceremony, which removes any uncertainty in each case.
Solution: A setting in the Passkey section of KeePassDX that indicates how the user is verified with two options: 1 - Unlocking of the device. Checked by default. 2 - An option that explicitly states that an open vault implies a Verified and Present User during the ceremony.
If the unlocking of the device is not defined :
- then the user is offered the option to either add this unlocking and abort the request
- or the user is offered to select the option that explicitly confirms that each time the safe is unlocked and until it is locked again, the user is verified! This leaves no room for interpretation: it is the user who explicitly confirms that they are verified, and the standard is fully complied with.
(Except for me grumbling under my breath because this development isn't for any security issue, but only for a standard). Is this acceptable to everyone? And does this confirm that KeePassDX will be compliant on this point?
@ttunturi Can you confirm that this validates your middleware recommendations? By the way, which one do you work for?
Unfortunately, only option 1 would be spec compliant. If UV is returned as true, UV must have been performed during the WebAuthn ceremony.
Well, honestly and with all my goodwill, I don't understand, I have read and reread the specifications, and the intention to distinguish individual users is well achieved with this solution and allows any ambiguity to be cleared up. User Verification should be performed during the WebAuthn ceremony if the user explicitly indicates it.
Since this standard seems to be a requirement for large companies, I will implement point 1 to be compliant and I will write an article on the subject to inform users.
and the intention to distinguish individual users is well achieved
I wouldn't say the goal is to explicitly distinguish individual users. The goal is to ensure an authorized user allowed the ceremony, at the time of the ceremony. For example, a device's screen lock timeout is not something that is typically exposed to web authentication flows in unmanaged contexts. If a user walks away from their unlocked device, which has an unlocked vault and no user verification is performed during passkey usage, anyone could walk up to their device and start using their passkeys.
I wouldn't say the goal is to explicitly distinguish individual users.
However, this is precisely what is stated in the official documentation. https://www.w3.org/TR/webauthn-3/#user-verification
The intent is to distinguish individual users.
The goal is to ensure an authorized user allowed the ceremony, at the time of the ceremony.
I agree with that, that's why I keep saying that an open database is implicitly part of the time of the ceremony.
For example, a device's lock timeout is not something that is typically exposed to web authentication flows in unmanaged contexts. If a user walks away from their unlocked device, which has an unlocked vault and no user verification is performed during passkey usage, anyone could walk up to their device and start using their passkeys.
I have already responded to this issue in my previous response, you can reread it, @ttunturi raises the same question : https://github.com/Kunzisoft/KeePassDX/issues/2283#issuecomment-3558068233
If a user walks away from their device and has their KeePassDX database open, it is clearly their fault, there are tons of ways to easily lock a database with KeePassDX. The application only works locally in the device's RAM in a service that is very easily terminated by the system. Among other things, there is a lock during timeout, a lock when the screen turns off, a lock after using an authentication workflow, and a manual lock. And in any case, whether or not there is biometric verification at this level (option 1) will not change anything, because the person who picks up the phone can simply use the passkeys since they are accessible, so the implementation you are forcing me to do does not solve any security issues. Here, the issue is solely one of the user responsibility because that is the principle behind KeePass: giving users control over their authentication methods, which is why I believe solution 2 resolves the problem.
From my point of view the UV flag should behave according to the spec. Now that the man who wrote the spec came to clarify what UV means there is no ambiguity: UV has to be performed during the ceremony for it to count.
As the default timeout to lock an idle database is 5 minutes it is already the case for the majority of users and the majority of logins that the vault is unlocked specifically for the WebAuthn ceremony. In that case it is spec-compliant to set the UV flag to true. This majority of use cases suffers if the UV flag in general is rendered unreliable because in some cases it is set to true without doing (spec-compliant) UV.
I understand that I am in the minority, and that in order to be validated by the UVs, there is really no choice. As I said, I will implement option 1 to be compliant, and I will also include videos and an article to clearly show that it simply adds complexity in this case and adds no security.
I still think the problem is communication, so if no one really sees that there is a problem to be addressed, we won't make any progress, so I'm willing to make an effort.
Once again, I am playing devil's advocate and remaining pragmatic based on the facts. A year ago, I discovered the technical aspects behind Passkey, which I find very good. The documentation is well written and covers most cases. I think that as a new independent player, I am not under any pressure from an employer or certification body, so I try to be as technical as possible in order to make the best choices.
Thank you for your opinion @timcappalli and @ttunturi. I will take a step forward by implementing it, and I will communicate on the subject because it is absolutely certain that users will come forward. Perhaps this is what is needed for a breakthrough on my part or on the certification side. I hope that this implementation will lead to a better understanding. I will get back to you so that KeePassDX can be officially certified.
You still haven't said who you work for, @ttunturi. Is it a secret?
OK, I just finished the code. I wanted to do it quickly so that this issue wouldn't keep me awake at night. I spent the whole day on it to find the least painful method in terms of code. I used two methods:
- The device's biometric credential, which is completely independent of the database master key
- If no biometric credential is configured in the device, then the database is closed and the user must reopen it's database, as you wanted at first @ttunturi
It's compliant with this code, it's is in the feature/UserVerification branch if you want to test. I'll make the videos later.
https://www.youtube.com/watch?v=09fOJQuoXmA
Here is a video of the feature as it is during this development phase. For testing purposes, I simply simulated receiving a required User Verification. In the case of a preferred User Verification, the verification is not performed and the user verified parameter is sent back as false in the flag.
I show the workflow several times during authentication and once the database is already open. When biometrics are configured, the program uses them; otherwise, it takes the device credentials, or else it closes the database and reopens it:
As I clearly show, anyone can retrieve the credentials with an unlocked database, so if someone leaves their phone lying on a table, adding this User Verification changes absolutely nothing.
So what User Verification was actually for, @timcappalli , you said, The goal is to ensure an authorized user allowed the ceremony, at the time of the ceremony. This is clearly the case here, so what did I miss?
In fact there is an important prerequisite that is also necessary to implement this standard and is not mentioned anywhere, which is that the keys it protects must not be accessible after user authentication. This is the case for closed-source applications that do not show private keys to their users, of course. But what about applications whose purpose is precisely to give users control over their keys? Does this mean that the standard implicitly requires additional actions to verify the user at every point in the application where a key could be retrieved? And what is the actual scope of this requirement? Because, as I mentioned, the database is open and decrypted in RAM at this level, so it will be little more than a visual check.
The video is private @J-Jamet
It's fixed.
How have you configured the phone's autofill settings? When I switch between passkey providers I just change the preferred one and don't have any additional ones. That way when I am using KeePassDX I don't ever see anything about/from Google Password Manager.
Other than being confused about what Google Password Manager is doing there looks like it's working as expected. 👍
It's just that when you use Chrome, it says “Google Password Manager” even with another manager, which is another thing that makes you think Google doesn't want competition for its new product (the timing is really strange, coming right after Google released its password manager, as if it were done on purpose to add lots of little issues so that third-party password managers wouldn't work properly right away. https://github.com/Kunzisoft/KeePassDX/wiki/AutoFill#no-autofill-view-display https://issues.chromium.org/issues/439553272 https://community.bitwarden.com/t/important-android-autofill-updates/87321 No accusations, of course, just a lot of disturbing coincidences happening at the same time with more complex behaviors for third party managers on chrome and an already strange history for autofill that encourage the adoption of one tool.
But when you use Firefox, it clearly says “KeePassDX Credential Provider.” I will make better videos for the tutorials.
In any case, I can't implement this feature as it stands. It adds absolutely nothing in terms of security, so I'm looking for ways to give it added value. So I'm thinking about all the places where it's possible to have visual key access to add user verification and make it consistent throughout the application. The problem is that it will be easy with biometrics, but as I said before, much more difficult if we ask for the main credential hash again (because it will not be possible to close and reopen the database during an action on it as is currently the case at the start of the ceremony).