项目需要获取到客户端的证书信息,https都配置走通了,只有证书和key才能登陆网站,但是想要做到,相应的证书只能其相应的账号登陆,这就只有在有自己的key而且知道相应的账号密码才能登陆。
之前也没做过这一块,所以查了很多案例,但是php的案例几乎没有找到,最后找大神的文章:https://cweiske.de/tagebuch/ssl-client-certificates.htm
下面说一下如何实现的。
首先SSL服务器,https等都要配置好,这里就不做详细叙述了,文章有很多。
SSL基础的virtual host配置是这样的
<span style="font-size:12px;"><VirtualHost *:443>
ServerName bookmarks.cweiske.de
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog /var/log/apache2/access_log vcommon
VirtualDocumentRoot /home/cweiske/Dev/html/hosts/bookmarks.cweiske.de
<Directory "/home/cweiske/Dev/html/hosts/bookmarks.cweiske.de">
AllowOverride all
</Directory>
SSLEngine On
SSLCertificateFile /etc/ssl/private/bookmarks.cweiske.de-cacert.pem
SSLCertificateKeyFile /etc/ssl/private/bookmarks.cweiske.de.key
SSLCACertificateFile /etc/ssl/private/cacert-1and3.crt
</VirtualHost></span>
<span style="font-size:12px;"> ...
</Directory>
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +StdEnvVars
</VirtualHost></span>
SSLVerifyClient 后面可以选择两个参数 optional和require ,optional是可以非证书验证下登陆,而require是一定要证书登陆。自己选择。
SSLVerifyDepth 是验证的深度,填1就足够了
SSLOptions +StdEnvVars 这个是最重要的,这样这是才能在web端获取客户端的信息。
在测试页编写如下代码
<?php
var_dump($_SESSION);
?>
会输出证书的所有信息,其中包括如
SSL_SERVER_S_DN_C] => 国家 [SSL_SERVER_S_DN_ST] => 省份[SSL_SERVER_S_DN_L] => 城市 等信息
[SSL_CLIENT_S_DN_Email] => ****@*****.com 证书生成邮箱
[SSL_CLIENT_S_DN_G] => ****证书持有人
那么证书对应账号登陆就可以实现了,从中选出数据保存数据库,用户登陆时再调验。
ps:写的不是很详细,有什么出错的地方望大神指出。