diff --git a/bitcurator-cli.js b/bitcurator-cli.js
index 49b3aaf..a700de2 100644
--- a/bitcurator-cli.js
+++ b/bitcurator-cli.js
@@ -197,7 +197,7 @@ const fileExists = async (path) => {
 const saltCheckVersion = async (path, value) => {
   try {
     const contents = await fs.readFile(path, 'utf8')
-    return contents.indexOf(value) === 0
+    return contents.indexOf(value) !== -1
   } catch (err) {
     if (err.code === 'ENOENT') {
       return false
@@ -208,8 +208,45 @@ const saltCheckVersion = async (path, value) => {
 
 const setupSalt = async () => {
   if (cli['--dev'] === false) {
-    const aptSourceList = '/etc/apt/sources.list.d/saltstack.list'
-    const aptDebString = `deb [signed-by=/usr/share/keyrings/salt-archive-keyring.pgp, arch=amd64] https://packages.broadcom.com/artifactory/saltproject-deb/ stable main`
+    const aptKeyringDir = '/etc/apt/keyrings'
+    const aptKeyringPath = `${aptKeyringDir}/salt-archive-keyring.pgp`
+    // DEB822-format source file. Note the .sources extension (required for
+    // DEB822) rather than .list (which APT parses as one-line format).
+    const aptSourceList = '/etc/apt/sources.list.d/saltstack.sources'
+    const aptDebString = `Types: deb
+URIs: https://packages.broadcom.com/artifactory/saltproject-deb/
+Suites: stable
+Components: main
+Architectures: amd64
+Signed-By: ${aptKeyringPath}
+`
+
+    // Clean up any stale Salt repo source files at conflicting paths that
+    // would cause apt-get update to fail with "Conflicting values set for
+    // option Signed-By", or that would simply duplicate our repo entry.
+    // These can be left behind by previous installs (which used the .list
+    // one-line format under a different filename) or by users following
+    // the upstream Salt install instructions (which write salt.list or
+    // salt.sources). Either situation collides with our source file if
+    // both reference the same repo URL.
+    const conflictingSources = [
+      '/etc/apt/sources.list.d/saltstack.list',
+      '/etc/apt/sources.list.d/salt.list',
+      '/etc/apt/sources.list.d/salt.sources',
+    ]
+    for (const path of conflictingSources) {
+      if (await fileExists(path)) {
+        console.log(`NOTICE: Removing conflicting Salt source file at ${path}`)
+        await fs.unlink(path)
+      }
+    }
+    // Also remove a stale keyring at the legacy location if one exists,
+    // so it cannot be referenced by any leftover configuration.
+    const legacyKeyring = '/usr/share/keyrings/salt-archive-keyring.pgp'
+    if (await fileExists(legacyKeyring)) {
+      console.log(`NOTICE: Removing legacy Salt keyring at ${legacyKeyring}`)
+      await fs.unlink(legacyKeyring)
+    }
 
     const aptExists = await fileExists(aptSourceList)
     const saltExists = await fileExists('/usr/bin/salt-call')
@@ -219,8 +256,9 @@ const setupSalt = async () => {
       console.log('NOTICE: Fixing incorrect SaltStack version configuration.')
       console.log('Installing and configuring SaltStack...')
       await execAsync('apt-get remove -y --allow-change-held-packages salt-minion salt-common')
+      await mkdirp(aptKeyringDir)
       await fs.writeFile(aptSourceList, aptDebString)
-      await execAsync(`wget -O /usr/share/keyrings/salt-archive-keyring.pgp https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public`)
+      await execAsync(`wget -O ${aptKeyringPath} https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public`)
       await execAsync(`printf 'Package: salt-*\nPin: version ${saltstackVersion}.*\nPin-Priority: 1001' > /etc/apt/preferences.d/salt-pin-1001`)
       await execAsync('apt-get update')
       await execAsync('apt-get install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --allow-change-held-packages salt-common', {
@@ -231,8 +269,9 @@ const setupSalt = async () => {
       })
     } else if (aptExists === false || saltExists === false) {
       console.log('Installing and configuring SaltStack...')
+      await mkdirp(aptKeyringDir)
       await fs.writeFile(aptSourceList, aptDebString)
-      await execAsync(`wget -O /usr/share/keyrings/salt-archive-keyring.pgp https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public`)
+      await execAsync(`wget -O ${aptKeyringPath} https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public`)
       await execAsync(`printf 'Package: salt-*\nPin: version ${saltstackVersion}.*\nPin-Priority: 1001' > /etc/apt/preferences.d/salt-pin-1001`)
       await execAsync('apt-get update')
       await execAsync('apt-get install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --allow-change-held-packages salt-common', {
