<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _validate_certificate_url(self, cert_url):
 # type: (str) -> None """Validate the URL containing the certificate chain. This method validates if the URL provided adheres to the format mentioned here : https://developer.amazon.com/docs/custom-skills/host-a-custom-skill-as-a-web-service.html#cert-verify-signature-certificate-url :param cert_url: URL for retrieving certificate chain :type cert_url: str :raises: :py:class:`VerificationException` if the URL is invalid """

        parsed_url = urlparse(cert_url)

        protocol = parsed_url.scheme
        if protocol.lower() != CERT_CHAIN_URL_PROTOCOL.lower():
            raise VerificationException(
                "Signature Certificate URL has invalid protocol: {}. "
                "Expecting {}".format(protocol, CERT_CHAIN_URL_PROTOCOL))

        hostname = parsed_url.hostname
        if (hostname is None or
                hostname.lower() != CERT_CHAIN_URL_HOSTNAME.lower()):
            raise VerificationException(
                "Signature Certificate URL has invalid hostname: {}. "
                "Expecting {}".format(hostname, CERT_CHAIN_URL_HOSTNAME))

        normalized_path = os.path.normpath(parsed_url.path)
        if not normalized_path.startswith(CERT_CHAIN_URL_STARTPATH):
            raise VerificationException(
                "Signature Certificate URL has invalid path: {}. "
                "Expecting the path to start with {}".format(
                    normalized_path, CERT_CHAIN_URL_STARTPATH))

        port = parsed_url.port
        if port is not None and port != CERT_CHAIN_URL_PORT:
            raise VerificationException(
                "Signature Certificate URL has invalid port: {}. "
                "Expecting {}".format(str(port), str(CERT_CHAIN_URL_PORT)))