Can't recover admin user with recoverylink, browser-extension not recognized

Checklist I have read intro post: I have read the tutorials, help and searched for similar issues I provide relevant information about my server (component names and versions, etc.) I provide a copy of my logs and healthcheck I describe the steps I have taken to trouble shoot the problem I describe the steps on how to reproduce the issue

I set up the OVA template in VMware as a test server. Passbolt uses a certificate issued by a local CA. The root certificate is stored in Debian. As an administrator, I can invite users, and they can log in to Passbolt via the add-on. Passbolt is accessable over a lokal url.

Since I logged out with the admin user in the browser, I haven’t been able to get logged in again. The add-on isn’t recognized via the recovery link.

I’ve reset the browser. I’ve tested a different browser. I’ve tested a different computer.

I created a recovery link via the console. The problem remains the same.No errors are displayed when I use F12 for developer tools for the website.

I don’t see errors in passbolt-error.log or passbolt-access.log
Unfortunately, the 10-day trial has expired, which explains the errors in healthreport.

I created a second admin via cli. But my first admin is manager of a group and the new admin can’t manage them.I would like to fix the issues with the account-recovery befor I set up new users that should test passbolt.

Healthlog Report:

Healthcheck shell

If you want to have more information about the different checks, please take a look at the documentation: .

Environment

[INFO] Linux ip-10-0-2-15 6.12.73+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.73-1 (2026-02-17) x86_64 GNU/Linux
[PASS] PHP version 8.4.16.[PASS] PHP version is 8.2 or above.
[PASS] 64-bit architecture system detected.
[INFO] gpg (GnuPG) 2.4.7 / libgcrypt 1.11.0
[PASS] PCRE compiled with unicode support.
[PASS] Mbstring extension is installed.[PASS] Intl extension is installed.
[PASS] GD or Imagick extension is installed.
[PASS] The temporary directory and its content are writable and not executable.
[PASS] The logs directory /var/log/passbolt/ and its content are writable.
[PASS] System clock is synchronized and NTP service is active.

Config files

[PASS] The application config file is present
[PASS] The passbolt config file is present

Core config

[PASS] Cache is working.[PASS] Debug mode is off.
[PASS] Unique value set for security.salt
[PASS] Full base url is set to https://“internal-URL”[PASS] App.fullBaseUrl validation OK.
[PASS] /healthcheck/status is reachable.

SSL Certificate

[PASS] SSL peer certificate validates.
[PASS] Hostname is matching in SSL certificate.
[PASS] Not using a self-signed certificate.

SMTP settings

[PASS] The SMTP Settings plugin is enabled.
[PASS] SMTP Settings coherent. You may send a test email to validate them.
[PASS] The SMTP Settings source is: database.
[WARN] The SMTP Settings plugin endpoints are enabled.
[HELP] It is recommended to disable the plugin endpoints.
[HELP] Set the PASSBOLT_SECURITY_SMTP_SETTINGS_ENDPOINTS_DISABLED environment variable to true.
[HELP] Or set passbolt.security.smtpSettings.endpointsDisabled to true in /etc/passbolt/passbolt.php.[PASS] No custom SSL configuration for SMTP server.

JWT Authentication

[PASS] The JWT Authentication plugin is enabled.
[PASS] The /etc/passbolt/jwt/ directory is not writable.
[PASS] A valid JWT key pair was found.

GPG Configuration

[PASS] PHP GPG Module is installed and loaded.
[PASS] The environment variable GNUPGHOME is set to /var/lib/passbolt/.gnupg.
[PASS] The directory /var/lib/passbolt/.gnupg containing the keyring is writable by the webserver user.[PASS] The server OpenPGP key is not the default one.
[PASS] The public key file is defined in /etc/passbolt/passbolt.php and readable.
[PASS] The private key file is defined in /etc/passbolt/passbolt.php and readable.
[PASS] The server key fingerprint matches the one defined in /etc/passbolt/passbolt.php.
[PASS] The server public key defined in the /etc/passbolt/passbolt.php (or environment variables) is in the keyring.
[PASS] There is a valid email id defined for the server key.
[PASS] The public key can be used to encrypt a message.
[PASS] The private key can be used to sign a message.
[PASS] The public and private keys can be used to encrypt and sign a message.
[PASS] The private key can be used to decrypt a message.
[PASS] The private key can be used to decrypt and verify a message.
[PASS] The public key can be used to verify a signature.
[PASS] The server public key format is Gopengpg compatible.
[PASS] The server private key format is Gopengpg compatible.

Application configuration

[FAIL] This installation is not up to date. Currently using 5.9.0 and it should be 5.10.0.
[HELP] See https://www.passbolt.com/help/tech/update
[PASS] Passbolt is configured to force SSL use.
[PASS] App.fullBaseUrl is set to HTTPS.
[PASS] Selenium API endpoints are disabled.
[PASS] Search engine robots are told not to index content.
[INFO] The Self Registration plugin is enabled.
[INFO] Registration is closed, only administrators can add users.
[PASS] The deprecated self registration public setting was not found in /etc/passbolt/passbolt.php.
[WARN] Host availability checking is disabled.
[HELP] Make sure this instance is not publicly available on the internet.
[HELP] Or set the PASSBOLT_EMAIL_VALIDATE_MX environment variable to true.
[HELP] Or set passbolt.email.validate.mx to true in /etc/passbolt/passbolt.php.
[PASS] Serving the compiled version of the javascript app.
[WARN] Some email notifications are disabled by the administrator.
[PASS] The database schema is up to date.
[FAIL] Subscription invalid/expired (The subscription is expired.).

Database

[PASS] The application is able to connect to the database
[PASS] 53 tables found.
[PASS] Some default content is present.
[PASS] The database version is supported.

Metadata

[PASS] The server is able to decrypt the metadata private key.
[PASS] Active metadata key found or not required.
[PASS] The server has access to the metadata keys or does not require access to it.
[PASS] The server metadata private key is valid.

Directory Sync

[WARN] The endpoints for updating the users directory configurations are enabled.
[HELP] It is recommended to disable endpoints for updating the users directory configurations.
[HELP] Set the PASSBOLT_SECURITY_DIRECTORY_SYNC_ENDPOINTS_DISABLED environment variable to true.
[HELP] Or set passbolt.security.directorySync.endpointsDisabled to true in /etc/passbolt/passbolt.php.[PASS] SSL certification verification for LDAP server is enabled.

SSO

[PASS] SSL certification validation for SSO instance is enabled.
[WARN] The endpoints for updating the SSO configurations are enabled.
[HELP] It is recommended to disable endpoints for updating the SSO configurations.
[HELP] Set the PASSBOLT_SECURITY_SSO_SETTINGS_EDITION_DISABLED environment variable to true.
[HELP] Or set passbolt.security.sso.settings.editionDisabled to true in /etc/passbolt/passbolt.php.

SCIM

[INFO] SCIM plugin is enabled.

[FAIL] 2 error(s) found. Hang in there!

G’day tobi3000,

A few things could cause the browser extension not to be detected during account recovery. To help narrow it down, could you share:

  • What exactly do you see on screen when you click the recovery link? A blank page, a passbolt-branded page with an error, or something else?
  • When you visit your passbolt URL directly in the browser, do you see any SSL certificate warnings?
  • Which browser(s) have you tried?

If you’re using Firefox: Firefox maintains its own certificate store and does not use the OS-level trust store. Even if your root CA is installed in Debian, Firefox won’t trust it unless you import it separately via Settings > Privacy & Security > Certificates > View Certificates > Authorities tab.

If the browser doesn’t fully trust the certificate, the recovery page may not render correctly, and the extension won’t be able to communicate with it. This would happen even if the page appears to load after clicking through a warning.

For the group management issue with your second admin: group membership is managed by the group manager, not by any admin. Once you recover your original admin account you’ll be able to manage those groups again.

Cheers
Gareth

Hi Gareth,

  • After click on “recognize extension” the site does a reload and I see the same page. There are no errors or someting else. I also clear browser cache, reset the browser complete and always do a fresh reload of the page

  • The passbolt URL in browser is shown as safe. No certificate warnings.

  • I use

    • Edge Version 146.0.3856.62 (Offizielles Build) (64-Bit)
    • Firefox 148.0 (64-Bit) + about:config security.enterprise_roots.enabled true
      • Firefox use the cert-store of windows-client
  • I set passbolt to german language as default. Could that broke something.

  • There are more than one recovery-token in database for my admin-user, is this a problem.

  • When I click on passbold-addon in browser it redirects me to “https://www.passbolt.com/start“, when I choose “I already have a passbolt account” the next page is “ https://www.passbolt.com/start/i-have-an-account

    • Is it possible to set up the addon manually. It looks like it is not mapped to the local installation url. But that also could only be a symptome.

When I look at the recoverypage with F12 developertools I see no errors. The page looks to load correctly. But I am no website developer , so are there special info in the developer tools, the addon-developertools or logs on passbolt-vm I have to look.

best regards

G’day Tobi,

To answer your quick questions first: multiple recovery tokens in the database is normal (a new one is created each time recovery is requested, and old ones aren’t removed), and the German language setting won’t cause this.

The extension redirecting to www.passbolt.com/start when you click the toolbar icon is expected for an unconfigured extension. That’s what the recovery process is supposed to set up.

The page dev tools won’t show much here because the problem is on the extension side. The extension detects recovery pages by matching the URL path pattern (/setup/recover/start/{userId}/{token} ) and then injects its own scripts into the page. Something is preventing that injection from happening. To see what’s going on, check the extension’s own console :

  • Firefox: go to about:debugging#/runtime/this-firefox, find the passbolt extension, click Inspect, then open the Console tab
  • Edge: go to edge://extensions, enable Developer Mode, find passbolt, click the service worker link, then check the Console tab

With that dev tools window open, click the recovery link again and check for any errors or messages in the extension console.

Also:

  • Could you share the recovery URL from the email (you can redact the two long ID values, just keep the structure)? I want to verify it matches the pattern the extension expects.
  • Check that the passbolt extension has permission to access your passbolt server’s URL. In Firefox: about:addons, click passbolt, then the Permissions tab. In Edge: edge://extensions, click passbolt’s Details, then check Site access.
  • Try with all other browser extensions disabled temporarily. Some privacy/security extensions can block the communication between the page and the passbolt extension.

Let us know how you go.

Cheers
Gareth

Hi Gareth,

hear some infos:

  • recovery URL from mail:
    https://pb.INTERNAL-DOMAIN.INTERNAL-TLD/setup/recover/start/xxxxxxxx-xxxx-xxxx-xxxx-d4154a01dae5/xxxxxxxx-xxxx-xxxx-xxxx-fd0378c5aee5?case=default

  • In firefox passbolt “permissions and data” tab locks like this:

  • no other addons are installed

  • When I click on „Refresh to detect extension“ in Firefox the developer console lists only errors. I redacted the url exactly like in recovery-url.
    Error: The user id cannot be empty
    __validate moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    _getLocal moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    updateSuggestedResourcesBadge moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    handleSuggestedResourcesOnFocusedWindow moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:29765
    Error: The user is not set
    _getLocal moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    updateSuggestedResourcesBadge moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    handleSuggestedResourcesOnFocusedWindow moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:29517
    Error: The user is not set
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    updateSuggestedResourcesBadge moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    handleSuggestedResourcesOnFocusedWindow moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:275655
    Error: The user id cannot be empty
    __validate moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    _getLocal moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    updateSuggestedResourcesBadge moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    handleSuggestedResourcesOnUpdatedTab moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:29765
    Error: The user is not set
    _getLocal moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    updateSuggestedResourcesBadge moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    handleSuggestedResourcesOnUpdatedTab moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:29517
    Error: The user is not set
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    get moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    updateSuggestedResourcesBadge moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    handleSuggestedResourcesOnUpdatedTab moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:275655
    TabService::exec(id: 7, url: https://pb.INTERNAL-DOMAIN.INTERNAL-TLD/setup/recover/start/xxxxxxxx-xxxx-xxxx-xxxx-d4154a01dae5/xxxxxxxx-xxxx-xxxx-xxxx-fd0378c5aee?case=default): Navigation detected. index.min.js:2:766428
    TabService::exec(id: 7): No content script application acknowledged presence on worker runtime memory port. Error: Attempt to postMessage on disconnected port
    emit moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    request moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    request moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:767082
    Error: Cannot parse setup url. The url does not match the pattern.
    parse moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    test moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    assertUrlAttachConstraint moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    canBeAttachedTo moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    getPagemodThatCanBeAttachedTo moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    getPagemodThatCanBeAttachedTo moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:726204
    Error: Cannot parse account recovery url. The url does not match the pattern.
    parse moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    test moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    assertUrlAttachConstraint moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    canBeAttachedTo moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    getPagemodThatCanBeAttachedTo moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    getPagemodThatCanBeAttachedTo moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    exec moz-extension://458cf034-91fc-4661-a0c9-0664761f2e37/index.min.js:2
    index.min.js:2:752048
    The pagemod “Recover” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “Setup” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “Auth” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “App” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “QuickAccess” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “InFormCallToAction” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “InFormMenu” should implement canBeAttachedTo. Default false. index.min.js:2:19000
    The pagemod “AccountRecovery” should implement canBeAttachedTo. Default false. index.min.js:2:19000

I’ve now installed the browser in english for better comparability. I hope you find my information useful.

Hi Gareth,

do you have any ideas.

I’m thinking about setting up the system from scratch, in case if it’s a configuration error.

But I’d like to understand how authentication works with the add-on, because I want to avoid this problem in a productive environment with many users.

best regards