A @CryptoGuy teve uma resposta muito boa aqui, mas eu queria expandir.
Parafrasear:
Você pode restringir a autoridade de certificação de terceiros a confiar nos certificados (dessa autoridade de certificação) emitidos para a lista de nomes desejada. Mesmo que a CA de terceiros não possua a extensão de restrições de nome, é possível aplicá-las usando seu próprio servidor de CA interno por meio de certificação cruzada. O truque é que você assine uma autoridade de certificação de terceiros usando sua autoridade de certificação interna.
certificado SSL leaf -> certificado cruzado -> seu certificado CA -> seu certificado raiz interno.
E aqui está como você faz isso funcionar (usando a linha de comando CA do OpenSSL)
Crie uma CA simples
openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -out root-ca.crt -keyout root-ca.key -subj "/CN=My Root CA"
Você pode pular a criação de uma CA intermediária
Crie uma solicitação CA intermediária, com restrições de nome.
openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg
Com isso no ossl_domain_com.cfg
arquivo:
[ req ]
prompt=no
distinguished_name=req_distinguished_name
req_extensions=domain_ca
[ req_distinguished_name ]
CN=somedomain.com trust CA
[ domain_ca ]
basicConstraints=critical,CA:true,pathlen:1
nameConstraints=critical,permitted;DNS:.somedomain.com
Em seguida, assine a autoridade de certificação de domínio intermediário com sua autoridade de certificação.
openssl x509 -req -in domain-ca.req -CA root-ca.crt -CAkey root-ca.key -sha256 -set_serial 1 -out domain-ca.crt -extensions domain_ca -extfile ossl_domain_com.cfg
Se você deixou de criar o intermediário, use sua CA raiz para assinar
Agora, assine novamente a CA do domínio original sob sua autoridade, usando o certificado. Você pode adicionar as extensões da CA aqui.
openssl x509 -in third_party_ca.crt -CA domain-ca.crt -CAkey domain-ca.key -set_serial 47 -sha256 -extensions domain_ca -extfile ossl_domain_com.cfg -out domain-cross-ca.crt
Pode ser necessário usar o -x509-to-req
argumento para criar uma solicitação, assinada exatamente da mesma maneira que o intermediário acima.
Agora, adicione sua CA raiz, CA intermediária e o domínio cruzado ao banco de dados confiável do seu navegador.