Eu encontrei uma maneira de fazer isso usando o OpenSSL. Eu estava esperando para usar CertEnroll mas desde que me deu problemas de interoperabilidade com Java eu vou usar o OpenSSL.
Veja como eu criei um certificado para IIS com nomes alternativos de assunto usando o OpenSSL.
Primeiro, crie um arquivo de texto de configuração do OpenSSL:
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = ANDY
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = andy
DNS.2 = 192.168.2.12
IP.1 = 192.168.2.12
IP.2 = 192.167.20.1
Em seguida, execute os seguintes comandos do OpenSSL:
openssl.exe req -x509 -nodes -days 730 -newkey rsa:2048 -keyout C:\cert.pem -out C:\cert.pem -config C:\PathToConfigFileAbove.txt
openssl.exe pkcs12 -export -out C:\cert.pfx -in C:\cert.pem -name "My Cert" -passout pass:mypassword
Isso criará um certificado em um arquivo PFX que pode ser importado para o IIS. Eu automatizei isso com o powershell assim:
# Get the certificate from the PFX file.
$pfxcert = new-object system.security.cryptography.x509certificates.x509certificate2
$pfxcert.Import(
"C:\cert.pfx",
"mypassword",
[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet -bor '
[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable
)
# Add the certificate to the windows stores.
Get-Item -Path cert:\LocalMachine\My, cert:\LocalMachine\root | ForEach-Object {
$store = $_
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$store.Add($pfxcert)
$store.Close()
}
Add-PSSnapin -Name WebAdministration # IIS 7 Powershell module.
Push-Location -Path IIS:\SslBindings
# Create new IIS SSL bindings.
Get-Item -Path "cert:\LocalMachine\My\$($pfxcert.Thumbprint)" | New-Item "0.0.0.0!443"