有些 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 Password1
CMD 中执行
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 Password1
CMD 中执行:
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 启用了:
只存在一个证书时不提示进行客户端证书选择
,把该站点所对应的该设置禁用后应该就能看到了。