如何为IIS网站创build具有主题备用名称(SAN)的自签名SSL证书

有谁知道如何创build一个自签名的SSL证书与IIS(7)使用有主题替代名称(SAN)? 我需要证书才能validation主机名和IP地址,如下所示:

  • CN = MyServerName
  • IP SAN:192.168.2.2

我一直在看的一些事情:

以下是使用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脚本创build一个Java可以使用CertEnroll API识别的证书,那将是非常好的,但是在这一点上,任何有用的东西我都会很高兴听到。

我find了一个使用OpenSSL来做到这一点的方法。 我希望能使用CertEnroll,但是因为它给了我与Java的互操作性问题,我只是要使用OpenSSL。

以下是我如何使用OpenSSL为主题替代名称创build一个IIS证书。

首先创build一个OpenSSLconfiguration文本文件:

[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 

这将创build一个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" 

java的关键工具是挑剔的,它会允许导入。 但是,通过PowerShell创build的证书应该可以正常工作。

现在什么格式的证书? 如果您已经从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”部分,keytoolparsing器喜欢扼杀 – 随意删除,以便文件看起来就像这样,没有其他内容:

/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导入。

我以为SAN也不支持使用makecert,但后来我find了这个博客

看来您可以通过使用多个通用名称来获得与使用SAN相似的function。 例如makecert -n "CN=CertName;CN=pseudoSAN"

或者在你的例子"CN=Andy;CN=192.168.2.12"