如何搭建要求客户端证书的IIS站点(使用自签名证书)
2016年7月31日

有些IE、IIS的问题会牵涉到客户端证书,每次搭建一个要求客户端证书的网站测试环境都要花费较长时间,痛定思痛决定把所有步骤:创建自签名根证书、服务端证书、客户端证书、配置IIS记录下来。

实验环境准备

项目 内容
iislab.com
IIS服务器 iis-lab-server @ Windows Server 2012 R2 Standard
客户端 iis-lab-client @ Windows 7 Enterprise
所需工具 makecert.exepvk2pfx.exe。这两个EXE可以在一台装有Visual Studio的机器上找到,比如在一台装有VS2015的64位Windows 10上就可以在C:\Program Files (x86)\Windows Kits\10\bin\x64中拿到这两个文件。为了方便,我将这两个文件打包后上传到了:https://joji.azureedge.net/tools/makecert_pvk2pfx.zip

第一步:创建自签名根证书

  1. 在IIS服务器上创建目录c:\cert

  2. makecert.exepvk2pfx.exe复制到c:\cert

  3. 将下列内容保存为 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
  4. 打开CMD,执行 c:\cert\CreateCARoot.cmd

  5. 在下列三个密码弹框中输入:Password1

  6. 完成后,会生成三个文件: CARoot.cerCARoot.pfxCARoot.pvk

  7. 在IIS服务器运行:mmc以打开控制台。

  8. Ctrl+M选择文件添加/删除管理单元,选择证书,点击添加,点击确定

  9. 选择计算机账户,点击下一步

  10. 保持默认设置,点击完成,点击确定

  11. 右键受信任的根证书颁发机构所有任务导入

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

  13. 保持默认设置,点击下一步,点击完成

  14. 导入成功后可以看到自签名根证书(IIS Lab CARoot)会出现在列表中。

  15. CARoot.cer复制到客户端,并执行同样的操作导入自签名根证书。

第二步:创建自签名服务器证书

  1. 在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
  2. CMD中执行 c:\cert\CreateServerCertificate.cmd

  3. 在所有的密码弹框中输入:Password1

  4. 之后会生成三个文件: ServerCert.cerServerCert.pfxServerCert.pvk

  5. IIS服务器再次打开证书控制台,右键个人所有任务导入

  6. 选择证书的时候将扩展名改为*.pfx,并选择ServerCert.pfx,点击下一步,输入密码:Password1,一路下一步直到完成。

  7. 成功导入后可以看到服务器证书出现在个人证书列表中。

第三步:创建自签名客户端证书

  1. 在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
  2. CMD中执行:c:\cert\CreateClientCertificate.cmd

  3. 在所有的密码弹框中输入:Password1

  4. 之后会生成三个文件: ClientCert.cerClientCert.pfxClientCert.pvk

  5. ClientCert.pfx复制到客户端。

  6. 在客户端的控制台中添加一个新的证书管理单元,这次选择我的用户账户(而不是计算机账户)。

  7. ClientCert.pfx导入至当前用户账户个人证书,密码为:Password1

  8. 导入成功后可以在当前用户的个人证书列表中看到客户端证书。

第四步:创建要求客户端证书的IIS站点

  1. 首先在IIS服务器上安装IIS,并确保其中的安全组件:IIS客户端证书映射身份验证客户端证书映射身份验证一起被安装

  2. 打开IIS管理器(inetmgr.exe),我们会找到一个默认站点:Default Web Site,接下来我们就要将其配置为要求客户端证书的站点。

  3. 右键Default Web Site选择编辑绑定

  4. 在这里我们将为Default Web Site绑定HTTPS 443端口。点击添加类型选择httpsSSL证书选择我们第二步中创建的自签名服务器证书,点击确定

  5. 现在Default Web Site已经是一个https站点了,我们可以从客户端验证一下是否能成功访问: https://iis-lab-server.iislab.com

  6. 现在访问Default Web Site并不需要浏览器提供任何客户端证书,接下来我们将把该站点配置为需要客户端证书。

  7. 进入Default Web SiteSSL设置。

  8. 勾选要求SLL,并将客户端证书选项改为必须,点击应用保存设置。

  9. 这时候站点已经需要客户端证书来验证了,接下来我们配置一个多对一的证书映射。

  10. 进入Default Web Site配置编辑器

  11. 选择节:system.webServer/security/authentication/iisClientCertificateMappingAuthentication

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

  13. 点击添加

  14. 配置如下:

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

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

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

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

参考

分类

IIS HTTPS SSL/TLS