def _get_pkey_object(self, key_material, passphrase):
        """
        Try to detect private key type and return paramiko.PKey object.
        """

        for cls in [paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey]:
            try:
                key = cls.from_private_key(StringIO(key_material), password=passphrase)
            except paramiko.ssh_exception.SSHException:
                # Invalid key, try other key type
                pass
            else:
                return key

        # If a user passes in something which looks like file path we throw a more friendly
        # exception letting the user know we expect the contents a not a path.
        # Note: We do it here and not up the stack to avoid false positives.
        contains_header = REMOTE_RUNNER_PRIVATE_KEY_HEADER in key_material.lower()
        if not contains_header and (
            key_material.count("/") >= 1 or key_material.count("\\") >= 1
        ):
            msg = (
                '"private_key" parameter needs to contain private key data / content and not '
                "a path"
            )
        elif passphrase:
            msg = "Invalid passphrase or invalid/unsupported key type"
        else:
            msg = "Invalid or unsupported key type"

        raise paramiko.ssh_exception.SSHException(msg)

        Try to detect private key type and return paramiko.PKey object.
        
st2common/st2common/runners/paramiko_ssh.py