No SQLServer 2019, existe uma maneira de instalar vários certificados SSL em paralelo?
Estou com a seguinte situação: A divisão a qual o servidor pertence foi vendida e portanto foram cadastrados novos aliases de DNS, tudo que foi chamado *.oldcompany.com
agora também possui um novo alias de DNS *.newcompany.com
. Nosso SQL-Server agora possui os seguintes nomes, todos apontando para o mesmo servidor/instância:
Antiga Empresa | Nova Empresa |
---|---|
app1.oldcompany.com | app1.newcompany.com |
app2.oldcompany.com | app2.newcompany.com |
app3.oldcompany.com | app3.newcompany.com |
Até agora, tudo é simples, não há problema, vamos solicitar um certificado SSL que contenha todos esses nomes DNS como Subject Alternative Name
... mas agora vem a parte complicada:
Para os nomes antigos , a empresa antiga é responsável, para os novos nomes, a nova, ambos com suas próprias CAs e cadeia de certificados diferentes, então acabo com um certificado para os aliases DNS app1.oldcompany.com
e outro para , e .app2.oldcompany.com
app3.oldcompany.com
app1.newcompany.com
app2.newcompany.com
app3.newcompany.com
Consegui instalar o certificado da nova empresa usando o SQLServer 2019 Configuration Manager e se a string de conexão contiver um dos novos aliases de DNS tudo funciona bem, ambas as opções Encrypt=False
ou Encrypt=True
podem ser usadas sem a necessidade TrustServerCertificate=True
, mas se a string de conexão contiver um antigo alias, Encrypt=True
só funciona em conjunto com TrustServerCertificate=True
.
Existe uma maneira de registrar os dois certificados?
Não.
A configuração do certificado é armazenada no registro, em
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Your Instance Name Here\MSSQLServer\SuperSocketNetLib
uma chave chamadaCertificate
. Este é umREG_SZ
valor de impressão digital e permite apenas um valor de impressão digital, portanto não há como especificar vários certificados. Veja também os documentos .Em teoria, isso poderia ter sido suportado, já que tanto o TLS quanto o TDS têm uma opção para especificar o nome do host que você está usando para se conectar, mas isso não é suportado atualmente.
Sua única opção é obter um único certificado com ambos os nomes no campo Nome alternativo do assunto. Muitas CAs públicas oferecem essa opção, e isso também é fácil de fazer com uma CA privada do Microsoft AD.
Se você precisar que um único certificado seja assinado por CAs diferentes, isso será impossível, a menos que você consiga que uma CA assine o certificado raiz da outra CA ou que ambas assinem um certificado de CA intermediário que possa emitir seu certificado final.
Ainda não testei com o sqlserver, mas é possível que você consiga solucionar seu problema de certificado duplo aqui usando haproxy para MITM a conexão.
Isso encerraria o certificado recebido com o nome “errado” e o restabeleceria com o nome do certificado que o sqlserver instalou.
O frontend haproxy precisa do certificado e da chave.
Para o back-end haproxy, você precisa adicionar um cabeçalho de host e definir o sni para corresponder ao sqlserver. Você também precisará fazer referência ao certificado ca relevante.
Consulte https://www.slideshare.net/slideshow/haproxy-as-egress-controller/192888584 . Há um vídeo associado, mas há muito conteúdo antes de você chegar aos detalhes do TLS, todos os quais você pode ignorar.
Isso diminuirá o desempenho (etapa de reterminação SSL) e adicionará outro componente/certificado de infraestrutura para gerenciar, mas poderá permitir que você mantenha os dois nomes DNS.