]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: add pkcs12 file regression tests
authorCharles-Henri Bruyand <charles-henri.bruyand@open-xchange.com>
Wed, 24 Nov 2021 10:29:51 +0000 (11:29 +0100)
committerCharles-Henri Bruyand <charles-henri.bruyand@open-xchange.com>
Thu, 16 Dec 2021 09:09:08 +0000 (10:09 +0100)
regression-tests.dnsdist/dnsdisttests.py
regression-tests.dnsdist/runtests
regression-tests.dnsdist/test_DOH.py
regression-tests.dnsdist/test_TLS.py

index 011bae3bbf364f3a272953219b7377cb98d32c58..99b1cecf7893714cf5879eb8a8c74b15ee01ed6a 100644 (file)
@@ -801,6 +801,14 @@ class DNSDistTest(AssertEqualDNSMessageMixin, unittest.TestCase):
                 with open(inFileName) as inFile:
                     outFile.write(inFile.read())
 
+        cmd = ['openssl', 'pkcs12', '-export', '-passout', 'pass:passw0rd', '-clcerts', '-in', 'server.pem', '-CAfile', 'ca.pem', '-inkey', 'server.key', '-out', 'server.p12']
+        output = None
+        try:
+            process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
+            output = process.communicate(input='')
+        except subprocess.CalledProcessError as exc:
+            raise AssertionError('openssl pkcs12 failed (%d): %s' % (exc.returncode, exc.output))
+
     def checkMessageProxyProtocol(self, receivedProxyPayload, source, destination, isTCP, values=[], v6=False, sourcePort=None, destinationPort=None):
         proxy = ProxyProtocol()
         self.assertTrue(proxy.parseHeader(receivedProxyPayload))
index a1d63945e5134cb47a944a909bcc68025ae78ef6..2a6799b282be6ea69ec5e94f396a0069cc301529 100755 (executable)
@@ -48,6 +48,8 @@ openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -con
 openssl x509 -req -days 1 -CA ca.pem -CAkey ca.key -CAcreateserial -in server.csr -out server.pem -extfile configServer.conf -extensions v3_req
 # Generate a chain
 cat server.pem ca.pem > server.chain
+# Generate a password-protected PKCS12 file
+openssl pkcs12 -export -passout pass:passw0rd -clcerts -in server.pem -CAfile ca.pem -inkey server.key -out server.p12
 
 out=$(mktemp)
 set -o pipefail
index 1685065fc20804b25a5e9e9e7688b28ad1feffa5..ee99e21d5672f4302ed3aa396383a342882669ec 100644 (file)
@@ -1384,3 +1384,40 @@ class TestProtocols(DNSDistDOHTest):
         self.assertEqual(expectedQuery, receivedQuery)
         self.checkQueryEDNSWithoutECS(expectedQuery, receivedQuery)
         self.assertEqual(response, receivedResponse)
+
+class TestDOHWithPCKS12Cert(DNSDistDOHTest):
+    _serverCert = 'server.p12'
+    _pkcs12Password = 'passw0rd'
+    _serverName = 'tls.tests.dnsdist.org'
+    _caCert = 'ca.pem'
+    _dohServerPort = 8443
+    _dohBaseURL = ("https://%s:%d/" % (_serverName, _dohServerPort))
+    _config_template = """
+    newServer{address="127.0.0.1:%s"}
+    cert=newTLSCertificate("%s", {password="%s"})
+    addDOHLocal("127.0.0.1:%s", cert, "", { "/" })
+    """
+    _config_params = ['_testServerPort', '_serverCert', '_pkcs12Password', '_dohServerPort']
+
+    def testProtocolDOH(self):
+        """
+        DoH: Test Simple DOH Query with a password protected PCKS12 file configured
+        """
+        name = 'simple.doh.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN', use_edns=False)
+        query.id = 0
+        expectedQuery = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096)
+        expectedQuery.id = 0
+        response = dns.message.make_response(query)
+        rrset = dns.rrset.from_text(name,
+                                    3600,
+                                    dns.rdataclass.IN,
+                                    dns.rdatatype.A,
+                                    '127.0.0.1')
+        response.answer.append(rrset)
+
+        (receivedQuery, receivedResponse) = self.sendDOHQuery(self._dohServerPort, self._serverName, self._dohBaseURL, query, response=response, caFile=self._caCert)
+        self.assertTrue(receivedQuery)
+        self.assertTrue(receivedResponse)
+        receivedQuery.id = expectedQuery.id
+        self.assertEqual(expectedQuery, receivedQuery)
index 4b850bac8e8d01c78356e0779acf4db8443e5a4b..5f893d1a976f2a3aa902f3254c49d91ce7105a5d 100644 (file)
@@ -461,3 +461,21 @@ class TestProtocols(DNSDistTest):
         receivedQuery.id = query.id
         self.assertEqual(query, receivedQuery)
         self.assertEqual(response, receivedResponse)
+
+class TestPKCSTLSCertificate(DNSDistTest, TLSTests):
+    _consoleKey = DNSDistTest.generateConsoleKey()
+    _consoleKeyB64 = base64.b64encode(_consoleKey).decode('ascii')
+    _serverCert = 'server.p12'
+    _pkcsPassphrase = 'passw0rd'
+    _serverName = 'tls.tests.dnsdist.org'
+    _caCert = 'ca.pem'
+    _tlsServerPort = 8453
+    _config_template = """
+    setKey("%s")
+    controlSocket("127.0.0.1:%s")
+    newServer{address="127.0.0.1:%s"}
+    cert=newTLSCertificate("%s", {password="%s"})
+    addTLSLocal("127.0.0.1:%s", cert, "", { provider="openssl" })
+    addAction(SNIRule("powerdns.com"), SpoofAction("1.2.3.4"))
+    """
+    _config_params = ['_consoleKeyB64', '_consolePort', '_testServerPort', '_serverCert', '_pkcsPassphrase', '_tlsServerPort']