我希望能够创建由测试CA签名的测试客户端证书并建立SSL连接,并使用此证书在Windows 7上使用IIS7和Firefox识别客户端,所有这些都在开发计算机上本地。我正在从VS2010部署我的MVC应用程序。到目前为止,我已经完成了以下工作:
使用以下方式创建CA:
makecert -n" CN = mydomain" -r -pe -sv DevCA.pvk DevCA.cer -sr LocalMachine -a sha1 -sky signature -cy authority
创建由DevCA签名的客户端证书:
makecert -sv testclient.pvk -iv DevCA.pvk -pe -a sha1 -sky Exchange -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2 -n" CN = MYDOMAIN" -ic DevCA.cer testclient.cer -ss My -sr LocalMachine
创建两个证书的PFX文件:
pvk2pfx.exe -pvk testclient.pvk -spc testclient.cer -pfx testclient.pfx
pvk2pfx.exe -pvk DevCA.pvk -spc DevCA.cer -pfx DevCA.pfx
使用certmgr将DevCA导入受信任的根证书
在IIS管理器中:
a)将testclient.pfx添加到服务器证书'
b)在我的网站中,将SSL设置设置为接受SSL
c)将HTTPS绑定设置为使用testclient证书
在Firefox中,我将DevCA添加到“权限”选项卡,将testclient添加到“您的证书”中,在IE中我使用certmgr导入CA和客户端证书。
当我使用HTTPS在Firefox中导航到我的应用程序时,我得到:
"连接不受信任"
在IE中我得到:
" HTTP错误403.16 - 禁止访问,您的客户端证书不受信任或无效。"
如果我然后添加一个例外,我可以建立一个SSL连接,但在我的应用程序中,我无法使用以下方式获取客户端证书的详细信息:
HttpClientCertificate cert = this.Request.ClientCertificate;
if (cert.IsPresent)
etc..
不确定我在这里做错了什么。有什么想法吗?
答案 0 :(得分:3)
要使用客户端证书身份验证,您需要:
服务器证书提供安全的SSL连接。要使服务器信任浏览器,您已添加DevCA(用于为您的服务器签署testclient证书)。如果您将IIS配置为忽略客户端证书,那么您将获得普通的安全通信方案 - 连接是安全的,但客户端未经过身份验证(浏览器中没有提示用户证书)。
下一步 - 确保将IIS设置为接受客户端证书。如果证书可用,浏览器将提示用户选择证书,但允许用户取消证书请求并继续浏览 - 这是您的情况。 Request.ClientCertificate
是空的。
要使用证书对客户端(用户)进行身份验证,您应颁发单独的证书(每个用户一个证书)。您可以使用相同的DevCA签署新的客户端证书(see this article)。
makecert -sk MyKeyName1 -iv DevCA.pvk -n "CN=Client1AuthCert" -ic DevCA.cer -sr currentuser -ss my -sky signature -pe
用户将该证书在他/她的计算机上安装到个人认证商店,并将Issuer Cert(DevCA)安装到受信任的根证书颁发机构。当用户使用您的Web应用程序打开浏览器时,将显示证书提示:
当用户选择证书时,它将在服务器上的Request.ClientCertificate
属性中可用。在这种情况下,用户证书将用作凭证(而不是用户/密码等)。
如果您不希望用户在没有客户端证书的情况下访问您的Web应用程序,则可以将SSL设置设置为需要客户端证书。