nginx ssl 客户端认证配置调研
最近在思考安全相关的一些问题的时候,想到了 ssl 的客户端认证,于是便着手尝试着在 nginx 进行一下相关的配置
操作步骤
首先Google了一下,找到一篇 blog,步骤描述还算清晰,照着操作基本就能完成配置
操作说明
其实操作步骤可以分为两部分:
- 使用 openssl 生成相关的证书
- 在 nginx 进行配置
认证原理
- 服务端有根证书 ca,用 ca 签发一个客户端证书 a,即形成证书链 ca -> a
- 客户端请求的时候使用证书 a,服务端用证书 ca 对其进行校验即可完成验证
证书生成
证书的生成是使用的 openssl,我操作的时候参考了文章 http://www.178linux.com/48764
个人的使用心得:
- centos 系统下,证书的配置路径为
/etc/pki
,我们这里相当于创建一套自己的证书链,所以我的证书路径为/etc/pki/test
- 因为是用 openssl 生成证书,所以对
/etc/pki/tls/openssl.cnf
即 openssl 的配置文件进行了修改,该文件的内容即使用 openssl 时的一些默认配置 - 使用 openssl 的各个命令时,若参数是默认配置,可以不用指定;若想替换默认配置,指定对应参数即可;具体就看个人的使用喜好了。
例如,我在openssl.cnf
中添加了[ CA_test ]
相关的默认配置,所以使用openssl ca -name CA_test
即可免掉一下默认参数的指定
nginx 配置
nginx 的配置很简单,添加如下配置即可
ssl_verify_client on;
ssl_client_certificate cacert.pem;
其中 ssl_client_certificate
值得说明一下,其指定的文件中,存放的是签发验证客户端证书的相关证书的公密信息,格式为 pem 格式,可以罗列多个
什么是'签发验证客户端证书的相关证书'呢?举例说明:
c1、c2 是客户端证书
- 对于证书链 ca -> c1、c2; cacert.pem 中就要放 ca 的公密信息
- 对于证书链 ca -> a -> c1、c2; cacert.pem 中就要放 ca 和 a 的公密信息
- 对于证书链 ca1 -> a -> c1 和 ca2 -> c2; cacert.pem 中就要放 ca1、ca2、a 的公密信息
另外:
- 针对用例2、3,还得修改 nginx 的配置
ssl_verify_depth
- cacert.pem 中公密的顺序没有讲究
- 公密之间可以用
#
添加注释说明