Wrapping the manifest section in "doFirst" fixed it. Using "doLast" resulted in an empty manifest file being created.
Working code:
war {
doFirst {
manifest {
attributes("Implementation-Title": project.name, "Implementation-Version": version, "Implementation-Timestamp": new Date())
}
}
archiveName 'infoserverws.war'
}