nginx https 双向认证证书创建与配置

脚本一键完成, 最后会提示输入一个客户端密码


#!/bin/bash
# function: 创建 nginx https ,双向认证证书
# create: 2014-11-27
#
# BEGIN
#
# 网站域名
# 在签发服务(客户)端证书的时候
# 这个域名必须跟 subj 中的 CN 对应
# 否则浏览器会报不安全的链接
domain="opt011.9yuonline.com"
#
# ---------- CA ----------
#
# 准备CA密钥
echo "创建CA密钥.."
openssl genrsa -out $domain.CA.key 2048
# 生成CA证书请求
# 证书请求都是根据私钥来生成的
echo "生成CA证书请求.."
openssl req -new \
    -key $domain.CA.key \
    -out $domain.CA.csr \
    -days 365 \
    -subj /C=CN/ST=GuangDong/L=GuangZhou/O=www.eyugame.com/OU=www.eyugame.com/CN=opcenter/[email protected] -utf8

# 签名CA证书请求
# 使用自己的私钥来给这个CA证书请求签名
# 经过多次测试得知: 这个时间如何设置的太长,如 3650(10年) 
# chrome浏览器会报, 该网站使用的安全设置已过期
# 所以https不会显示是绿色, 而是带一个黄色三角形的图标
# 奇怪的是: 如果设成1年,也就是365天,不会提示该网站使用的安全设置已过期
# 而且也是绿色的标识
# 但如果是2年, 也是绿色的标识,但是会提示该网站使用的安全设置已过期
# 这个应该chrome浏览器的问题
echo "创建CA证书.."
openssl x509 -req -in $domain.CA.csr -signkey $domain.CA.key -out $domain.CA.crt -days 365

# CA证书转换为DER格式,
# DER格式似乎更加通用
openssl x509 -in $domain.CA.crt -out $domain.CA.der -outform DER
# 现在, 终于拿到了自己做 CA 需要的几个文件了, 
# 密钥: $domain.CA.key
# 证书: $domain.CA.crt
# 系统使用的: $domain.CA.der
# 接下来, 要创建一个网站, 就需要让 CA 给他签名一个证书了

#
# --------- SERVER ----------
#
# 准备网站密钥
echo "创建网站(服务端)密钥.."
openssl genrsa -out $domain.server.key 2048
# 生成网站证书请求
# CN 一定要是网站的域名, 否则会通不过安全验证
echo "生成网站(服务端)证书请求.."
openssl req -new -key $domain.server.key -out $domain.server.csr -days 365 \
    -subj /C=CN/ST=GuangDong/L=GuangZhou/O=www.eyugame.com/OU=www.eyugame.com/CN=$domain/[email protected] -utf8

# CA签名网站证书请求
# 不是拿到 CA 的证书了就可以说自己是 CA 的, 最重要的是, 签名需要有 CA 密钥
# 如果客户端(个人浏览器)信任 CA 的证书的话, 那么他也就会信任由 CA 签名的网站证书
# 因此让浏览器信任 CA 的证书之后, 客户端就自然信任服务端了, 只要做单向认证的话, 到这一步证书这一类材料就已经准备好了
# 但是双向认证就还要给客户端(个人的浏览器)准备一份证书
# 让服务端可以知道客户端也是合法的。
# 假如让服务端也信任 CA 的证书
# 那 CA 签名的客户端证书也就能被信任了。
echo "通过CA证书签名, 创建网站(服务端)证书.."
openssl x509 \
    -req -in $domain.server.csr \
    -out $domain.server.crt \
    -CA $domain.CA.crt \
    -CAkey $domain.CA.key \
    -CAcreateserial \
    -days 365

#
# --------- CLIENT ----------
#
# 准备客户端私钥
echo "创建浏览器(客户端)密钥.."
openssl genrsa -out $domain.client.key 2048
# 生成客户端证书请求
echo "生成浏览器(客户端)证书请求.."
openssl req -new -key $domain.client.key -out $domain.client.csr -days 3650 \
    -subj /C=CN/ST=GuangDong/L=GuangZhou/O=www.eyugame.com/OU=www.eyugame.com/CN=$domain/[email protected] -utf8
# CA签名客户端证书请求
echo "通过CA证书签名, 创建浏览器(客户端)证书.."
openssl x509 -req \
    -in $domain.client.csr \
    -out $domain.client.crt \
    -CA $domain.CA.crt \
    -CAkey $domain.CA.key \
    -CAcreateserial \
    -days 365 
# 客户端证书转换为DER格式
openssl x509 -in $domain.client.crt -out $domain.client.der -outform DER
# 客户端证书转换为 PKCS, 即12格式
# 全称应该叫做 Personal Information Exchange
# 通常以 p12 作为后缀
echo "转换客户端证书为p12格式.."
openssl pkcs12 -export -in $domain.client.crt -inkey $domain.client.key -out $domain.client.p12

## nginx https 配置示例如下
#
# server {
#         listen 443;
#         server_name opt011.9yuonline.com;
#         root /var/www/html;
#         index index.html index.php;
#         ssl on;
#         ssl_certificate ssl/opt011.9yuonline.com.server.crt;
#         ssl_certificate_key  ssl/opt011.9yuonline.com.server.key;
#         ssl_client_certificate ssl/opt011.9yuonline.com.CA.crt;
#         ssl_session_timeout  5m;
#         ssl_verify_client on;
#         ssl_protocols  SSLv2 SSLv3 TLSv1;
#         ssl_ciphers  RC4:HIGH:!aNULL:!MD5;
#         ssl_prefer_server_ciphers   on;
# 
#         location ~ .*\.php$ {
#                 include fastcgi.conf;
#                 fastcgi_pass  127.0.0.1:9000;
#                 fastcgi_index index.php;
#                 expires off;
#         }
# }

#
# END
#


你可能感兴趣的:(shell,linux)