BitLocker on a VPS Without a TPM: Key Protectors and Recovery Escrow

Run Get-Tpm on most rented Windows Server instances and you get TpmPresent : False. No firmware TPM, no vTPM, no PCR banks. BitLocker still works on that machine — but the default wizard path will fail with “This device can’t use a Trusted Platform Module”, and the recovery-key model changes from automatic unsealing to something you have to operate deliberately.

What a vTPM gives you that a virtual disk does not

With a TPM, BitLocker seals the volume master key to PCR 7 (Secure Boot state) and PCR 11 (BitLocker access control), and unsealing happens in firmware, so the key never sits in a file the guest can read. Without a TPM that seal has nowhere to live, and BitLocker must fall back to a startup key on external media, a numeric password typed at boot, or network unlock.

BitLocker without a TPM protects data at rest — a VHDX snapshot, a stolen backup, a decommissioned node — but not against a compromised hypervisor, which can read key material from guest memory. Say that plainly before enabling it.

Check what the platform exposes before designing anything:

Get-Tpm | Format-List TpmPresent,TpmReady,ManufacturerIdTxt
Get-CimInstance -Namespace root/cimv2/security/microsoftvolumeencryption `
  -ClassName Win32_EncryptableVolume | Format-List DriveLetter,ProtectionStatus,ConversionStatus
manage-bde -status C:

If TpmPresent is False but TpmReady is True, a vTPM exists and only needs Initialize-Tpm -AllowClear -AllowPhysicalPresence. On Hyper-V Gen 2 VMs the vTPM is a hosting-side setting that is rarely available on a rented instance.

Startup key versus numeric password

Protectoradd commandWhere the secret livesUnattended boot
TPMAdd-BitLockerKeyProtector -TpmProtectorFirmware, sealed to PCRsYes
TPM + PINAdd-BitLockerKeyProtector -TpmAndPinProtectorFirmware plus typed PINNo
Startup keyAdd-BitLockerKeyProtector -StartupKeyProtectorUSB or virtual floppy (.BEK)With medium attached
Numeric passwordAdd-BitLockerKeyProtector -PasswordProtectorOperator memoryNo
Recovery passwordAdd-BitLockerKeyProtector -RecoveryPasswordProtectorAD DS / Entra ID / escrow fileRecovery only
Network unlockEnable-BitLocker … -NetworkUnlockWDS server certificateYes (with WDS)

The startup key protector writes a 32-byte key to a .BEK file that must live on a volume BitLocker does not manage — on a VPS, a separate virtual disk or a read-only virtual floppy. Storing the .BEK on the same VHDX as the encrypted OS is the most common mistake in this configuration.

The numeric password is the pragmatic choice for a single rented instance, typed through the pre-boot environment. It is a low-entropy secret — never the only barrier in front of a public RDP endpoint.

Enabling encryption on an OS volume without a TPM

On a TPM-less machine the setup wizard refuses. Use PowerShell instead: -SkipHardwareTest is required for a password protector on a virtual machine, otherwise the cmdlet demands a reboot-based hardware test a VPS console cannot complete.

# 1. Confirm the recovery password is escrowed before anything else
$rp = (Get-BitLockerVolume -MountPoint C:).KeyProtector |
      Where-Object KeyProtectorType -eq 'RecoveryPassword'
if (-not $rp) { Add-BitLockerKeyProtector -MountPoint C: -RecoveryPasswordProtector }

# 2. Add a numeric password protector and start full encryption
Add-BitLockerKeyProtector -MountPoint C: -PasswordProtector
Enable-BitLocker -MountPoint C: -EncryptionMethod XtsAes256 `
  -UsedSpaceOnly -SkipHardwareTest

# 3. Watch conversion progress
while ((Get-BitLockerVolume -MountPoint C:).VolumeStatus -ne 'FullyEncrypted') {
  Start-Sleep 60
  (Get-BitLockerVolume -MountPoint C:).EncryptionPercentage
}

-UsedSpaceOnly encrypts only allocated clusters and finishes in minutes on a mostly empty volume, which suits fresh deployments. On a volume that previously held sensitive data, follow up with manage-bde -wipefreespace so free space is not left in plaintext.

XTS-AES 256-bit is the only method worth choosing on Server 2022 and later; AES-CBC with an elephant diffuser exists for Server 2008-era compatibility. Changing the method later requires a full decrypt/re-encrypt cycle.

Encryption costs CPU. On the software cipher path (no TPM, and often no AES-NI passthrough on virtualised hardware) expect 15 to 30 percent throughput loss on sequential writes. A quick winsat disk -drive c before and after encryption quantifies it for your specific host, and is worth running on any Windows Server instance before you commit a database workload to an encrypted volume.

Escrow: the recovery password is the whole game

A recovery password is 48 digits in eight groups of six. Lose it and the volume is unrecoverable — there is no backdoor. It must exist and be stored somewhere other than the server it protects:

  • AD DS — BitLocker recovery information stored as a child object of the computer account; requires the schema extensions and permissions from the BitLocker drive encryption feature.
  • Entra ID / Intune — automatic escrow for hybrid- or Entra-joined devices, retrieved through the portal or Graph.
  • Offline vault — a password manager entry created at build time, with the computer name, volume ID and date in the notes.

A workgroup VPS gets only the third option. Automate the capture so a human cannot forget it:

$v = Get-BitLockerVolume -MountPoint C:
$id = ($v.KeyProtector | Where-Object KeyProtectorType -eq 'RecoveryPassword').KeyProtectorId
$pw = (Get-BitLockerVolume -MountPoint C:).KeyProtector |
      Where-Object KeyProtectorType -eq 'RecoveryPassword' |
      Select-Object -ExpandProperty RecoveryPassword
"Host=$env:COMPUTERNAME VolumeID=$($v.VolumeType) ProtectorID=$id Password=$pw" |
  Out-File -FilePath "\\vault\bitlocker\$env:COMPUTERNAME.txt" -Encoding ascii

Also record the volume identifier from manage-bde -protectors -get C:. Every recovery attempt is keyed on the 32-character protector ID, not the drive letter. Event ID 24620 in the BitLocker-API log fires on each protector change and is a useful audit trail.

Numeric password recovery on a console-only VM

The pre-boot environment needs a keyboard — the provider web console or VNC session must send digits before the OS loads. Test the flow on a non-production instance: encrypt it, reboot, confirm the pre-boot screen appears and accepts the 48 digits. Many successfully encrypted deployments have never exercised recovery.

If the console cannot send keystrokes at the pre-boot stage, the only remaining option is a startup key on an attached virtual floppy. Attach a small FAT image, generate the .BEK onto it with -StartupKeyProtector -StartupKeyExternalPath, and keep the image in a secure store. The host must attach it before every boot.

Turning encryption off cleanly

Decryption is a full read/write pass and takes as long as encryption did. Disable first, wait for FullyDecrypted, then remove protectors and escrow entries — otherwise the volume reports a protector it can no longer use.

Disable-BitLocker -MountPoint C:
do { Start-Sleep 120 } while ((Get-BitLockerVolume -MountPoint C:).VolumeStatus -ne 'FullyDecrypted')
Get-BitLockerVolume -MountPoint C: | Select-Object VolumeStatus,ProtectionStatus

Deleting an encrypted VM is safe only if the provider destroys the backing storage, which most do not guarantee. A guest-side wipe with cipher /w C:\ is the defensible step before releasing an instance.

When it is worth the operational cost

  • Regulated data (PCI, HIPAA, GDPR Article 32) on a volume that can be snapshotted by the provider — yes.
  • A laptop-like developer VM that carries source code and credentials — yes, with the recovery password in the team vault.
  • A stateless IIS web server with no local data — no; the recovery risk outweighs the benefit.
  • A SQL Server host doing 50k IOPS — measure first; software-encryption overhead on a virtualised CPU can be material.

BitLocker on a TPM-less VPS solves the snapshot-leak and decommissioning problem, not the intrusion problem. Encrypt the volumes carrying data you would have to disclose, escrow the recovery password where a human can reach it without the server, and rehearse recovery once a year.

Leave a Comment