web-dev-qa-db-ja.com

IIS Webサイトのサブジェクト代替名(SAN)を使用して自己署名SSL証明書を作成する方法

サブジェクトの別名(SAN)を持つIIS(7)で使用する自己署名SSL証明書を作成する方法を知っている人はいますか?ホスト名を検証できるように証明書が必要ですAND次のようなIPアドレス:

  • CN = MyServerName
  • IP SAN:192.168.2.2

私が見てきたいくつかのこと:

  • Windows SDK:makecert.exe(SANをサポートしていません)

  • Windows API CertEnroll(サーバー2008):PowerShellスクリプトを使用(これをIISで動作させることができましたが、証明書をJavaキーストアにエクスポートすると(必須))エラーkeytoolエラー: 'Java.lang.Exception:Input not a X.509 certificate')

CertEnrollを使用したPowerShellスクリプトの例を次に示します。 http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-self-signed-using-powershell- and-certenroll-interfaces.aspx

  • OpenSSL:これについてはまだ調べていません...

PowerShellスクリプトを取得してJavaがCertEnroll APIを使用して認識できる証明書を作成できるとよいのですが、この時点で機能するものなら何でも聞いて喜んでいます。

5
Andy Arismendi

OpenSSLを使用してこれを行う方法を見つけました。 CertEnrollを使用したいと思っていましたが、Javaとの相互運用性の問題が発生したため、OpenSSLを使用します。

OpenSSLを使用して、サブジェクトの別名でIISの証明書を作成した方法を以下に示します。

最初に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

これにより、IISにインポートできるPFXファイルに証明書が作成されます。私はこれを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"
8
Andy Arismendi

Javaキーツールは、何をインポートできるかについてうるさいです。しかし、PowerShellを介して構築した証明書は、少しマッサージするだけで機能するはずです。

証明書は現在どのような形式ですか? Windows証明書ストアからエクスポートした場合、それはおそらく.pfxです。 PEMでエンコードされたx509証明書に変換する必要があります。

_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-----_セクションの上に "Bag Attributes"セクションが含まれています。ファイルは次のようになり、他のコンテンツはありません。

/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によるインポートがはるかに容易になります。

1
Shane Madden

SANはmakecertを使用してもサポートされていませんでしたが、その後、このブログを見つけました このブログ

SANを使用することと同様の機能を複数の一般的な名前を使用して取得できるようです。例:makecert -n "CN=CertName;CN=pseudoSAN"

またはあなたの例では"CN=Andy;CN=192.168.2.12"

1
ksun