When SSH FIPS You Off

When SSH FIPS You Off

Published July 22, 2026, 9:51 p.m. by dwest

An OpenSSH Detective Story

It was one of those bugs that smelled like a key problem.

GitLab wouldn’t let anyone in.

The usual suspects were all there. Bad permissions. Wrong SSH key. Corrupted agent. Somebody had even whispered “GPG” under their breath.

But something didn’t add up.

I interrogated the client first.

$ ssh-add -l
3072 SHA256:...

“Looks clean,” it said. Too clean. Then I questioned the server.

ssh_dispatch_run_fatal:
invalid argument [preauth]

That’s the kind of answer you get from a witness who knows exactly what happened but isn’t talking. Time to lean on the client a little harder.

$ ssh -vvv

expecting SSH2_MSG_KEX_ECDH_REPLY
Connection closed

Wait. Authentication hadn’t even started. My prime suspect had a perfect alibi. I needed to know what the two machines were whispering to each other before the lights went out.

kex: algorithm: sntrup761x25519-sha512@openssh.com
host key algorithm: ssh-ed25519
cipher: chacha20-poly1305@openssh.com

There they were. Three names that didn’t belong in a FIPS neighborhood. The irony? GitLab wasn’t running in FIPS mode. Ubuntu was. OpenSSH happily advertised modern algorithms. The crypto provider took one look at them and slammed the door.

Case closed.

HostKeyAlgorithms:
  rsa-sha2-512
  rsa-sha2-256

This change explicitly configures OpenSSH to use only FIPS-approved host keys, key exchange algorithms and ciphers on both ssh servers and clients. This only affects FIPS-enabled hosts since this is scoped only for the Colo CUI network. This only seemed to affect “some” users since it requires one of them to attempt to load an algorithm it did not understand:

SSH Client

debug1: kex: algorithm: sntrup761x25519-sha512@openssh.com
debug1: kex: host key algorithm: ssh-ed25519
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
Connection closed by titanforge.galois.com port 22

CUI Desktop

systemd[500366]: Starting gpg-agent-ssh.socket - GnuPG cryptographic agent (ssh-agent emulation)...
systemd[500366]: Listening on gpg-agent-ssh.socket - GnuPG cryptographic agent (ssh-agent emulation). 
systemd[500366]: Stopping gpg-agent-ssh.socket - GnuPG cryptographic agent (ssh-agent emulation)... 
systemd[500366]: Closed gcr-ssh-agent.socket - GCR ssh-agent wrapper.

Gitlab-CUI/Titanforge

sshd[1791879]: ssh_dispatch_run_fatal: Connection from 10.10.101.134 port 22: invalid argument [preauth]
This would happen regardless if both hosts were using FIPS kernels, if the RSA keys were being specifically referenced or if a new RSA key was created. The failure occurred during SSH key exchange (preauth), before user authentication, which suggestd that negotiated algorithms were incompatible with the host’s FIPS crypto policy.

This change overrides the sshd defaults for available Hostkeys, KexKeys and Ciphers by restricting them to only a specific list algorithms.

  • Host Keys
  • RSA
  • ECDSA P-256
  • Key Exchange
  • ECDH NIST P-256/P-384
  • Diffie-Hellman Group14/Group16
  • Ciphers
  • AES-GCM
  • AES-CTR

After applying these settings, SSH negotiation completed successfully and GitLab authentication proceeded normally. This change affects only SSH transport negotiation and does not change GitLab authentication, authorization or user SSH keys. It is also restricted to just the CUI network… for now.

Share this post

Similar posts

There are no similar posts yet.

0 comments

There are no comments.

Add a new comment