Кто-нибудь знает, как создать самозаверяющий сертификат SSL для использования с IIS (7), который имеет альтернативные имена субъектов (SAN) s? Мне нужен сертификат, чтобы иметь возможность проверять имя хоста И IP-адрес следующим образом:
Некоторые вещи, на которые я смотрел:
Windows SDK: makecert.exe (не поддерживает SAN)
Windows API CertEnroll (Server 2008): с использованием сценария PowerShell (мне удалось заставить это работать с IIS, однако, когда я экспортирую сертификат в хранилище ключей Java (обязательно), я получаю ошибку keytool error: 'java.lang .Exception: введите не сертификат X.509 ')
Вот пример сценария 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.