diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for bluesky-tools
 
+## 0.6.0.4 -- 2025-08-02
+
+* Fix HTTPS resolution to use the correct URL.
+
 ## 0.6.0.2 -- 2025-05-26
 
 * Dependency version updates
diff --git a/bluesky-tools.cabal b/bluesky-tools.cabal
--- a/bluesky-tools.cabal
+++ b/bluesky-tools.cabal
@@ -1,7 +1,7 @@
 cabal-version:      3.4
 
 name:               bluesky-tools
-version:            0.6.0.2
+version:            0.6.0.4
 synopsis:           Tools for interacting with Bluesky / AT Protocol
 description:
   bluesky-tools provides tools that I've found useful while trying to integrate
@@ -46,6 +46,7 @@
     aeson >=2.1 && < 2.3,
     async ^>=2.2,
     base >=4.18 && < 4.22,
+    bytestring >= 0.10 && < 0.13,
     containers >=0.6 && < 0.9,
     dns ^>=4.2,
     http-api-data >= 0.5 && < 0.7,
diff --git a/src/Bluesky/Handle.hs b/src/Bluesky/Handle.hs
--- a/src/Bluesky/Handle.hs
+++ b/src/Bluesky/Handle.hs
@@ -9,9 +9,8 @@
 import Control.Monad.Trans.Class (lift)
 import Control.Monad.Trans.Maybe
 import qualified Data.Aeson as Aeson
-import Data.Aeson ((.:))
-import qualified Data.Aeson.Types as Aeson
 import qualified Data.Bifunctor as Bifunctor
+import qualified Data.ByteString.Lazy as BSL
 import Data.Char
 import qualified Data.Text as Text
 import qualified Data.Text.Encoding as Text
@@ -129,13 +128,14 @@
           -- (It still might be better to construct the URL in some structured way
           -- that insists the handle can only go in the hostname portion. But this
           -- will do.)
-          ("https://" <> rawHandleString <> "/xrpc/com.atproto.identity.resolveHandle?handle=" <> rawHandleString)
+          ("https://" <> rawHandleString <> "/.well-known/atproto-did")
       resp <- HTTP.httpLbs req httpManager
       case HTTP.statusCode (HTTP.responseStatus resp) of
         404 -> pure Nothing
-        200 -> case Aeson.decode (HTTP.responseBody resp) of
-          Nothing -> fail "JSON parsing failed"
-          Just o -> either fail (pure . Just) $ Aeson.parseEither (.: "did") o
+        200 ->
+          either (fail . show) (pure . Just) . makeDid
+          . Text.decodeASCII . BSL.toStrict
+          $ HTTP.responseBody resp
         other -> fail $ "Unexpected HTTP status " <> show other
 
 -- | Raised by 'resolveViaBoth' when both methods raise exceptions.
