ssl双向认证部署+如何吊销证书

记录下ssl双向认证部署过程,以备后用。

  • 部署webserver的https。
    我们需要在nginx服务器中配置服务端以https方式运行:
server {
    listen               443;  #监听在443端口
    server_name          auth.test.com; #服务域名

    ssl                  on; #开启ssl
    ssl_certificate      /etc/nginx/conf.d/server.crt;  #服务器证书
    ssl_certificate_key  /etc/nginx/conf.d/server.key; #服务器证书私钥
    ssl_session_timeout  5m;  #连接超时时间

    ssl_protocols  SSLv2 SSLv3 TLSv1; #支持的通信协议
    ssl_ciphers  HIGH:!aNULL:!MD5;  #支持的加密协议
    ssl_prefer_server_ciphers   on; 

    index index.html;
    root /usr/local/nginx/www/;

    access_log /var/log/nginx/auth.test.com.access.log;
    error_log /var/log/nginx/auth.test.com.error.log;

将上述内容加到nginx配置文件中(和其他配置不冲突,放在单独的server块中),重启nginx就可以用https方式访问了。

  • 对客户端进行验证

步骤如下:

  • 生成一个我们自己用的CA根证书(别人不会认的,放到浏览器里也会提示为未认证的CA)
    首先,要确认已安装了openssl,可以运行openssl -v命令来确认。如果已安装且是ubuntu系统(其他类型系统我未一一测试),要对/etc/ssl/openssl.conf做两处修改(修改前最好自己备份一下原文件)。
    第一处:
####################################################################
[ ca ]
#default_ca = CA_default        # The default ca section
default_ca  = test      #test for self-signed certfication

####################################################################

然后在接下来的 [ CA_default ]配置块后面增加一个[ test]配置块,与前面的default_ca对应:

#-------------------test---------#
[test]
dir = /etc/ssl/private
database = $dir/index.txt
serial = $dir/serial
private_key = $dir/ca.key
certificate = $dir/ca.crt
default_days = 3650
default_md = md5
crlnumber = $dir/crlnumber
crl = $dir/ca.crl               #吊销证书列表
default_crl_days= 3650     #这里之前从网上抄的配置是30,结果被坑了,被坑原因请参考http://blog.csdn.net/hrayha/article/details/47961301
new_certs_dir = $dir
policy = policy_match
# For self-sign certification test

保存即可。接下来需要生成CA的证书(基础证书,相当于伪造一个CA)和客户端证书(你要颁发给谁就给谁造一个,造多少都行,不要钱^_^,每个证书都用我们自己伪造的CA签发)。BTW,如果我们没有花钱购买服务器证书,也可以自己签发一个,和生成一个客户端证书的步骤一样,只是用的地方不同而已。在写具体操作之前,需要理解基本的几个步骤,基本上生成证书都有这几步:a. 生成一个私钥,一般以.key结尾的文件即是;b.生成一个签发请求,以.csr结尾的文件即是;c.用CA来签发该证书,生成.crt的证书文件;d. 如果给浏览器用,还需要做一下格式转换,生成一个.p12的文件(生成服务器证书不需要这一步)。然后把这个.p12的文件发给对方,对方导入浏览器,就可以接受我们网站的校验了。

tips:生成证书相关动作都需要用root权限来执行。

生成CA的步骤我就不详细写了,我这里给出一个脚本:

#!/bin/sh
# Generate the key.
openssl genrsa -out private/ca.key
# Generate a certificate request.
openssl req -new -key private/ca.key -out private/ca.csr
# Self signing key is bad... this could work with a third party signed key... registeryfly has them on for $16 but I'm too cheap lazy to get one on a lark.
# I'm also not 100% sure if any old certificate will work or if you have to buy a special one that you can sign with. I could investigate further but since this
# service will never see the light of an unencrypted Internet see the cheap and lazy remark.
# So self sign our root key.
openssl x509 -req -days 3650 -in private/ca.csr -signkey private/ca.key -out private/ca.crt
# Setup the first serial number for our keys... can be any 4 digit hex string... not sure if there are broader bounds but everything I've seen uses 4 digits.
echo FACE > private/serial
# Create the CA's key database.
touch private/index.txt
# Create a Certificate Revocation list for removing 'user certificates.'
echo FACE > private/crlnumber
openssl ca -gencrl -out /etc/ssl/private/ca.crl

这里面需要你填写国家、省份、市、公司名、部门名字以及邮箱、还有口令,可以不设置口令。

  • 生成一个客户端证书
    主要有这几步:
  sudo openssl genrsa -des3 -out client.key 2048
  sudo openssl req -new -key client.key -out client.csr
  sudo openssl ca -in client.csr -out client.crt -cert private/ca.crt -keyfile private/ca.key
  sudo openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12

注意,签发客户端证书时,需要填写的国家、省份、市、公司名、部门名、邮箱都需要和之前的一致。
tips:这里需要强调的是,会提示你输入一个export口令,这里不能省略,因为某些系统在导入证书时,默认不接受空口令。
上述命令执行成功后,就生成了client.p12,这个文件就可以颁发给你的客户了,他可以导入浏览器来访问我们的网站。
如果要让没有被颁发证书的人不能访问网站,还需更改下nginx配置来校验客户端证书,更改后内容如下:

server {
    listen               443;  #监听在443端口
    server_name          auth.test.com; #服务域名

    ssl                  on; #开启ssl
    ssl_certificate      /etc/nginx/conf.d/server.crt;  #服务器证书
    ssl_certificate_key  /etc/nginx/conf.d/server.key; #服务器证书私钥
    ssl_client_certificate /etc/ssl/private/ca.crt;     #客户端证书的CA证书
    ssl_verify_client on;  #打开客户端证书验证
    ssl_session_timeout  5m;  #连接超时时间

    ssl_protocols  SSLv2 SSLv3 TLSv1; #支持的通信协议
    ssl_ciphers  HIGH:!aNULL:!MD5;  #支持的加密协议
    ssl_prefer_server_ciphers   on; 

    index index.html;
    root /usr/local/nginx/www/;

    access_log /var/log/nginx/auth.test.com.access.log;
    error_log /var/log/nginx/auth.test.com.error.log;

吊销证书(/etc/ssl目录,root权限执行)

openssl ca -revoke client.crt -cert private/ca.crt -keyfile private/ca.key

openssl ca -gencrl -out private/ca.crl

可通过openssl verify -crl_check -CRLfile private/ca.crl -CAfile private/ca.crt client.crt 验证是否被吊销

执行以上命令后依然可以访问站点,还需重启nginx,重启nginx后无法访问站点

你可能感兴趣的:(ssl,ssl双向认证)