revoke_cert.sh
#!/bin/bash -e
# 吊销一个签证过的证书
openssl ca -revoke "${1}/${1}.crt"
openssl ca -gencrl -out "./demoCA/private/ca.crl"
简单分析一波脚本,首先是创建CA,对于Ubuntu系统来说,/etc/ssl/openssl.cnf配置中默认的CA路径就是./demoCA,为了不改动默认配置,直接按照默认配置的内容创建这些目录和文件即可。还有就是openssl子命令非常多,但是也和git一样,可以合并命令,比如用一条命令同时生成私钥和签证请求openssl req -nodes -newkey rsa:2048 -keyout client.key -new -out client.csr,在req的同时就做了genrsa。由于创建CA脚本只是第一次运行需要,因此把证书配置直接写死在脚本中就完事了。
接下来是创建客户端证书,为了简化用户的使用,在服务端帮助用户生成证书并签证,把签证过的证书下发给用户就可以了。由于用户可能是不同部门,不同姓名,不同邮件地址,因此将这三个参数外部化,做一下参数解析,加上友好的命令行提示防止遗忘。这个脚本特别注意最后一行,会生成一个PKCS12格式的证书。openssl默认产生的证书格式都是PEM的,会将公钥和私钥分开,但是浏览器导入的时候需要将这些内容合并起来形成证书链,所以需要将签证过的证书和私钥文件合并成一个PKCS12格式的证书,直接将这个.p12格式的证书交给用户就可以了。
最后是吊销证书了,当希望收回某个用户的访问权限时,直接运行这个脚本跟上目录名就可以了。
接下来运行创建CA的脚本:
./create_ca_cert.sh
Generating a 2048 bit RSA private key .......................+++ ........................................................................................................+++ writing new private key to './demoCA/private/cakey.pem' ----- Using configuration from /usr/ssl/openssl.cnf
此时产生的./demoCA目录结构如下:
demoCA/ ├── cacert.pem ├── crlnumber ├── crlnumber.old ├── index.txt ├── newcerts ├── private │ ├── ca.crl │ └── cakey.pem └── serial 2 directories, 7 files
此时就可以配置nginx了,在上面单向ssl的配置中,追加以下配置:
ssl_client_certificate ssl_certs/demoCA/cacert.pem; ssl_crl ssl_certs/demoCA/private/ca.crl; ssl_verify_client on;
ssl_client_certificate就是客户端证书的CA证书了,代表此CA签发的证书都是可信的,ssl_verify_client on;代表强制启用客户端认证,非法客户端(无证书,证书不可信)都会返回400错。
特别注意ssl_crl这个配置,代表Nginx会读取一个CRL(Certificate Revoke List)文件,之前说过,可能会有收回用户权限的需求,因此我们必须有吊销证书的功能,产生一个CRL文件让Nginx知道哪些证书被吊销了即可。








