我从概念的角度(即私钥/公钥)背后的数学,使用哈希和加密来签署证书,使用交易或文档进行数字签名等,对PKI相当了解。 C库与用于安全通信和身份验证的证书一起使用。我也非常熟悉openssl命令行工具。
但是,我对基于Web的启用PKI的项目几乎没有经验,因此我试图设计和编写个人项目以更好地理解这一点。
要求
这是一家银行的网站。允许所有网上银行用户使用由一些已知CA(verisign,Thawte,entrust等)颁发的任何证书。银行不负责为用户购买证书。这些证书将用于银行网站的身份验证。平台/操作系统等仍未修复。
设计
我想知道什么是进行身份验证的最佳方法。
我看到Apache有一种启用2种方式的SSL的方法-在这种情况下,我认为导航到该网站会自动向用户请求证书。但是我不确定这是否足够,因为似乎它所验证的只是证书是否由受信任的CA签名,还可能是证书是否位于证书主题行的白名单中,等等。但这还不够银行案例,因为您需要能够将bankuserid与证书相关联。
IIS似乎有一种方法可以让我为Active Directory中的每个用户存储证书。通过阅读几篇MSDN文章,我了解了这一点。您在IIS中打开2种方式的SSL,然后,当用户尝试导航到网站时,IIS将向浏览器发送带有已批准CA列表的请求,浏览器将允许用户从其证书库中选择适当的证书并将其发送到后端。我假设IIS将做2件事
- 确保用户具有与证书相对应的私钥(通过掩盖协商)
- IIS根据AD用户证书映射,将用户名报告给应用程序。
通过调用加密函数显式地进行身份验证,而不是依赖于依赖于Web服务器的身份。
- 显示一个用户屏幕,在该屏幕上他上传证书,并且应用程序确保用户具有与证书相对应的私钥(通过要求前端使用证书对某些字符串进行签名)。
- 该应用程序具有数据库,其中存储了一些数据,该数据允许每个用户映射到其用户ID。这可能是
- 与每个用户标识相对应的整个证书
- 与每个用户ID对应的CA和证书序列号。
我想知道哪种是常用的方法?最佳做法是什么?如果我应该选择#3,那么最好的方法是什么?
可以轻松与智能手机应用程序一起使用的功能将是额外的好处。
更新资料
让我澄清一下我的声明“自己编写身份验证部分”,因为某些答案似乎表明它已经被误解了-我的缺点是不清楚。
这并不意味着我自己写加密货币。这只是意味着我实际上将显式调用加密例程,而不是依赖IIS或任何其他Web服务器隐式地执行加密例程。