不能使用自己发的客户证书

时间:2014-07-14 08:37:46

标签: security iis ssl https ssl-certificate

我希望能够创建由测试CA签名的测试客户端证书并建立SSL连接,并使用此证书在Windows 7上使用IIS7和Firefox识别客户端,所有这些都在开发计算机上本地。我正在从VS2010部署我的MVC应用程序。到目前为止,我已经完成了以下工作:

  1. 使用以下方式创建CA:

    makecert -n" CN = mydomain" -r -pe -sv DevCA.pvk DevCA.cer -sr LocalMachine -a sha1 -sky signature -cy authority

  2. 创建由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

  3. 创建两个证书的PFX文件:

    pvk2pfx.exe -pvk testclient.pvk -spc testclient.cer -pfx testclient.pfx

    pvk2pfx.exe -pvk DevCA.pvk -spc DevCA.cer -pfx DevCA.pfx

  4. 使用certmgr将DevCA导入受信任的根证书

  5. 在IIS管理器中:

    a)将testclient.pfx添加到服务器证书'

    b)在我的网站中,将SSL设置设置为接受SSL

    c)将HTTPS绑定设置为使用testclient证书

  6. 在Firefox中,我将DevCA添加到“权限”选项卡,将testclient添加到“您的证书”中,在IE中我使用certmgr导入CA和客户端证书。

  7. 当我使用HTTPS在Firefox中导航到我的应用程序时,我得到:

    "连接不受信任"

    在IE中我得到:

    " HTTP错误403.16 - 禁止访问,您的客户端证书不受信任或无效。"

    如果我然后添加一个例外,我可以建立一个SSL连接,但在我的应用程序中,我无法使用以下方式获取客户端证书的详细信息:

    HttpClientCertificate cert = this.Request.ClientCertificate;
    if (cert.IsPresent)
    etc..
    

    不确定我在这里做错了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

要使用客户端证书身份验证,您需要:

  1. 服务器证书(您已添加到IIS服务器证书的testclient.pfx)
  2. 客户端证书(浏览器可用) - 您错过了这一点。
  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应用程序打开浏览器时,将显示证书提示:

    user certificate prompt

    当用户选择证书时,它将在服务器上的Request.ClientCertificate属性中可用。在这种情况下,用户证书将用作凭证(而不是用户/密码等)。

    如果您不希望用户在没有客户端证书的情况下访问您的Web应用程序,则可以将SSL设置设置为需要客户端证书。