适用于公司内部一些业务系统对安全性要求比较高,业务系统只允许公司内部人员访问,而且要求浏览器要安装证书登录,对公司入职有需求的人员开通证书,流失的人员注销证书。
修改openssl配置参数
vim /etc/pki/tls/openssl.cnf
下面只列出配置文件中和自建CA有关的几个关键指令
dir=/etc/pki/CA #CA的工作目录
database=$dir/index.txt #签署证书的数据记录文件,下面会生成index这个文件
new_certs_dir=$dir/newcerts #存放新签署证书的目录
serial=$dir/serial #新证书签署号记录文件下,下面会生成serial这个文件
certificate=$dir/ca.crt #CA的证书路径,下面会对应生成ca.crt这个证书
private_key=$dir/private/cakey.pem #CA的私钥路径,下面会生成这个密钥
crlnumber = $dir/crlnumber # 吊销证书用,下面会生成这个文件
crl = $dir/ca.crl # 当前证书列表,与下面生成的吊销证书文件名一致
使用openssl制作CA的自签名证书
切换到CA的工作目录
cd /etc/pki/CA/
制作CA私钥
umask 0077 ##建立文件时预设权限掩码为0077 确保证书只有拥有者才可以访问
openssl genrsa -out private/cakey.pem 2048 ##制作RSA算法,长度为2048的ca私钥
制作自签名证书,建议制作好了后备份一下ca.crt证书
openssl req -new -x509 -key private/cakey.pem -out ca.crt
注意 commonName = test.com(对应域名) ###这个填域名,这个是后面证书的颁发者
生成数据记录文件,生成签署号记录文件,给文件一个初始号。
touch index.txt serial crlnumber
echo '01' > serial
echo '01' > crlnumber
openssl ca -gencrl -crldays 3650 -out ca.crl # 产生crl文件,供吊销证书使用
自建CA完成
注意事项:
制作证书时会提示输入密码,设置密码可选,服务器证书和客户端证书密码可以不相同。
服务器证书和客户端证书制作时提示输入省份、城市等,需保持一致,commonName这个需要不同。
准备服务器端证书
建立存放服务器证书文件夹
cd /etc/pki/CA && umask 0022 && mkdir server && cd server
制作服务器端私钥
umask 0077 && openssl genrsa -out server.key 2048
制作服务器端证书申请指定使用sha512算法签名(默认使用sha1算法)
openssl req -new -key server.key -sha512 -out server.csr
openssl ca -in server.csr -out server.crt -days 3650
准备客户端证书
建立存放客服端证书的文件夹
cd /etc/pki/CA && umask 0022 && mkdir client && cd client
制作客户端私钥
umask 0077 && openssl genrsa -out client.key 2048
制作客户端证书申请
openssl req -new -key client.key -sha512 -out client.csr
签署证书,有效期为1年
openssl ca -in client.csr -out client.crt -days 365
nginx的配置
nginx编译的时候要带上 –with-http_ssl_module选项
vim /etc/nginx/conf.d/ssl.conf
server{listen 443 ssl; #SSL 访问端口号为 443ssl_certificate /etc/pki/CA/server/server.crt; #当前虚拟主机使用使用的公钥文件,一般是crt文件ssl_certificate_key /etc/pki/CA/server/server.key; #当前虚拟主机使用的私钥文件,一般是key文件ssl_client_certificate /etc/pki/CA/ca.crt; #当前虚拟主机的用来签发客户端证书的ca证书,验证客户端证书ssl_verify_client on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #支持ssl协议版本ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #配置加密套件,写法遵循 openssl 标准ssl_prefer_server_ciphers on;ssl_crl /etc/pki/CA/ca.crl; #检查吊销的证书location / {proxy_pass http://192.168.190.178:8080;proxy_redirect default; }
}
检查 nginx 配置
nginx -t
重新加载配置文件
nginx -s reload
客户端证书格式转换
将文本格式的证书转换成可以导入浏览器的证书
cd /etc/pki/CA/client
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
将客户端证书传到 windows上,然后把client.p12导入到浏览器的个人证书里,重启浏览器,导入正常就能正常访问,否则返回400没有证书被发送错误。
sz client.p12
撤销用户证书
例如要注销名字为ceshi的证书,得到ceshi这张证书对应的值为03
cat /etc/pki/CA/index.txt | grep ceshi
cd /etc/pki/CA/newcerts/
openssl ca -revoke 03.pem ##完成注销,证书的V会变为R
openssl ca -gencrl -crldays 3650 -out /etc/pki/CA/ca.crl ###更新ca.crl文件,注意要和nginx配置的吊销路径一致
/usr/local/nginx/sbin/nginx -s reload ####重启nginx ,吊销证书生效
openssl crl -in /etc/pki/CA/ca.crl -noout -text
如果后端应用本来就是https应用,而且应用本来就需要双向认证,这时就需要加上代理证书了,比如应用服务端需要验证的客户端证书名为 tomcatclient.pfx
先提取 tomcatclient.pfx 的私钥和证书
openssl pkcs12 -in tomcatclient.pfx -nodes -out tomcatclient.pem
此时证书和私钥就放在了 tomcatclient.pem 文件中,需要自己手动拷贝
nginx的配置
server{listen 444 ssl;ssl_certificate /etc/pki/CA/server/server.crt;ssl_certificate_key /etc/pki/CA/server/server.key;ssl_client_certificate /etc/pki/CA/ca.crt;ssl_verify_client on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_prefer_server_ciphers on;ssl_crl /etc/pki/CA/ca.crl;proxy_ssl_certificate /etc/pki/CA/client/tomcatclient.cer;proxy_ssl_certificate_key /etc/pki/CA/client/tomcatclient.key;location / {proxy_pass https://192.168.190.178:8444;proxy_redirect default;}
}