我正在尝试创build一个用于预生产testing的Apache SSL服务器,即使是在生产环境中,也只有不到5个用户访问。 由于用户基数小,我觉得pipe理证书最简单的方法就是自我签名,然后明确告诉Apache只信任我们创build的less量证书。 从我可以告诉,似乎Apache需要一个CA,但我希望有一个方法。
另外,就发展而言,我倾向于了解我的东西,但是我是一个系统pipe理员,所以在解决scheme方面越简单越好。
作为一个侧面说明,我也看到这个post: 这里我认为是类似于我所要求的,但不是我正在寻找的解决scheme。 理想情况下,我可以使用openSSL来dynamic生成自签名证书,并将它们的副本添加到目录中,以便在用于访问服务器时,Apache将创build连接。
有两件事你需要做的。
首先,您需要为将要连接的浏览器生成证书。
然后,您需要将Apache设置为需要某些文件夹的这些证书。
apache部分很简单 – 只需将其添加到/etc/apache2/sites-enabled/your_apache_file.conf中即可:
<Location /path/to/folder> SSLVerifyClient require SSLVerifyDepth 1 </Location>
现在假设你已经像这样设置了你的apache SSL:
SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key SSLCACertificateFile /etc/apache2/ssl/ca.crt SSLVerifyClient optional SSLOptions +StdEnvVars +ExportCertData
您还需要将自己设置为CA.
下面是我们用来生成客户端证书的一段Python代码 – 这应该给你一个你需要从这里做什么的好主意:
commonname = "name_of_client_machine" serial_file = open('/usr/local/my/web/certs/ca.srl','r') serial = serial_file.read().strip() cert_folder = '/usr/local/my/web/certs/clients/%s_%s' % (serial,commonname) try: os.makedirs(cert_folder, 0755) except OSError: pass commands.getstatusoutput("sed s/hostname/%s/ /usr/local/my/web/certs/client.tpl > %s/client.tpl" % (commonname,cert_folder)) commands.getstatusoutput("openssl genrsa -des3 -passout pass:mypassword -out %s/web_client.key 4096" % cert_folder) commands.getstatusoutput("openssl req -new -key %(cert_folder)s/web_client.key -out %(cert_folder)s/web_client.csr -config %(cert_folder)s/client.tpl -passin pass:mypassword" % ({'cert_folder':cert_folder})) commands.getstatusoutput("openssl x509 -req -days 3650 -in %(cert_folder)s/web_client.csr -CA /usr/local/my/web/certs/ca.crt -CAkey /usr/local/my/web/certs/ca.key -out %(cert_folder)s/web_client.crt -passin pass:mypassword" % ({'cert_folder':cert_folder})) commands.getstatusoutput("openssl pkcs12 -export -clcerts -in %(cert_folder)s/web_client.crt -inkey %(cert_folder)s/web_client.key -out %(cert_folder)s/web_client.P12 -passin pass:mypassword -passout pass:mypassword" % ({'cert_folder':cert_folder}))
现在您将.p12文件导入客户端浏览器。 你会被要求input密码(上面只是'mypassword'),然后它将被安装并准备就绪。
经过艰苦的斗争,我们终于find了解决办法。 不完全理想,但现在,我们有它的地方,它似乎运作良好。
在Apache中,我们首先必须启用mod_ssl,需要客户端身份validation,然后将validation深度设置为1.然后,我们必须将服务器证书和密钥设置为由我们的CA生成并签名的内容(我将在一分钟)并将SSLCACertificateFile设置为我们的CA证书。 至于创build您的CA, 这个指南是相当彻底的,我发现它是非常准确的。 除了稍微修改几个目录path,以便它与Ubuntu工作,即使用/ etc / ssl,它工作得很好。 我们创build了一个CA,然后生成了一个CA证书。 然后,我们生成一个服务器密钥和服务器证书请求,并与CA签署请求。 然后,我们将Apache设置为使用新的服务器证书和密钥。 在这一点上,你可以做服务器身份validation但不是客户端身份validation。 为了做到后面的部分,我们只是build立在上面的链接中的一些例子。 创build/签名证书组合键的过程是通用的,即您可以在服务器或客户端上使用组合。 所以我们只是重复这个过程来创build一个客户端证书(可以一次又一次地创build更多)。 一旦我们有了,我们将这两个文件转换成.pk12
# openssl pkcs12 -export -in certs/client.crt -inkey private/client.key -out ~/clientcred.p12
最后我们把这个信誉导入到firefox中来使用。 我们还将我们的新CA添加到firefox的受信任CA的内部列表中。 希望这有助于任何尝试类似的人。