openssl双向认证 (自签发证书实例)

基础知识

SSL:Secure Socket Layer,安全套接字层,它位于TCP层与Application层之间。提供对Application数据的加密保护(密文),完整性保护(不被篡改)等安全服务,它缺省工作在TCP 443 端口,一般对HTTP加密,即俗称的HTTPS。

SSL双向认证具体过程
① 浏览器发送一个连接请求给安全服务器。
② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。
③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的CA中心(如沃通CA)所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。
④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。
⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。
⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。
⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。
⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。
⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。
⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。




制作根证书
1. 生成CA私钥:ca.key (这个是信任的起点,根证书,所有其他的证书都要经过CA的私钥签名)
openssl genrsa -des3 -out ca.key 2048

2. 生成 CA根证书的公钥:ca.crt
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt



制作服务端证书
1. 生成证服务端书私钥:server.pem
openssl genrsa -des3 -out server.pem 1024

生成无密码的服务端私钥:server.key
openssl rsa -in server.pem -out server.key

2. 生成服务端签发请求:server.csr
openssl req -new -key server.pem -out server.csr

4. 最后用CA证书给服务端证书进行签名
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt

把ca.crt的内容追加到server.crt后面,因为有些浏览似乎不支持
cat ca.crt >> server.crt



制作客户端证书 (跟制作服务端证书步骤一样)
1. 生成客户端证书私钥
openssl genrsa -des3 -out client.pem 2048

2. 生成客户端证书签发请求
openssl req -new -key client.pem -out client-req.csr

3. 用CA证书给客户端证书进行签名
openssl x509 -req -sha256 -in client-req.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt

客户端证书CRT转换为PKCS      #12格式(全称应该叫做 Personal Information Exchange,通常以 p12作为后缀)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.pem -out chenbo.p12


nginx配置

server {
        listen       443;
        server_name  www.test.com;
        charset koi8-r;
        #access_log  logs/host.access.log  main;

        ssl on;   #开启ssl
        ssl_certificate /root/security/server.crt;      #服务端证书位置
        ssl_certificate_key /root/security/server.key;       #服务器私钥
        ssl_session_timeout 5m;       #session有效期,5分钟
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL;   #加密算法
        ssl_prefer_server_ciphers on;

        ssl_verify_client on;     #开启客户端验证
        ssl_client_certificate /root/security/ca.crt;        #CA证书用于验证客户端证书的合法性
        ssl_verify_depth 1;

以上实例通过本人测试验证没有问题,可以实现openssl双向认证的效果,此文档属于个人随笔文档。

你可能感兴趣的:(linux,openssl,openssl,实例,加密,安全)