Oh, perfecto, ¡gracias!
Vi en los Foros en inglés la causa de un problema casi igual al tuyo[1]. No se si entenderás un poquitín de HTTP y las cabeceras que se envían en las peticiones al servidor y respuestas del servidor, pero si esto no te suena, lee todo lo que escribo aquí abajo. Si te suena, puedes leer directamente en el TL;DR (too long, didn't read).
Peticiones HTTP y sus cabeceras
Cuando un servidor (es decir, tu página web) quiere enviar el fichero al cliente (es decir, el ordenador que pide descargar el archivo), este incluye al principio del todo unas cabeceras. Estas cabeceras incluyen información como por ejemplo el peso del fichero, el programa y versión del programa en el servidor que envía el fichero, la fecha en que se envió, etc. Pero una muy importante es la cabecera que tiene el código nombre Content-Type. Esta cabecera define el tipo de contenido que se envía al cliente. Normalmente tiene la estructura */*, donde los asteriscos son una palabra o varias separadas por guiones.
Bien, ahora que ya entendemos lo que son las cabeceras, vayamos a ver por qué es relevante a este problema. Según he visto en los Foros en inglés, si lo que está descargando es un ejecutable Chrome verificará si es un programa conocido y que no tiene virus, o si es algún ejecutable que no se ha descargado casi nadie y se duda de su fiabilidad (podría causar problemas). Entonces, lo que ocurre es que tu página web al enviar el ZIP adjunta la siguiente cabecera: Content-type: application/octet-stream. Poner esta cabecera es un gran truco en el lenguaje de programación PHP para hacer que un archivo se descargue... pero no indica de qué tipo es. Y al empezar por application, Chrome podría detectar que fuera un ejecutable, y no un archivo ZIP. Entonces, para arreglar este problema, en vez de Content-type: application/octet-stream, se debería enviar Content-type: application/zip, para mostrar que lo que se va a descargar es un archivo ZIP, y que no hay peligro (excepto si lo que hay dentro del ZIP es un ejecutable, entonces la cosa cambia jeje).
TL;DR: En el script PHP de descarga download.php, haz que se envíe la cabecera Content-type correspondiente al archivo que se va a descargar, en vez de establecerla siempre a application/octet-stream. Si esto lo has hecho a propósito para que el navegador sepa que se tiene que descargar en vez de mostrarlo en la ventana del navegador, tranquilo, ya envías la cabecera Content-Disposition: attachment; filename=* que hará que se descargue en vez de mostrarse.
¿Fue de ayuda?
Saludos :-)