Skip to content

Codex iOS SSH disconnects before authentication with exe.dev RSA host certificate #38264

Description

@mio256

What issue are you seeing?

The Codex iOS Add SSH Host flow disconnects in roughly 500 ms, before SSH authentication completes, when connecting to an exe.dev VM through exe.dev's managed SSH endpoint.

The iOS UI reports only:

Could not connect to @.exe.xyz over SSH.

This appears to be an interoperability problem in the iOS SSH client with exe.dev's RSA OpenSSH host certificate. The same iPhone, hostname, username, and private key work in Termius.

Environment

  • Client: Codex/ChatGPT iOS app (current App Store build as of August 13, 2026)
  • Host: exe.dev VM at <vm>.exe.xyz:22
  • Remote SSH implementation banner: Go
  • User authentication: public key
  • Server host-key algorithm selected by OpenSSH:
    rsa-sha2-512-cert-v01@openssh.com
  • Host certificate type:
    ssh-rsa-cert-v01@openssh.com
  • Host certificate ID: exe-dev-host
  • CA: ssh-ed25519 SHA256:x6vfPQUYyUMtcHUbotV89qx0jfyz6XJHm7y00780nEI
  • Host-key fingerprint:
    SHA256:JJOP/lwiBGOMilfONPWZCXUrfK154cnJFXcqlsi6lPo

The fingerprint matches exe.dev's published host-key documentation:
https://exe.dev/docs/faq/host-key

Steps to reproduce

  1. Create or use an exe.dev VM.
  2. In the Codex iOS app, add an SSH host using:
    • Host: <vm>.exe.xyz
    • Port: 22
    • Username: the exe.dev account username
    • Authentication: an unencrypted supported private key
  3. Tap Retry or connect to the host.
  4. The app disconnects after approximately 500 ms.

Expected behavior

The app should complete SSH host-key verification, authenticate with the supplied private key, and start the remote Codex bootstrap flow.

Actual behavior

The app disconnects before the VM receives an authenticated SSH session. No bootstrap command or app-server proxy process is created.

Controls and diagnostics

The same key works from the same iPhone

Using Termius on the same iPhone with the exact same hostname, port, username, and private key succeeds. Running echo hello on the VM works.

Two supported user-key formats were tested

Both of these fail identically in Codex iOS:

  1. Unencrypted PKCS#8 Ed25519 private key
  2. Unencrypted SEC1 ECDSA P-256 private key

Both public keys were registered with exe.dev. The ECDSA key was also verified independently with:

ssh -o IdentitiesOnly=yes -o IdentityAgent=none \
  -i codex-ios-ecdsa-p256-test.pem \
  <user>@<vm>.exe.xyz 'echo ECDSA_TEST_OK'

Result:

ECDSA_TEST_OK

Changing only the user-key algorithm did not change the iOS failure, so this does not appear to be an Ed25519 private-key parsing problem.

No SSH session is created during the iOS retry

While tapping Retry, the VM process table was sampled every 50 ms for new sshd-session and codex app-server proxy processes. No new process appeared.

By contrast, successful OpenSSH and Termius connections create an sshd-session immediately.

This places the failure before successful user authentication and before all Codex bootstrap logic.

The remote Codex app server is healthy

Separately verified on the VM:

  • Managed app-server version: 0.147.0
  • Unix control socket exists and is in LISTEN
  • Both Codex CLI 0.144.5 and 0.147.0 proxies receive:
    HTTP/1.1 101 Switching Protocols
  • The app-server has successfully run normal Codex threads.

Therefore this is not caused by PATH, nc -U, socket permissions, stale locks, or app-server version mismatch. The failing iOS attempt never reaches those layers.

Server KEX proposal

OpenSSH reports:

KEX algorithms:
  mlkem768x25519-sha256, curve25519-sha256,
  curve25519-sha256@libssh.org, ecdh-sha2-nistp256,
  ecdh-sha2-nistp384, ecdh-sha2-nistp521,
  diffie-hellman-group14-sha256, diffie-hellman-group14-sha1

Host key algorithms:
  rsa-sha2-256, rsa-sha2-512, ssh-rsa,
  rsa-sha2-256-cert-v01@openssh.com,
  rsa-sha2-512-cert-v01@openssh.com,
  ssh-rsa-cert-v01@openssh.com

Ciphers:
  aes128-gcm@openssh.com, aes256-gcm@openssh.com,
  chacha20-poly1305@openssh.com,
  aes128-ctr, aes192-ctr, aes256-ctr

OpenSSH negotiates:

kex: algorithm: ecdh-sha2-nistp256
kex: host key algorithm: rsa-sha2-512-cert-v01@openssh.com

Suspected cause

This is an inference from the evidence above: the iOS SSH implementation may advertise or select an RSA OpenSSH host-certificate algorithm but then fail while parsing or validating the certificate, terminating before user authentication.

The server also offers non-certificate RSA host-key algorithms, but Codex iOS does not expose a way to control HostKeyAlgorithms or obtain a detailed SSH error.

Relationship to existing issues

This is distinct from #22831 and #23102:

  • In those reports, SSH authentication succeeds and the iOS client reaches codex, app-server, or nc -U.
  • Here, no authenticated SSH session reaches the VM at all.
  • OpenBSD netcat with Unix-socket support is already installed and verified.

Suggested improvements

  1. Support and test RSA OpenSSH host certificates in the iOS SSH client, including rsa-sha2-512-cert-v01@openssh.com.
  2. If certificate validation is unsupported, do not advertise/prefer certificate host-key algorithms; negotiate one of the server's plain RSA host keys instead.
  3. Surface the underlying SSH negotiation/verification error in the iOS UI.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingconnectivityIssues involving networking or endpoint connectivity problems (disconnections)iOSIssues related to the Codex iOS appremote

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions