使用PowerShell精通IIS证书申请

如果您想学习如何生成IIS证书请求,您来对地方了。在这篇文章中,我将介绍我如何使用PowerShell进行此操作,以及如何将证书绑定到IIS网站。

让我们明确一件事。我讨厌加密和证书。在我的职业生涯中,有几次我被称为“证书专家”。然而,对于系统管理员来说,这只是另一顶帽子。

I never got to the point where I completely understood the technology and it seemed like every task I tried to accomplish around that area seemed to never work out. It’s definitely an unforgiving technology for sure.

让我给你讲一个关于如何使用PowerShell自动安装证书到IIS服务器的故事。

任务

从客户端请求一个新的公共Digicert证书,在运行IIS 8.5的工作组中的远程Windows Server 2012 R2 Core服务器上安装它,设置一个SSL绑定到一个网站,并使用安装的证书进行绑定。简单吧?开玩笑!

操作步骤

简而言之,需要X个步骤来实现这一目标。

  1. 在将证书安装的计算机上生成IIS证书签名请求。在我的情况下,我只能通过WinRM访问,所以我必须使用Invoke-Command在远程服务器上执行certreq.exe,并将CSR的内容发送到本地文件。
  2. 将CSR(证书签名请求)由公共CA签名。 (这里无法提供帮助-我与安全团队合作后,一个漂亮的证书刚刚回来了)。在我的情况下,安全团队给了我一个P7B证书集合,捆绑成一个.CER文件,其中包括我正在寻找的证书以及中间证书。这需要一些摸索才能解决。
  3. 在将证书签名请求完成后,在将证书安装的计算机上。这将把证书放入证书存储区。
  4. 在服务器上创建SSL IIS Web绑定。
  5. 将证书附加到Web绑定。

生成IIS证书请求

你的第一个任务是在远程服务器上运行certreq.exe,使用此PowerShell脚本来收集请求文件。为此,certreq.exe需要一个INF文件作为输入。此文件用于证书最终具有的所有各种选项。不详细说明,这是我正在使用的INF文件的副本。

[Version]
Signature = "$Windows NT$"
[NewRequest]
Subject = "C=US,S=State,L=City,O=Company,OU=IT,CN=Name"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xa0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
Silent = True
SMIME = False
RequestType = PKCS10

New-CertificateSigningRequest函数中,您将看到我使其非常容易进行自定义。实际上,如果您使用我的函数,您甚至都不会看到这个文件,因为它只是临时需要创建CSR(请求文件)。

接下来,您需要将此INF文件放在远程服务器上,并使用以下参数运行certreq.exe,类似于certreq.exe -new“$InfFilePath”“$reqFilePath”

这将在远程计算机上生成一个CSR(请求文件)。然后,您需要将此文件发送给您的安全团队。这还将在本地机器上的证书已发出请求中创建一个包含私钥和公钥的证书。

Certificate service request in the Windows MMC snapin

完成IIS证书请求

在我的情况下,我得到了一个单独的CER文件。我在这个PowerShell IIS脚本中创建了一个函数,直接将其导入到本地机器上的个人存储中,以发现IIS无法看到它。原因是证书还必须包含私钥。仅将证书导入个人存储是行不通的。我必须使用certreq.exe完成证书请求。

为此,您需要将从安全团队收到的证书复制到远程服务器,然后执行certreq.exe,如下所示certreq.exe -accept -machine "C:\issuedcert.cer"

您始终需要确保响应证书通过使用-machine参数始终进入本地机器上下文。这应该根据我所读的一切都成功完成了,但对我来说确实没有。由于某种原因,我收到了一个看起来像这样的错误:

Error requesting certificate

事实证明,这意味着请求文件中的公钥与安全团队返回的内容不匹配。为了测试这一点,只需运行certutil.exe -dump requestfile.reqcertutil -dumpissuedcert.cer。浏览输出,直到找到公钥区域。

Encrypted public key

复制出每个私钥并在文本编辑器中进行比较,确保它们相同。如果不同,联系您的安全团队,因为他们没有正确签署您的请求!

如果它们匹配,那么一切正常,您不应该收到该错误。

创建SSL绑定

在远程服务器上运行:

PS> Import-Module WebAdministration
PS> New-WebBinding -Name $WebsiteName -IP * -Port 443 -Protocol https

将证书附加到SSL绑定

在远程服务器上运行:

PS> $certificate = Get-Item Cert:\localmachine\My\$Thumbprint
PS> $certificate | New-Item "IIS:\SSLBindings\0.0.0.0!443"

获取PowerShell IIS脚本

如果一切顺利,您应该完成了!现在,如果您需要一点帮助,我已经创建了三个函数,使其更加容易实现。请前往我的Github存储库获取这些函数:

https://github.com/adbertram/Random-PowerShell-Work/tree/master/Certificates

https://github.com/adbertram/Random-PowerShell-Work/tree/master/IIS

示例代码

## 将此输出发送给您的证书人员
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## 导入收到的证书
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## 创建绑定并附加证书。
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

相关阅读

确保查看此其他ATA博客文章,了解使用PowerShell管理IIS的方法

Source:
https://adamtheautomator.com/iis-certificate-request/