Google Chrome U2F API decommission: What the change means
yubico.com
yubico.com
If you are wondering if a site is using the webauthn or u2f api: the webauthn flow involves the browser showing a modal dialog. The u2f flow allowed for javascript to interact with your token without the browser itself showing a dialog.
You can see what the webauthn flow is with one of the many test sites, like https://webauthn.io/
Here's my anecdote. In my country we use certificates to access government services. There are USB smartcards for secure storing and using those certificates. As there's no browser API to interact with smartcards, I'm forced to install their software. That software works only with installed root certificates (it uses https websocket on 127.0.0.1 to interact with browser). Few weeks ago they released new version and for some reason they decided to host it on a completely unrelated site owned by some private person. This is complete security madness, not even theater.
So no, smartcards don't work. They're terrible from security perspective compared to native browser support, as they force user to install untrusted software with full access to the system and terrible security practices.
It's there. SSL library interfaces with pkcs11 without browser involvement, (and yes, browser makers sabotaged the PKCS 12 API to push webauthn — which is not even a direct replacement.)
I repeat, it's not singing/encrypting with API, but providing authentication/client side encryption on the TLS layer, which works flawlessly.
[1] https://help.ubuntu.com/community/CommonAccessCard#Google_Ch...
[2] https://unix.stackexchange.com/questions/302115/installing-s...
[0]: https://groups.google.com/g/mozilla.dev.platform/c/q5cj38hGT...
Edit: correct which api is deprecated.
Even without backwards compatibility, there are a lot of pieces that have to be set properly and rely heavily on third-party libraries to be written correctly for things to work.
I get the security benefits over something like OTP but it is vastly simpler to setup. Getting an RP ID to work across multiple subdomains, legacy trusted facets, origin checks, proper marshaling and unmarshaling of binary / base64 / base64 url safe are real pain points.
Things will work with localhost but then when you deploy it doesn’t with the real domains / subdomains / origin / rp id.
Not fun and the documentation is at times rather vague. For example, what is a registrable domain? I spent hours and hours trying to figure this out by reading the specification. I don’t know why but no matter what I tried I couldn’t get webauthn to recognize ngrok.io as one so things would fail. Probably my misinterpretation but still frustrating nonetheless.
We also have a cli counterpart and libfido2 has virtually no documentation so I’m traversing C code to figure out vague error messages like “err invalid length.”
> what is a registrable domain? [...] I couldn't get webauthn to recognize ngrok.io
A registrable domain is a domain that "you" aren't sharing with somebody else. For example this site is sharing .com with millions of other separate entities, so WebAuthn is not interested in having credentials for "com" because that wouldn't mean anything and introduces needless privacy risk, but Y Combinator owns all of ycombinator.com so that would constitute a registrable domain.
ngrok.io as you presumably knew but omitted to mention, is used by large numbers of different entities to build network tunnels, so it doesn't mean anything to have "ngrok.io" credentials any more than for "com" and WebAuthn won't allow that.
For now, for want of anything better, the PSL is used in browsers to figure out what counts and what doesn't, but the rule of thumb I described above will serve you very well.
Nowhere in the spec did I see where ngrok.io should be excluded as a valid rp id, I looked pretty intently but could have missed something. Just like with localhost this was purely a way to cheaply get tls to simulate a more real implementation.
> I found it very easy to deploy WebAuthn securely, writing everything from scratch as a toy project to understand how it works
I’m glad you found it easy but judging by the fact that you implemented webauthn by yourself, your skill level is probably advanced. Furthermore, in my particular case I needed to support legacy u2f-api keys, which added to the complexity. The APIs are different, what they expect are different, and the third party libraries are different.
ngrok.io is on the Public Suffix List: https://publicsuffix.org/list/
This other comment says that WebAuthn uses the PSL in its definition of "registerable domains": https://news.ycombinator.com/item?id=24444476
Edit: yes, here is the part of the spec that says where you can't register public suffixes: https://html.spec.whatwg.org/multipage/origin.html#is-a-regi...
It's in the spec, though you need to click a few links to get to the details. The WebAuthn spec (https://www.w3.org/TR/webauthn-2/) has the following in the terms defined by reference:
> is a registrable domain suffix of or is equal to
This references the following page: https://html.spec.whatwg.org/multipage/origin.html#is-a-regi...
Which contains a reference to a "public suffix": https://url.spec.whatwg.org/#host-public-suffix
Which references the Public Suffic List: https://publicsuffix.org/list/
Which ngrok.io is on: https://publicsuffix.org/list/public_suffix_list.dat
So, this limitation is in the spec, it's just not immediately obvious if you skim through the spec to find the problem.
The public suffix list ensures that you cannot accidentally share your authentication domain with others for all kinds of security measures, and WebAuthn is just one of those. Learning about the PSL and its uses (and applied limitations) is imperative if you write any kind of security-related web content, IMO.
To plug myself a bit, hopefully this can be helpful to others, and I'd appreciate feedback if you find it unclear: https://www.jacobcasper.com/u2f2webauthn.html
I was lucky to have some time to work on it and get it done before the holidays so I didn't have to worry too much. I wrote up a migration blog post and commented it here as well because I know I wanted that kind of resource when I was working on it, so if anyone needs that I hope it helps.
But as far as I understand you where supposed to start mitigating since WebAuthn was ready. Not sure when that was but it was quite a while ago.
Edit: The intent to deprecate and remove was sent to the blink-dev mailing list on June 11th. It can be found on row 2731 of the Blink Intents spreadsheet, https://bit.ly/blinkintents.
There had been a U2F API which later on had been superseded by WebAuthn (which internally uses the U2F protocol) and which is now shut down.
There is a good chance all your services are using WebAuthn.
I'm not sure but I think Firefox never supported the API which is now deprecated.