diff --git a/src/saml2/sigver.py b/src/saml2/sigver.py
index 58e0ce83f..ea691077e 100644
--- a/src/saml2/sigver.py
+++ b/src/saml2/sigver.py
@@ -9,6 +9,7 @@
 import logging
 import os
 import six
+import sys
 
 from time import mktime
 
@@ -17,7 +18,8 @@
 import saml2.cryptography.asymmetric
 import saml2.cryptography.pki
 
-from tempfile import NamedTemporaryFile
+from tempfile import NamedTemporaryFile, gettempdir
+from uuid import uuid4
 from subprocess import Popen
 from subprocess import PIPE
 
@@ -341,12 +343,21 @@ def make_temp(content, suffix="", decode=True, delete_tmpfiles=True):
         content.encode("utf-8") if not isinstance(content, six.binary_type) else content
     )
     content_raw = base64.b64decode(content_encoded) if decode else content_encoded
-    ntf = NamedTemporaryFile(suffix=suffix, delete=delete_tmpfiles)
+    ntf = _make_temp(suffix=suffix, delete_tmpfiles=delete_tmpfiles)
     ntf.write(content_raw)
     ntf.seek(0)
     return ntf
 
 
+def _make_temp(suffix="", delete_tmpfiles=True):
+    # `NamedTemporaryFile` is not very reliable on Windows, so we'll make a
+    # tempfile a different way.
+    if sys.platform == 'win32':
+        return open(os.path.join(gettempdir(), '%s.%s' % (uuid4(), suffix)), 'w+b')
+    else:
+        return NamedTemporaryFile(suffix=suffix, delete=delete_tmpfiles)
+
+
 def split_len(seq, length):
     return [seq[i:i + length] for i in range(0, len(seq), length)]
 
@@ -888,7 +899,7 @@ def _run_xmlsec(self, com_list, extra_args):
             key-value parameters
         :result: Whatever xmlsec wrote to an --output temporary file
         """
-        with NamedTemporaryFile(suffix='.xml') as ntf:
+        with _make_temp(suffix='.xml') as ntf:
             com_list.extend(['--output', ntf.name])
             com_list += extra_args