Como criar um certificado SSL autoassinado com nomes alternativos de assunto (SAN) para sites do IIS

5

Alguém sabe como criar um certificado SSL auto-assinado para uso com o IIS (7) que tem nomes alternativos (SANs)? Preciso que o certificado possa validar o nome do host E o endereço IP da seguinte forma:

  • CN = MyServerName
  • IP SAN: 192.168.2.2

Algumas coisas que eu tenho visto:

  • Windows SDK: makecert.exe (não suporta SANs)

  • CertEnroll da API do Windows (Server 2008): usando o script do PowerShell (consegui fazer isso funcionar com o IIS, no entanto, quando exporto o certificado para um keystore Java (preciso), recebo um keytool de erro erro: 'java.lang.Exception: entrada não um certificado X.509')

Veja um exemplo de script do PowerShell usando CertEnroll: link

  • OpenSSL: Ainda não analisei isso ...

Seria ótimo se eu conseguisse que meu script do PowerShell criasse um certificado que o Java reconhece usando a API CertEnroll, mas qualquer coisa que funcione nesse ponto eu ficarei feliz em saber.

    
por Andy Arismendi 16.08.2011 / 16:54

3 respostas

8

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"
    
por 17.08.2011 / 01:44
1

A ferramenta de chave java é exigente sobre o que permitirá importar. O certificado que você criou por meio do powershell deve funcionar com um pouco de massagem.

Em que formato está o certificado agora? Se você fez uma exportação de um armazenamento de certificados do Windows, provavelmente é .pfx; você desejará converter em um certificado x509 codificado por PEM:

openssl pkcs12 -in /path/to/certbundle.pfx -out /public/key/path/certificate.crt -nokeys
openssl pkcs12 -in /path/to/certbundle.pfx -out /private/key/path/certificate.key -nocerts -nodes

A partir daí, você desejará verificar o conteúdo real do arquivo - esses certificados do Windows incluem uma seção "Atributos do pacote" acima da seção -----BEGIN CERTIFICATE----- , que o analisador keytool gosta de bloquear - sinta-se à vontade para remover esse para que os arquivos pareçam assim, sem nenhum outro conteúdo:

/public/key/path/certificate.crt

-----BEGIN CERTIFICATE-----
MIIAAAA........
-----END CERTIFICATE-----

/private/key/path/certificate.key

-----BEGIN RSA PRIVATE KEY-----
MIIAAAA........
-----END RSA PRIVATE KEY-----

Esses arquivos de certificado devem ser muito mais fáceis de serem importados pelo java keytool.

    
por 16.08.2011 / 19:19
1

Eu achava que SAN também não era suportado com o makecert, mas depois encontrei este blog

Parece que você pode obter funcionalidade semelhante ao uso da SAN usando vários nomes comuns. por exemplo. makecert -n "CN=CertName;CN=pseudoSAN"

ou no seu exemplo "CN=Andy;CN=192.168.2.12"

    
por 22.07.2014 / 20:28