Назад | Перейти на главную страницу

Как создать самоподписанный сертификат SSL с альтернативными именами субъектов (SAN) для веб-сайтов IIS

Кто-нибудь знает, как создать самозаверяющий сертификат SSL для использования с IIS (7), который имеет альтернативные имена субъектов (SAN) s? Мне нужен сертификат, чтобы иметь возможность проверять имя хоста И IP-адрес следующим образом:

Некоторые вещи, на которые я смотрел:

Вот пример сценария PowerShell с использованием CertEnroll: http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-self-signed-using-powershell-and-certenroll-interfaces.aspx

Было бы здорово, если бы я мог получить свой сценарий PowerShell для создания сертификата, который Java распознает с помощью CertEnroll API, но я буду рад услышать обо всем, что работает на данный момент.

Я нашел способ сделать это с помощью OpenSSL. Я надеялся использовать CertEnroll, но поскольку это дало мне проблемы с совместимостью с Java, я просто собираюсь использовать OpenSSL.

Вот как я создал сертификат для IIS с альтернативными именами субъектов с помощью OpenSSL.

Сначала создайте текстовый файл конфигурации 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

Затем выполните следующие команды 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

Это создаст вам сертификат в файле PFX, который можно импортировать в IIS. Я автоматизировал это с помощью PowerShell так:

    # 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"

Я думал, что SAN также не поддерживается с помощью makecert, но потом обнаружил этот блог

Кажется, что вы можете получить функциональность, аналогичную использованию SAN, используя несколько общих имен. например makecert -n "CN=CertName;CN=pseudoSAN"

или в вашем примере "CN=Andy;CN=192.168.2.12"

Инструмент Java Key разборчив в том, что он позволяет импортировать. Сертификат, который вы создали с помощью PowerShell, должен работать, однако, с небольшими изменениями.

В каком формате сейчас сертификат? Если вы выполнили экспорт из хранилища сертификатов Windows, это, вероятно, .pfx; вы хотите преобразовать в сертификат x509 с кодировкой 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

Оттуда вы захотите проверить фактическое содержимое файла - эти сертификаты Windows включают раздел «Атрибуты сумки» над -----BEGIN CERTIFICATE----- раздел, который парсер keytool любит задыхаться - не стесняйтесь вырезать его, чтобы файлы выглядели именно так, без другого содержимого:

/public/key/path/certificate.crt

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

/private/key/path/certificate.key

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

Эти файлы сертификатов должны быть более удобными для импорта с помощью java keytool.