我一直在谷歌搜索疯狂试图解决这个问题,但答案似乎并不清楚,或者至少看起来似乎有矛盾的答案。
我的任务是使用2Way SSL身份验证设置Apache Web服务器。我们使用verisign来获取我们的证书,因此我们拥有Web实例的证书,其中包含正确的主机名详细信息,由verisign签名,以及来自verisign的中间证书。一切都很好。
现在,我们需要设置2Way SSL连接。最初的期望是客户端将管理自己的证书,并将它们提供给我们进行身份验证。多个客户端可能正在连接,并且每个客户端在连接时都应该可以访问不同的资源。
从我读过的内容来看,我不确定如何做到这一点......
这是一个非常好的概述,但在这种情况下,他们使用的是自签名证书:https://security.stackexchange.com/questions/34897/configure-ssl-mutual-two-way-authentication
使用这些详细信息,我们似乎必须将可信CA指向签署客户端证书的证书颁发机构。
是否可以将客户端证书用作受信任的CA(即使它不是自签名的,但是由CA签名),或者我们是否必须从其签名者那里放置一个受信任的CA(并且在那时,包含所有客户端证书颁发机构CA的CA捆绑包是否可以在服务器上运行?)然后使用SSLRequire语句限制对证书的特定详细信息的访问?
作为后续,我们可以使用从verisign获得的SSL证书来签署客户证书吗?
答案 0 :(得分:1)
所以,经过几个小时的谷歌和一些测试,我能够弄明白我需要什么。
如果我想使用由verisign或其他公共CA签名的证书,我必须将他们的公共中间证书(他们用来签署客户端证书的证书)复制到我的服务器并将其指定为SSLCACertificateFile in配置。需要注意的是,然后将接受由该CA签署的任何证书,并且SSLRequire指令可用于将其缩小到特定证书。
使用SSLVerifyClient的optional_no_ca指令会假定证书是可信的,即使它不是,然后我必须使用SSLRequire指令来验证细节是否正确,但是,任何人都可以创建并签名他们自己的证书上有这些细节,没有办法说出来。
创建我自己的自签名CA证书,然后使用它来签署客户端证书并将其发布到客户端是唯一的方法,既可以确保证书不是伪造的,也不需要SSLRequire指令来确保只有我指定的人才能联系。
如果我错误的话,请评论/纠正我。
答案 1 :(得分:0)
使用:
SSLVerifyClient optional_no_ca
在Apache配置中。这将请求客户端证书,但不会对CA进行验证。然后由您的本地脚本来检查由Apache设置的结果环境变量,例如“SSL_SERVER_S_DN”,并决定是否允许该请求。
这些mod_ssl环境变量也是您的代码在确定客户端可以访问的资源时需要查看的内容。
完整的文档在mod_ssl,尽管您可能已经找到了。
关于客户证书的说明。如果您确实想要使用CA并将其留给客户端,那么它们可能都使用不同的CA,您可以在服务器上维护它们。信任单个CA会好得多。
这样做的好处是,您可以使用SSL支持构建来进行所有证书检查,而不是编写自己的解决方案。
您可以通过指定在线提供商并使用电子邮件签名证书来识别客户端来强制执行单个CA.这些工作正常,只有证书主题将是一个电子邮件地址而不是域名。
或者您可以自己设置自己的CA并签署客户端证书。这不是太难,让您完全控制。这两种路由都要求您将CA根证书(以及中间体)添加到Apache可以读取的文件中并将“SSLCACertificateFile”指向它。