M0 / Lab setup and verification

Verification and troubleshooting

FoundationsPractitionerAdvisor

After this lesson you can

  • Read the output of openssl version and openssl list -providers and decide whether your environment is ready for the PQC labs
  • Use a trial key generation to verify the environment, instead of trusting the version number alone
  • Distinguish the three real error classes met in this module (wrong PATH, missing DSO, misleading version number)

Before thisDocker quickstart

Mental model

The most reliable way to know whether an environment is “ready” is to try the thing you will actually use. Checking the version number (openssl version) is a quick first check, but as you saw twice in this module’s previous two lessons (the before and after of an upgrade on RockyLinux 9; a source-built CLI accidentally using the system library), it is not enough on its own. Hence a three-step check: version, provider list, a real key generation attempt. The third step catches everything the first two can miss, because it runs the code path that will actually be used.

The three error classes in this module, in brief

The wrong openssl is running (a PATH problem). A system can have more than one openssl binary (for example system package 1.1.1 and 3.5.1 built under /opt/openssl-3.5). PATH decides which openssl runs. Check which one runs with which openssl and how many are on the PATH with type -a openssl. On the container path this rarely happens, because the image has a single openssl.

Missing DSO (shared library not found). The “cannot open shared object file” error you saw with its real text in native-install-deep-dive means a provider’s .so file cannot be found. ML-KEM, ML-DSA and SLH-DSA need no provider, so if you see this error you are probably trying to load an unnecessary provider.

A misleading version number (CLI/Library mismatch, or an image with a stale package cache). As in the same lesson, the openssl version output itself can show two different versions (CLI versus Library), or an image’s “name” may not reflect a current version because its package cache is old. The only fix: trust the result of a real keygen attempt, not the version number.

Other practical problems

docker build is slow or fails. The first docker build downloads the base image (debian:trixie-slim). That is a one-time cost; later builds run quickly from cache. Without a network connection docker build fails; that is a connectivity problem, not an OpenSSL one.

A fresh RHEL/RockyLinux image shows an old OpenSSL. As in native-install-deep-dive, this is expected. Update with dnf install openssl (or dnf update) and try again.

Are you ready?

If the three commands above run without errors, you can run every lab in the rest of this course. If you get stuck at any point, identify which of the three error classes above applies and go back to the relevant lesson (native-install-deep-dive for native install details, docker-quickstart for problems with the container itself).

Numbers to know

  • The readiness check has three steps: openssl version, openssl list -providers, a real keygen attempt

Lab: Three-step readiness check

Requires: OpenSSL 3.5+ (container or native). Check your setup

shell
openssl version
Recorded output
Should start with OpenSSL 3.5.x (3.4 and earlier do not include ML-KEM or ML-DSA in the default provider). This alone is not enough; continue with the steps below.
shell
openssl list -providers
Recorded output
you should see at least one 'default' provider with status: active
shell
openssl genpkey -algorithm ML-DSA-65 -out /tmp/test.key 2>&1
Recorded output
should complete without errors; if you get 'unknown algorithm', the version is older than 3.5 or the wrong openssl binary is running

At the table

How to say this in a bank meeting.

To an executive
When you tell an auditor 'our environment is ready', showing a version number is not enough; you need to show a real algorithm trial. This three-step check lets you do exactly that in 30 seconds.
To an architect
Putting these three commands in a script and making it a step in the CI/CD pipeline guarantees that the 'PQC-ready' label is actually verified, not just claimed.
Objection
“"openssl version already shows 3.5+. Why do I need an extra keygen attempt?"”
Answer
Because you saw twice in this module that the version number alone can mislead. The RockyLinux 9 move from 3.0.7 to 3.5.5 through a package update, and a source-built CLI accidentally using the system's old library, could both pass a 'check the version' test while behaving differently in reality. A real keygen attempt is the one step that removes this ambiguity.

Sources

  • OpenSSL Project, 2025. The primary reference for the full flag list and output format of openssl version and openssl list

    "COMMANDS" section, version and list subcommands / 5 min

Checkpoint

Answer first, then compare with the model answer and score yourself against the rubric. Saved in this browser only.

  1. 01Recall

    If openssl version shows 3.4.x, why does ML-DSA-65 key generation fail?

  2. 02Recall

    Why does the three-step readiness check have a third step when the first two (version, provider list) might seem enough?

  3. 03Scenario

    openssl genpkey -algorithm ML-DSA-65 gives 'unknown algorithm', but openssl version shows 3.5.7. This looks contradictory. What do you check first (hint: more than one openssl may be installed)?

  4. 04Hostile

    A CI pipeline marks a system 'PQC-ready' if openssl version is 3.5+ and does nothing else. Which two examples from this module prove this pipeline can produce false positives?