Eu acho que não há outra solução além de criar uma configuração separada para cada vhost. Usando modelos que devem ser bastante simples.
No entanto, o SNI ainda não é suportado por alguns navegadores (todos os navegadores recentes). Esses navegadores podem mostrar uma mensagem de certificado inválida.
Se você quiser rejeitar conexões para alguns vhosts sem certificado, simplesmente não habilite ssl nesses vhosts. Adicione um servidor padrão que capture todas as conexões para vhosts desconhecidos na porta ssl e retorne um erro (403 forbiden ou não padrão 444 para tcp reset):
server {
listen 433 default_server ssl;
ssl_certificate common.crt;
ssl_certificate_key common.key;
return 403;
}
Você não pode impedir a mensagem de certificado inválida em vhosts sem ssl, pois não é possível cancelar a conexão tcp antes do handshake SSL usando nginx. Você pode tentar que o iptables rejeite apertos de mão não sni ssl, mas isso pode ser um pouco difícil de configurar corretamente e provavelmente exigirá algum conhecimento das especificações ssl.