上一篇文章openssl+lighttpd双向认证中,我们实现了Lighttpd的双向认证,那么服务端如何获取用户标识呢?
先把Lighttpd的配置文件中关于ssl的部分贴出来:
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/root/test/ca/server.pem"
#以下是配置双向认证的代码
ssl.ca-file = "/root/test/ca/ca-cert.pem" #用来认证的CA
ssl.verifyclient.activate = "enable" #开启客户端认证
ssl.verifyclient.enforce="disable" #是否强制客户端验证,可选enable/disable,需要根据业务进行自行判断设置
ssl.verifyclient.exportcert ="enable" #客户端证书导出到环境:SSL_CLIENT_CERT,不需要可以注释掉
ssl.verifyclient.username = "SSL_CLIENT_S_DN_emailAddress" #从客户端证书中获取用户标识等信息,如SSL_CLIENT_S_DN_emailAddress为获取邮箱、SSL_CLIENT_S_DN_CN为用户标识等。
ssl.verifyclient.depth = 1 #客户验证的证书深度,可默认为1
}
Lighttpd支持cgi、fastcgi,我们用cgi的方式简单介绍下:
- 在Lighttpd的server.document-root下面新建demo.c文件
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf( "Content-type: text/plain\r\n\r\n ");
printf("REMOTE_USER: %s\n",getenv("REMOTE_USER"));
return 0;
}
- gcc编译
gcc hello.c -o hello.cgi
- 运行Lighttpd
- 浏览器访问生成的cgi(如https://ip/hello.cgi),选择完用户证书后,浏览器显示用户证书邮箱
这样,后端可以获取客户端证书标识,可以拿来跟登录用户进行信息比对等,实现登录用户必须跟证书匹配的功能。
另外,如果在使用cgi等报错,或者访问hello.cgi时,会弹出保存文件框来的话,基本是cgi环境未安装的事,可以自行搜索下,进行环境配置。