diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py
index 0c5e2a9cc2630b60506b709432b51ff140e50f06..f7e8e73ea97b4a95a4ed42aa53298dc297b8939d 100644
--- a/lib/spack/spack/mirror.py
+++ b/lib/spack/spack/mirror.py
@@ -303,8 +303,8 @@ def mirror_archive_paths(fetcher, per_package_ref, spec=None):
     storage path of the resource associated with the specified ``fetcher``."""
     ext = None
     if spec:
-        ext = spec.package.versions[spec.package.version].get(
-            'extension', None)
+        versions = spec.package.versions.get(spec.package.version, {})
+        ext = versions.get('extension', None)
     # If the spec does not explicitly specify an extension (the default case),
     # then try to determine it automatically. An extension can only be
     # specified for the primary source of the package (e.g. the source code
diff --git a/lib/spack/spack/test/mirror.py b/lib/spack/spack/test/mirror.py
index da40cfac372d63c141016d6b2ed396f2ccb6f11e..9068db71937496065d16e748c9db47b5d12546f1 100644
--- a/lib/spack/spack/test/mirror.py
+++ b/lib/spack/spack/test/mirror.py
@@ -146,6 +146,12 @@ def test_all_mirror(
     repos.clear()
 
 
+def test_mirror_archive_paths_no_version(mock_packages, config, mock_archive):
+    spec = Spec('trivial-install-test-package@nonexistingversion')
+    fetcher = spack.fetch_strategy.URLFetchStrategy(mock_archive.url)
+    spack.mirror.mirror_archive_paths(fetcher, 'per-package-ref', spec)
+
+
 def test_mirror_with_url_patches(mock_packages, config, monkeypatch):
     spec = Spec('patch-several-dependencies')
     spec.concretize()