@@ -391,6 +391,34 @@ def save(self, data):  # pylint: disable=missing-docstring
         return super(FullChainFile, self).save(self.Data(
             key=data.key, cert=None, chain=([data.cert] + data.chain)))
 
+@IOPlugin.register(path='full.der', typ=OpenSSL.crypto.FILETYPE_ASN1)
+@IOPlugin.register(path='full.pem', typ=OpenSSL.crypto.FILETYPE_PEM)
+class FullFile(OpenSSLIOPlugin):
+    """Certificate and privatekey and chain lugin."""
+
+    _SEP = b'\n\n'  # TODO: do all webservers like this?
+
+    def persisted(self):  # pylint: disable=missing-docstring
+        return self.Data(key=True, cert=True, chain=True)
+
+    def load(self):  # pylint: disable=missing-docstring
+        with open(self.path, 'rb') as full_file:
+            output = full_file.read().split(self._SEP)
+        key = self.load_key(output.pop(0))
+        cert = self.load_cert(output.pop(0))
+        chain = ([self.load_cert(cert_data) for cert_data in output])
+
+        return self.Data(key=key, cert=cert, chain=chain)
+
+    def save(self, data):  # pylint: disable=missing-docstring
+        logger.info('Saving %s', self.path)
+        output = [ (self.dump_key(data.key)) ]
+        output.append(self.dump_cert(data.cert))
+        output.extend(self.dump_cert(cert_data)
+                for cert_data in data.chain)
+        with open(self.path, 'wb') as full_file:
+            full_file.write(self._SEP.join(output))
+
 
 @IOPlugin.register(path='key.der', typ=OpenSSL.crypto.FILETYPE_ASN1)
 @IOPlugin.register(path='key.pem', typ=OpenSSL.crypto.FILETYPE_PEM)