有些 IE、IIS 的问题会牵涉到客户端证书,每次搭建一个要求客户端证书的网站测试环境都要花费较长时间,痛定思痛决定把所有步骤:创建自签名根证书、服务端证书、客户端证书、配置 IIS 记录下来。
实验环境准备
| 项目 | 内容 |
|---|---|
| 域 | iislab.com |
| IIS 服务器 | iis-lab-server @ Windows Server 2012 R2 Standard |
| 客户端 | iis-lab-client @ Windows 7 Enterprise |
| 所需工具 | makecert.exe和pvk2pfx.exe。这两个 EXE 可以在一台装有 Visual Studio 的机器上找到,比如在一台装有 VS2015 的 64 位 Windows 10 上就可以在C:\Program Files (x86)\Windows Kits\10\bin\x64中拿到这两个文件。为了方便,我将这两个文件打包后上传到了:https://jojiblog.blob.core.windows.net/files/blog/makecert_pvk2pfx.zip。 |
第一步:创建自签名根证书
在 IIS 服务器上创建目录
c:\cert。将
makecert.exe和pvk2pfx.exe复制到c:\cert。将下列内容保存为
c:\cert\CreateCARoot.cmd。makecert.exe ^ -n "CN=IIS Lab CARoot" ^ -r ^ -pe ^ -a sha512 ^ -len 4096 ^ -cy authority ^ -sv CARoot.pvk ^ CARoot.cer pvk2pfx.exe ^ -pvk CARoot.pvk ^ -spc CARoot.cer ^ -pfx CARoot.pfx ^ -po Password1打开 CMD,执行
c:\cert\CreateCARoot.cmd。在下列三个密码弹框中输入:
Password1。
完成后,会生成三个文件:
CARoot.cer、CARoot.pfx和CARoot.pvk。
在 IIS 服务器运行:
mmc以打开控制台。
按
Ctrl+M或选择文件→添加/删除管理单元,选择证书,点击添加,点击确定。
选择
计算机账户,点击下一步。
保持默认设置,点击
完成,点击确定。右键
受信任的根证书颁发机构→所有任务→导入。

- 点击
下一步,选择刚刚生成的自签名根证书:CARoot.cer,点击下一步。

- 保持默认设置,点击
下一步,点击完成。 - 导入成功后可以看到自签名根证书(IIS Lab CARoot)会出现在列表中。

- 将
CARoot.cer复制到客户端,并执行同样的操作导入自签名根证书。
第二步:创建自签名服务器证书
在 IIS 服务器上将下列内容保存为
c:\cert\CreateServerCertificate.cmd。makecert.exe ^ -n "CN=iis-lab-server.iislab.com" ^ -iv CARoot.pvk ^ -ic CARoot.cer ^ -pe ^ -a sha512 ^ -len 4096 ^ -b 01/01/2014 ^ -e 01/01/2040 ^ -sky exchange ^ -eku 1.3.6.1.5.5.7.3.1 ^ -sv ServerCert.pvk ^ ServerCert.cer pvk2pfx.exe ^ -pvk ServerCert.pvk ^ -spc ServerCert.cer ^ -pfx ServerCert.pfx ^ -po Password1CMD 中执行
c:\cert\CreateServerCertificate.cmd。在所有的密码弹框中输入:
Password1。之后会生成三个文件:
ServerCert.cer、ServerCert.pfx和ServerCert.pvk。IIS 服务器再次打开证书控制台,右键
个人→所有任务→导入。选择证书的时候将扩展名改为
*.pfx,并选择ServerCert.pfx,点击下一步,输入密码:Password1,一路下一步直到完成。
成功导入后可以看到服务器证书出现在个人证书列表中。

第三步:创建自签名客户端证书
在 IIS 服务器上将下列内容保存为:
c:\cert\CreateClientCertificate.cmd。makecert.exe ^ -n "CN=AnyClientInIISLab" ^ -iv CARoot.pvk ^ -ic CARoot.cer ^ -pe ^ -a sha512 ^ -len 4096 ^ -b 01/01/2014 ^ -e 01/01/2040 ^ -sky exchange ^ -eku 1.3.6.1.5.5.7.3.2 ^ -sv ClientCert.pvk ^ ClientCert.cer pvk2pfx.exe ^ -pvk ClientCert.pvk ^ -spc ClientCert.cer ^ -pfx ClientCert.pfx ^ -po Password1CMD 中执行:
c:\cert\CreateClientCertificate.cmd。在所有的密码弹框中输入:
Password1。之后会生成三个文件:
ClientCert.cer、ClientCert.pfx和ClientCert.pvk。将
ClientCert.pfx复制到客户端。在客户端的控制台中添加一个新的证书管理单元,这次选择
我的用户账户(而不是计算机账户)。
将
ClientCert.pfx导入至当前用户账户的个人证书,密码为:Password1。导入成功后可以在当前用户的个人证书列表中看到客户端证书。

第四步:创建要求客户端证书的 IIS 站点
首先在 IIS 服务器上安装 IIS,并确保其中的安全组件:
IIS客户端证书映射身份验证和客户端证书映射身份验证一起被安装。
打开 IIS 管理器(inetmgr.exe),我们会找到一个默认站点:
Default Web Site,接下来我们就要将其配置为要求客户端证书的站点。右键
Default Web Site选择编辑绑定。
在这里我们将为 Default Web Site 绑定 HTTPS 443 端口。点击
添加,类型选择https,SSL证书选择我们第二步中创建的自签名服务器证书,点击确定。
现在
Default Web Site已经是一个 https 站点了,我们可以从客户端验证一下是否能成功访问: https://iis-lab-server.iislab.com。
现在访问
Default Web Site并不需要浏览器提供任何客户端证书,接下来我们将把该站点配置为需要客户端证书。进入
Default Web Site→SSL设置。
勾选
要求SLL,并将客户端证书选项改为必须,点击应用保存设置。
这时候站点已经需要客户端证书来验证了,接下来我们配置一个多对一的证书映射。
进入
Default Web Site→配置编辑器。

- 选择节:
system.webServer/security/authentication/iisClientCertificateMappingAuthentication。

- 将
Enable改为True,点击manyToOneMappings的...按钮以添加一条多对一的规则。

- 点击
添加。

配置如下:
description 描述(随便写) enable True name 随便写 password 客户端证书所映射的账号密码 permissionMode Allow rules 可以按自己需求添加,比如指定客户端证书的颁发者必须为某个值。 userName 客户端证书所映射的账号

- 配置完成后关闭窗口即可,你会看到
manyToOneMappings的count变为 1 了,然后点击应用保存配置。到这里所有的配置就已经完成了。

- 我们可以在客户端上验证一下,使用 IE 浏览器访问https://iis-lab-server.iislab.com,会看到浏览器弹出证书选择框,选择第三步中创建的自签名客户端证书即可成功访问站点,如果选择取消或者提交其他客户端证书,将会导致 Access Denied 错误页面。

- 如果没有看到证书选择框,可能是因为你只有一张客户端证书并且 IE 启用了:
只存在一个证书时不提示进行客户端证书选择,把该站点所对应的该设置禁用后应该就能看到了。
