Nginx SSL双向认证配置经验

By zhujinliang. Filed in 软折腾  |   
标签:, ,
Home  

1. 确保已安装openssl

2. 进入/etc/ssl,图省事,以此目录作为证书生成工作目录

3. 编辑openssl.cnf。在[ ca ]下建立新的配置节,取名为[ nginx_ssl_auth ]:

[ nginx_ssl_auth ]
dir = /etc/ssl/private
database = $dir/index.txt
serial = $dir/serial
private_key = $dir/ca.key
certificate = $dir/ca.crt
default_days = 365
default_md = sha1
new_certs_dir = $dir
policy = policy_match

修改ca节中default_ca为新建的配置节名,即nginx_ssl_auth

注意policy_match节中配置,将影响证书匹配检查。我将countryName, stateOrProvinceName, organizationName置位match。

req_distinguished_name节中可以修改一些默认配置,在之后生成各种证书时就不必每次都输入了。

其他的没再去研究。

4. 建根证书。在网上找了一段命令,可将其存为sh。

openssl genrsa -out private/ca.key 2048
# 产生一个证书请求
openssl req -new -key private/ca.key -out private/ca.csr
# self sign该证书
openssl x509 -req -days 3650 -in private/ca.csr -signkey private/ca.key -out private/ca.crt
# 写入初始证书序号,为4个HEX字符。
echo 12A8 > private/serial
# 生成证书数据库
touch private/index.txt
# 产生crl文件,供吊销证书使用
openssl ca -gencrl -out /etc/ssl/private/ca.crl -crldays 7

根据提示操作,便可生成一个时长为10年的ca证书。存放在/etc/ssl/private/下。

5. 生成服务器证书。同样是一堆命令。

# 生成key
openssl genrsa -out private/server.key 2048
# 生成请求
openssl req -new -key private/server.key -out private/server.csr
# 使用ca注册证书
openssl ca -in private/server.csr -cert private/ca.crt -keyfile private/ca.key -out private/server.crt

6. 此时可将ca.crt, server.key, server.crt拷贝到相应的目录。配置nginx服务器。有关配置指令:

ssl on;
ssl_certificate      server.crt;
ssl_certificate_key  server.key;
ssl_client_certificate  ca.crt;
ssl_verify_client  on;
ssl_session_timeout  60m;
ssl_protocols        SSLv2 SSLv3 TLSv1;
ssl_ciphers          ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers       on;

之后reload即可生效。

7. 生成用户证书:

#!/bin/sh
base="/etc/ssl/private"
mkdir -p $base/users/$1/

# 产生key,使用des3加密。我觉得此处不加密也可
openssl genrsa -des3 -out $base/users/$1/$1.key 2048
# 产生请求
openssl req -days 365 -new -key $base/users/$1/$1.key -out $base/users/$1/$1.csr
# 注册证书
openssl ca -in $base/users/$1/$1.csr -cert $base/ca.crt -keyfile $base/ca.key -out $base/users/$1/$1.crt

# 导出为pkcs12格式。导出时会询问导出密码
openssl pkcs12 -export -clcerts -in $base/users/$1/$1.crt -inkey $base/users/$1/$1.key -out $base/users/$1/$1.p12

使用方法:new_user.sh "用户名"。注意生成证书过程中几项值要一样,否则无法匹配。即使生成证书也不可用。

将证书拷贝到客户机,导入证书,然后在登录网站时便会出现选择证书的提示。选择证书后即可访问。证书错误或无对应证书则提示禁止访问。

8. 证书的吊销

启用吊销证书检查,需配置nginx,添加一项:

ssl_crl ca.crl;

吊销证书命令:

# 吊销证书。注意应输出完整的证书文件路径
openssl ca -revoke "证书文件"
# 重新生成crl文件,此处可直接将输出文件置位nginx中引用的文件
openssl ca -gencrl -crldays 7 -out ca.crl
# 如需立即生效,需reload nginx服务器
/etc/init.d/nginx reload

还必须注意的一点是,我们设置crl文件过期时间为7天,如果7天后,我们未更新crl文件,nginx服务器将拒绝所有证书匹配。故我们还应开启crontab,定期更新crl文件。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*