M0 / Lab setup and verification

Environment overview: container or native

FoundationsPractitionerAdvisor

After this lesson you can

  • Explain, with a version-conflict example, why the container-first approach is this course's default path
  • Check whether Docker is installed on your own system and decide which lesson to take next
  • Tell which environment a lesson needs by reading its 'envRequirements' field

Mental model

Every lab in this course asks you to run real commands. That creates an environment requirement such as “OpenSSL 3.5+ must be installed”. There are two ways to meet it: install directly on your own machine (native), or run inside an isolated, pre-built container.

This course offers the container as the default path and keeps native installation in a separate lesson (native-install-deep-dive) for those who want it. The reason is not just convenience. A native install varies with the operating system, the package manager and the library versions already present, and each of those carries its own class of errors. A container pins that variability in one place (a Dockerfile): it is tested once and behaves the same for everyone. The course’s own Dockerfile (docker/Dockerfile) was actually tested with docker build and docker run on 2026-09-04; lab outputs in later lessons come from those real runs, not from estimates.

Why “check the version number” is not enough

What openssl version prints on a system does not guarantee which algorithms actually work there. We saw this concretely while preparing this course: in a fresh RockyLinux 9 container (binary compatible with RHEL 9), openssl version -a shows 3.0.7MEASURED, with a Red Hat FIPS patch. On that version, openssl genpkey -algorithm ML-DSA-65 fails with “Error initializing ML-DSA-65 context… unsupported”, because it is an OpenSSL branch from before FIPS 203/204/205 (13 August 2024). In the same container, after running only dnf install openssl (a standard package update), the version becomes 3.5.5MEASURED and ML-DSA-65 key generation works without problems.

This is evidence that “is the version 3.5 or higher” is not enough on its own: an operating system image with the same name can give two very different OpenSSL versions depending on when the package cache was synchronized. The three-step check in the verification-and-troubleshooting lesson (version, provider list, a real key generation attempt) exists to remove exactly this uncertainty. The last step does not trust the version number; it tries the algorithm you will actually use.

Which path should you take

Run the lab above. If docker --version prints a version, Docker is installed and you can go to the docker-quickstart lesson. If you get an error such as “command not found”, either install Docker from the Get Docker guide or go straight to native-install-deep-dive (that lesson does not need Docker, only a compiler and a package manager).

If openssl version already shows 3.5 or higher, you may not need any extra setup at all. But as the previous section showed, that alone is not proof. Run step three of the verification-and-troubleshooting lesson (try generating a real ML-DSA-65 key) and decide based on the result.

In short, there are three possible paths:

  • Docker is installed and you want to start fast: go to docker-quickstart; one docker build plus docker run and you are ready.
  • No Docker, or you are preparing your own production environment (a server, a CI pipeline) for PQC: go to native-install-deep-dive; it has separate, actually tested commands for Debian/Ubuntu (apt) and RHEL/RockyLinux (dnf).
  • You already have a system with OpenSSL 3.5+ but are not sure: go straight to verification-and-troubleshooting and run the three-step check.

Every lesson’s lab section declares exactly which environment it needs (envRequirements). When you open a lesson, the answer to “can I run this lab” is right there; you do not need to guess.

Numbers to know

  • PQC labs need OpenSSL 3.5+; 3.4 and earlier do not include ML-KEM, ML-DSA or SLH-DSA

Lab: Which path are you on: a quick environment scan

Requires: . Check your setup

shell
docker --version
Recorded output
If it prints Docker version X.Y.Z, ..., Docker is installed; if you get 'command not found', take the native path
shell
openssl version
Recorded output
Shows the system OpenSSL version. If it is 3.5 or higher you may not need any extra setup and can go straight to the verification-and-troubleshooting lesson

At the table

How to say this in a bank meeting.

To an executive
Setting up the lab environment should not be a barrier to learning. That is why the default path is a container: it runs with one command and every step has actually been tested for this course.
To an architect
Container-first is also a way to surface real version conflicts from production early. As you will see later in this module (native-install-deep-dive), a fresh RHEL 9 container can ship system OpenSSL 3.0.7 with no PQC support, yet the same system can move to 3.5.5 and gain support after a package update. The assumption that 'checking the version number is enough' is a small, early example of the discovery problems in M12: an inventory is only as accurate as when and how it was measured.
Objection
“"Containers don't reflect real production. Isn't a native install more 'real'?"”
Answer
The opposite. By removing version uncertainty, a container lets you separate what really comes from the OpenSSL version from what is a quirk of your own system. Native installation matters when you prepare your own production environment (the native-install-deep-dive lesson), and that lesson covers exactly how 'the version number can lie', with a real example.

Sources

  • ESSENTIALGet Docker

    Docker Inc., 2026. The current, primary guide to installing Docker Desktop or Docker Engine on your own operating system (macOS, Windows, Linux). This lesson assumes Docker is already installed and does not cover installation itself

    the section for your operating system / 5 min

  • OpenSSL Project, 2025. The primary source for when and how ML-KEM, ML-DSA and SLH-DSA entered the default provider; the basis for this lesson's claim that 3.5+ is required

    "New Features" section / 5 min

Checkpoint

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

  1. 01Recall

    Is this course's default lab environment a container or a native install? Why?

  2. 02Recall

    What is the minimum OpenSSL version for PQC support?

  3. 03Scenario

    A lesson's lab section says 'envRequirements: OpenSSL 3.5+' but `openssl version` on your system shows 1.1.1f. What do you do, and which lesson do you go to?

  4. 04Hostile

    A colleague says 'openssl version on my system says 3.5.5, so PQC will definitely work.' Is that a safe assumption? Why not, and what example do you use to push back?