diff --git a/reviewboard/ssh/client.py b/reviewboard/ssh/client.py
index 972ca7c941030241072b8727a5edd7dfd9efff28..a1a5e50283f72dee12020b5fd7b0d8e4cc02ab80 100644
--- a/reviewboard/ssh/client.py
+++ b/reviewboard/ssh/client.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import logging
 
 from django.conf import settings
diff --git a/reviewboard/ssh/errors.py b/reviewboard/ssh/errors.py
index c903fea48be8bd0637e59dcc0aecf63db820b2a6..aea9cccbdcfbd754db6fba74d508d7c5caec8634 100644
--- a/reviewboard/ssh/errors.py
+++ b/reviewboard/ssh/errors.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import logging
 import socket
 
diff --git a/reviewboard/ssh/policy.py b/reviewboard/ssh/policy.py
index b636831af9ca899bff062972d8ba6f7e938800f8..918301c6be6fd3f884ca536357867166aa2494b1 100644
--- a/reviewboard/ssh/policy.py
+++ b/reviewboard/ssh/policy.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import paramiko
 
 from reviewboard.ssh.errors import UnknownHostKeyError
diff --git a/reviewboard/ssh/storage.py b/reviewboard/ssh/storage.py
index 12ab2aaf78c85747984d7b453d2bd49aa27bd9dd..cfeff399cf9932a1a0589ea9e929e1f3b4784317 100644
--- a/reviewboard/ssh/storage.py
+++ b/reviewboard/ssh/storage.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import logging
 import os
 
@@ -162,10 +164,9 @@ class FileSSHStorage(SSHStorage):
         filename = self.get_host_keys_filename()
 
         try:
-            fp = open(filename, 'a')
-            fp.write('%s %s %s\n' % (hostname, key.get_name(),
-                                     key.get_base64()))
-            fp.close()
+            with open(filename, 'a') as fp:
+                fp.write('%s %s %s\n' % (hostname, key.get_name(),
+                                         key.get_base64()))
         except IOError as e:
             raise IOError(
                 _('Unable to write host keys file %(filename)s: %(error)s') % {
@@ -181,9 +182,8 @@ class FileSSHStorage(SSHStorage):
             return
 
         try:
-            fp = open(filename, 'r')
-            lines = fp.readlines()
-            fp.close()
+            with open(filename, 'r') as fp:
+                lines = fp.readlines()
 
             old_key_base64 = old_key.get_base64()
         except IOError as e:
@@ -194,18 +194,15 @@ class FileSSHStorage(SSHStorage):
                 })
 
         try:
-            fp = open(filename, 'w')
-
-            for line in lines:
-                parts = line.strip().split(" ")
+            with open(filename, 'w') as fp:
+                for line in lines:
+                    parts = line.strip().split(" ")
 
-                if parts[-1] == old_key_base64:
-                    parts[1] = new_key.get_name()
-                    parts[-1] = new_key.get_base64()
+                    if parts[-1] == old_key_base64:
+                        parts[1] = new_key.get_name()
+                        parts[-1] = new_key.get_base64()
 
-                fp.write(' '.join(parts) + '\n')
-
-            fp.close()
+                    fp.write(' '.join(parts) + '\n')
         except IOError as e:
             raise IOError(
                 _('Unable to write host keys file %(filename)s: %(error)s') % {
diff --git a/reviewboard/ssh/tests.py b/reviewboard/ssh/tests.py
index 10e66e22324e1beb2479adccdbd8c63a2dcedc74..0aaa146335de9b07ccf12d6d7f26604310719db2 100644
--- a/reviewboard/ssh/tests.py
+++ b/reviewboard/ssh/tests.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import os
 import shutil
 import tempfile
@@ -90,12 +92,11 @@ class FileSSHStorageTests(SSHTestCase):
         line2 = 'host2 ssh-dss %s' % self.key2_b64
 
         filename = storage.get_host_keys_filename()
-        fp = open(filename, 'w')
-        fp.write('%s\n' % line1)
-        fp.write('\n')
-        fp.write('# foo\n')
-        fp.write('%s  \n' % line2)
-        fp.close()
+        with open(filename, 'w') as fp:
+            fp.write('%s\n' % line1)
+            fp.write('\n')
+            fp.write('# foo\n')
+            fp.write('%s  \n' % line2)
 
         lines = storage.read_host_keys()
         self.assertEqual(len(lines), 2)
@@ -108,9 +109,8 @@ class FileSSHStorageTests(SSHTestCase):
         storage.add_host_key('host1', self.key1)
 
         filename = storage.get_host_keys_filename()
-        fp = open(filename, 'r')
-        lines = fp.readlines()
-        fp.close()
+        with open(filename, 'r') as fp:
+            lines = fp.readlines()
 
         self.assertEqual(len(lines), 1)
         self.assertEqual(lines[0], 'host1 ssh-rsa %s\n' % self.key1_b64)
@@ -122,9 +122,8 @@ class FileSSHStorageTests(SSHTestCase):
         storage.replace_host_key('host1', self.key1, self.key2)
 
         filename = storage.get_host_keys_filename()
-        fp = open(filename, 'r')
-        lines = fp.readlines()
-        fp.close()
+        with open(filename, 'r') as fp:
+            lines = fp.readlines()
 
         self.assertEqual(len(lines), 1)
         self.assertEqual(lines[0], 'host1 ssh-dss %s\n' % self.key2_b64)
@@ -135,9 +134,8 @@ class FileSSHStorageTests(SSHTestCase):
         storage.replace_host_key('host1', self.key1, self.key2)
 
         filename = storage.get_host_keys_filename()
-        fp = open(filename, 'r')
-        lines = fp.readlines()
-        fp.close()
+        with open(filename, 'r') as fp:
+            lines = fp.readlines()
 
         self.assertEqual(len(lines), 1)
         self.assertEqual(lines[0], 'host1 ssh-dss %s\n' % self.key2_b64)
@@ -192,9 +190,8 @@ class SSHClientTests(SSHTestCase):
         known_hosts_file = client.storage.get_host_keys_filename()
         self.assertTrue(os.path.exists(known_hosts_file))
 
-        f = open(known_hosts_file, 'r')
-        lines = f.readlines()
-        f.close()
+        with open(known_hosts_file, 'r') as f:
+            lines = f.readlines()
 
         self.assertEqual(len(lines), 1)
         self.assertEqual(lines[0].split(),
@@ -215,9 +212,8 @@ class SSHClientTests(SSHTestCase):
         known_hosts_file = client.storage.get_host_keys_filename()
         self.assertTrue(os.path.exists(known_hosts_file))
 
-        f = open(known_hosts_file, 'r')
-        lines = f.readlines()
-        f.close()
+        with open(known_hosts_file, 'r') as f:
+            lines = f.readlines()
 
         self.assertEqual(len(lines), 1)
         self.assertEqual(lines[0].split(),
diff --git a/reviewboard/ssh/utils.py b/reviewboard/ssh/utils.py
index d3820928af23dc78ce1c110af341744c6416df27..9f299f1a6e1a5c18541a449ce29fcc395c5be5cb 100644
--- a/reviewboard/ssh/utils.py
+++ b/reviewboard/ssh/utils.py
@@ -1,6 +1,9 @@
+from __future__ import unicode_literals
+
 import os
 
 import paramiko
+from djblets.util.compat import six
 
 from reviewboard.ssh.client import SSHClient
 from reviewboard.ssh.errors import (BadHostKeyError, SSHAuthenticationError,
@@ -81,10 +84,11 @@ def check_host(netloc, username=None, password=None, namespace=None):
 
         raise SSHAuthenticationError(allowed_types=allowed_types, user_key=key)
     except paramiko.SSHException as e:
-        if str(e) == 'No authentication methods available':
+        msg = six.text_type(e)
+        if msg == 'No authentication methods available':
             raise SSHAuthenticationError
         else:
-            raise SSHError(unicode(e))
+            raise SSHError(msg)
 
 
 def register_rbssh(envvar):
