docs: S7 Pro Ultra compatibility + cert hostname requirement + post-handshake rejection troubleshooting#65
Open
oborichkin wants to merge 1 commit into
Conversation
…andshake rejection Tested Roborock S7 Pro Ultra (model a62) with custom certs: - Actalis: working (RSA-2048, 90-day DV via ACME) - Let's Encrypt: rejected post-handshake (TLS handshake completes server-side, but vacuum sends TCP FIN without HTTP/MQTT request) Key finding documented in custom_cert_management.md and tested_vacuums.md: the vacuum uses the stack hostname (api-... value from network.stack_fqdn) for SNI and certificate hostname verification, not the value of the r field from the cfgwifi packet. A single-domain certificate on the stack hostname is therefore sufficient - no SAN for the stripped hostname required. Added troubleshooting section to onboarding.md covering the samples=0 / 'client closed before MQTT CONNECT' pattern that signals cert rejection.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
❗❗❗WARNING! Everything was mostly vibe coded and rolled out using LLM. MR is also AI generated (this comment is not), sorry...
What
Documents the onboarding result for Roborock S7 Pro Ultra (model
roborock.vacuum.a62) and fills in two gaps in the cert/onboarding docs that I had to reverse-engineer from packet captures.Compatibility result
TLS handshake oksucceeds, but the vacuum closes the TCP connection without sending any HTTP or MQTT request (notls.alerteither way, just a TCP FIN). This is distinct from a TLS handshake failure.What changed
docs/tested_vacuums.md## Diagnosing cert rejectionsection describing the post-handshake-close signature:mqtt_server.logshowsTLS handshake ok→client closed before MQTT CONNECT,decompiled_http.jsonlstays empty, packet capture shows repeated ~30 ms TLS connections with TCP FIN and no alert.### Hostname verificationdocumenting that the vacuum uses the stack hostname (theapi-...value fromnetwork.stack_fqdn) for both SNI in ClientHello and hostname verification against the certificate — not the value of therfield from the cfgwifi packet (which is the stack hostname withapi-stripped).docs/custom_cert_management.md## Which hostname to coversection: a single-domain certificate on the stack hostname is sufficient, no SAN for the stripped hostname or wildcard is needed, and DNS resolution for the stripped hostname is unnecessary. Relevant for users migrating to Actalis's free single-domain DV quota.docs/onboarding.md## Troubleshootingsection (between the guided flow and the Web UI section) covering three patterns:samples=0/client closed before MQTT CONNECT→ cert rejection (links to the diagnosis flowchart in tested_vacuums.md and the hostname section in custom_cert_management.md).state=missing→ run another cfgwifi cycle.public_key=Falsewithsamples > 0→ recovery needs ≥2 samples, wait or retry.Why this matters
The post-handshake rejection pattern is non-obvious: the server logs look healthy (
TLS handshake ok) and there's no TLS alert, so the natural conclusion is that onboarding is progressing slowly rather than failing. The hostname requirement is similarly easy to miss — users following the cfgwifir=field intuitively issue a cert for the stripped hostname, which works at the TLS layer (SNI matches) but fails the vacuum's own hostname verification. Both of these cost me several hours of packet capture to pin down; documenting them should save the next person the same.How to verify
The S7 Pro Ultra row is based on a real device (
did: 1103817054923) onboarded against a self-hosted stack on firmware current as of 2026-07. Actalis chain confirmed via tcpdump on the server host: vacuum completes TLS, sends query signature samples, recovers public key, then issues MQTT CONNECT. Let's Encrypt rejection confirmed via the same capture: identical ClientHello, identical server response, but TCP FIN from the vacuum immediately after the server'sFinishedwith no application data. No other models were re-tested in this round.Scope
Docs only. No code changes, no config schema changes. All three files are plain markdown.