Openssl 如何配置apache服务器以验证我向用户颁发的x509证书?

Openssl 如何配置apache服务器以验证我向用户颁发的x509证书?,openssl,x509,authentication,Openssl,X509,Authentication,事先抱歉,这可能是一篇冗长而混乱的文章;因为这就是我的处境:我已经尝试了两天了,我很困惑:P 上下文:我有一个网站(我们称之为www.mysite.com),我从一个主要的CA获得了一个有效的证书。HTTPS工作正常,证书是各种有效的 目标:现在,我想向我授权使用我的站点的人颁发证书,这样我就可以在未经授权的用户看到PHP站点的结果或使用这些证书登录之前,为其添加额外的安全层,并让Apache拒绝未经授权的用户 我所做的:我至少学习了三个不同的教程,并阅读了六本关于如何颁发这些证书的教程,但简而

事先抱歉,这可能是一篇冗长而混乱的文章;因为这就是我的处境:我已经尝试了两天了,我很困惑:P

上下文:我有一个网站(我们称之为www.mysite.com),我从一个主要的CA获得了一个有效的证书。HTTPS工作正常,证书是各种有效的

目标:现在,我想向我授权使用我的站点的人颁发证书,这样我就可以在未经授权的用户看到PHP站点的结果或使用这些证书登录之前,为其添加额外的安全层,并让Apache拒绝未经授权的用户

我所做的:我至少学习了三个不同的教程,并阅读了六本关于如何颁发这些证书的教程,但简而言之,它们无法验证。大多数教程都谈到了建立自己的自签名CA证书,然后使用该证书的密钥对用户请求的其他证书进行签名。我已经试过了,Firefox(版本19.02)和IE(版本8:())都无法连接,我不明白为什么

因此,具体问题如下:

1.Apache命令是否错误? 当我包括:

    SSLEngine on    
    SSLCertificateFile /etc/path/to/www.mysite.com.crt
    SSLCertificateKeyFile /etc/path/to/www.mysite.com.key
    SSLCACertificateFile /etc/path/to/www.mysite.com.cabundle
    SSLVerifyClient require
    SSLVerifyDepth 10
在我的httpd.conf文件中,服务器会适当地拒绝没有证书的访问。但是,我已经为最终用户生成了我认为有效的证书,并且仍然被拒绝。如果上面显示的文件是主要CA(VeriSign)提供给我的文件,那么我只是在创建一个坏的用户证书吗?那些apache命令实际上在检查什么

2.openssl的标志如何真正起作用? 我正在使用以下内容创建用户证书:

openssl ca -in ./path/to/usersrequest.csr -cert ./etc/path/to/www.mysite.com.crt -keyfile ./etc/path/to/www.mysite.com.key -out ./path/to/userscert.crt
我可能使用了错误的密钥还是什么?我应该使用从VeriSign证书中获得的公钥还是私钥? 如果我理解正确,我应该能够简单地向我的最终用户颁发一个新的证书,使用与我的“官方”证书中相同的密钥进行签名,它应该可以正常工作……但它不是:(

我也尝试过:

openssl x509 -req -CA /etc/path/to/cert.pem -CAkey /etc/path/to/cert.pem -CAcreateserial -in usersrequest.csr -out user.crt
我得到一个错误,读取
无法加载CA私钥
…我甚至不知道这意味着什么

最后,我知道这些可能是n00b问题,答案就在我眼前,但我一直在努力学习这个主题并编写代码,现在已经两天了,我的大脑已经崩溃了……我会继续尝试,但如果有人能给我指出正确的方向,我会非常感激

蒂亚,
Kvorak

您需要了解签署服务器证书的CA与将用于签署用户的客户端证书的自签名CA之间的区别

您使用SSLCertificateChainFile指令向Apache HTTPd提供第一个,如果我正确理解您的设置,您需要指定/etc/path/to/www.mysite.com.cabundle作为参数

第二个是随SSLCACertificateFile指令提供的

理论上,它们可能是相同的,但这意味着您需要发送证书请求(CSR)由主CA为您需要颁发的每个客户端证书签名,因为您自己无法对其进行签名。您无法使用服务器证书对其进行签名,因为它不是AC而是服务器证书,因此无法有效地对其他证书进行签名


您需要做的是生成一个自签名CA,将其与SSLCACertificateFile一起提供给Apache HTTPd,并颁发由该CA签名的客户端证书。

SSLCACertificateFile是否包含您用来颁发客户端证书的CA证书?如果不包含,Apache将认为它们无效。您确实需要发布错误Apache giv当您尝试连接到客户端证书时,会出现错误。