文章目录
分析服务端环境
先搞清楚服务器部署了哪种web应用;
实际服务可能 部署了 一种或多种web服务程序 包括
(tomcat ,ngnix, netty,nodejs ,python ,iis ,weblogic,dubbo 等)
如果是复杂环境,建议用ngnix 做代理 , 如果你只有tomcat 项目,那可以只用tomcat
所以本文主要学习ngnix配置。
分析需求
1)是否需要验证服务端
如果需要,那么需要用 openssl 发布服务端证书.
如果我们的服务端证书非CA授权,那么还需要在服务端创建根证书. 作为证书链的顶层.
2)是否需要验证客户端
如果需要,那么需要用 openssl 发布客户端证书
3)是否需要加密传输
需要引入常用的对称加密算法
学习 openssl
openssl是证书开发的必要工具 ,类似的工具还有java 的keytool
下面详细介绍主要知识
openssl 安装与配置
这里仅介绍window下安装
到http://slproweb.com/products/Win32OpenSSL.html下载
新建系统变量OPENSSL_CONF 指向 openssl.cfg 文件
新建系统变量OPENSSL_HOME 指向 openssl主目录
把 %OPENSSL_HOME%\bin添加到window path中
openssl.cfg配置
主要配置 DN
DN字段名 | 缩写 | 说明 | 填写要求 |
---|---|---|---|
Country Name | C | 证书持有者所在国家 | 要求填写国家代码,用2个字母表示 |
State or Province Name | ST | 证书持有者所在州或省份 | 填写全称,可省略不填 |
Locality Name | L | 证书持有者所在城市 | 可省略不填 |
Organization Name | O | 证书持有者所属组织或公司 | 最好还是填一下 |
Organizational Unit Name | OU | 证书持有者所属部门 | 可省略不填 |
Common Name | CN | 证书持有者的通用名 | 必填。对于非应用证书,它应该在一定程度上具有惟一性;对于应用证书,一般填写服务器域名或通配符样式的域名。 |
Email Address | 证书持有者的通信邮箱 | 可省略不填 |
具体配置,可以参考
本文 附件> OPENSSL配置
本文 附件> nginx配置ssl双向验证的方法
注意:
1)配置文件中的注解只能用# 不要用 / * * /或者//.
openssl 创建随机数
大部分秘钥都依赖随机数,openssl生成的随机数保存在随机数文件(由配置文件指定)中, 写法有
openssl rand 10
openssl rand -hex 10
openssl rand -base64 20
openssl rand -out .rand 1000
等
openssl 命令
创建根证书 主要用途
1)为子证书签名
2)为认证证书是否是证书链的节点
创建根证书分为3步
写法1:
openssl genrsa -out ca/ca-key.pem 1024
openssl req -new -key ca/ca-key.pem -out rootCA.csr
openssl ca -selfsign -in rootCA.csr
写法2:(分三步生成):
openssl genrsa -out prikey.pem
openssl req -new -key prikey.pem -out req1.csr -md5
openssl req -x509 -key prikey.pem -in req1.csr -out CA1.crt -days 180
或者
openssl ca -in req1.csr -out CA1.crt -days 365
或者
openssl x509 -req -in req1.csr -out CA1.pem -signkey prikey.pem -days 200
写法3:(分两步)
openssl genrsa -out cakey.pem
openssl req -new -x509 -key cakey.pem -out CA3.crt -days 300
写法4:(一步到位)
一步生成私钥和证书
openssl req -new -x509 -days 365 -keyout CA.key -out CA.crt
或者
openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CA2.key -out CA2.crt
去除密码保护
openssl rsa -in CARoot.key -out CARoot.key
说明
- 以上的路径需要根据openssl.cfg 来
- 以上的秘钥/签名/证书名, 都可以自定义, 不是固定的
参考:
http://www.cnblogs.com/f-ck-need-u/p/7115871.html
http://www.cnblogs.com/f-ck-need-u/p/6091105.html
openssl 创建数字证书, 也是三步
- 生成秘钥的写法
openssl genrsa -out client.key
或者
openssl genrsa -out clientkey.pem
- 生成数字签名(又叫数字证书请求文件)的写法
openssl req -new -key client.key -out nginx.csr
或者
openssl req -new -key clientkey.pem -out nginx.csr
- 生成数字证书的写法
openssl ca -in nginx.csr -out nginx.crt -days 365
或者
openssl x509 -req -in nginx.csr -out client/client.pem -signkey clientkey.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365
或者
openssl ca -in nginx.csr -out nginx.crt -cert CA.crt -keyfile CA.key -days 100
- 导出
openssl pkcs12 -export -clcerts -in client.pem -inkey client.pem -out client/client.p12
创建非根证书的方法都一致,只是文件名字不同
openssl 配置文件
[default]
name = rootca # 变量
home = e:/ssl # 变量
default_ca = CA_default
[req]
default_bits = 2048
#encrypt_key = no
default_keyfile = $home/ca/cakey.pem
default_md = sha256
utf8 = yes
string_mask = utf8only
#prompt = no #/* 测试时该选项导致出错,所以将其注释掉*/
#prompt = yes
distinguished_name = CA_DN
#req_extensions = v3_req
x509_extensions = v3_ca
[v3_req]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[v3_ca]
# Extensions for a typical CA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
keyUsage = cRLSign, keyCertSign # 典型的CA证书的使用方法设置,由于测试使用所以注释了
#如果真的需要申请为CA 可以如此配置
[CA_default]
certs = $home/certs # 已生成的证书的默认保存目录
new_certs_dir = $home/certs
crl_dir = $home/db/crl # 生成的证书撤销列表(CRL)的默认保存目录
utf8 = yes
crl = $home/db/crl.pem
database = $home/db/index.txt
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/ca/$name.crt
private_key = $home/ca/$name.key
RANDFILE = $home/.rand
unique_subject = no
copy_extensions = none
default_days = 365
default_crl_days = 365
default_md = sha256
policy = policy_to_match
[policy_to_match]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[CA_DN]
countryName = "C"
countryName_default = "CH"
organizationName = "O"
organizationName_default = "hyl.com"
commonName = "CN"
commonName_default = "localhost"
证书格式转换写法
pem转p12
openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12
其他说明:
1_ “-newkey"选项和”-new"选项类似,只不过"-newkey"选项可以直接指定私钥的算法和长度,所以它主要用在openssl req自动创建私钥时。例如:
openssl req -newkey rsa:2048 -out req3.csr -nodes -keyout myprivkey.pem
实际用例可以参考:
windows下使用openssl生成|CA证书的步骤
http://zctya.blog.163.com/blog/static/1209178201251310292958/
ngnix 配置ssl
server {
listen 443 ssl;
server_name usb.dev;
access_log off;
ssl on;
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
ssl_client_certificate ssl/ca.crt;
ssl_verify_client on;
location / {
proxy_pass http://backend$request_uri;
}
}
其中 ssl_client_certificate /etc/nginx/ssl/ca.crt; 的意思是使用 CA 证书来验证请求带的客户端证书是否是该 CA 签发的。
配置好后就就重新加载 NGINX 吧:
service nginx reload
window下的查杀进程脚本
netstat -aon|findstr "443"
tasklist|findstr "pid"
taskkill /f /t /im ngnix.exe
实验步骤: 共7步
1创建目录
cd D:\ssl
mkdir ca,certs,conf,db
2 添加文件
type >db/index.txt
type null>db/index.txt.attr
echo “00”>db/serial.txt #第一行写上00
conf/ssl.conf
3 配置好ssl.conf ,把该文件 添加到系统环境变量OPENSSL_CONF
注意修改相关目录和文件路径
4 编写自动化脚本
type >start.bat
openssl rand -out .rand 1000
openssl req -new -newkey rsa:1024 -x509 -days 3650 -keyout ca/ca.key -out ca/ca.crt -subj /C=CN/O=hllh/CN=manage.hllhw8.com -passout pass:123456
openssl rsa -in ca/ca.key -out ca/ca.key -passin pass:123456
openssl genrsa -out certs/server.key 1024
openssl req -new -key certs/server.key -out certs/server.csr -subj /C=CN/O=hllh/CN=localhost -passout pass:123456
openssl x509 -req -sha256 -in certs/server.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -days 1200 -out certs/server.crt -passin pass:123456
openssl genrsa -out certs/client.key 1024
openssl req -new -key certs/client.key -out certs/client.csr -subj /C=CN/O=hllh/ou=manager/CN=localhost
openssl x509 -req -sha256 -in certs/client.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -days 1200 -out certs/client.crt -passin pass:123456
openssl pkcs12 -export -clcerts -in certs/client.crt -inkey certs/client.key -out certs/client.p12 -passout pass:123456
5 配置ngnix
把生成 数字证书和秘钥文件 拷贝到ngnix 目录的 ssl目录下 (如果没有新建)
(只要拷贝 server.key server.crt ca.crt 到ssl下)
然后配置 ssl 相关参数指向 ssl 目录下的 指定文件
6 双击 client.p12 安装到window
需要输入密码123456
7 访问https://localhost
信任服务端证书后,才能访问,注意是https: ,不是http
附件
openssl 下载
http://slproweb.com/products/Win32OpenSSL.html
OPENSSL配置
http://www.cnblogs.com/f-ck-need-u/p/6091027.html
使用OpenSSL生成证书****
https://www.cnblogs.com/AloneSword/p/3809002.html
openssl签署和自签署证书的多种实现方式***********
http://www.cnblogs.com/f-ck-need-u/p/6091105.html
如何使用OpenSSL工具生成根证书与应用证书********
https://www.cnblogs.com/kenshinobiy/p/7441830.html
openssl基本原理 + 生成证书 + 使用实例**********
https://blog.csdn.net/zxh2075/article/details/79967227
openssl系列***********
http://www.cnblogs.com/f-ck-need-u/p/7048359.html#blogopenssl
https原理及实践***
https://www.cnblogs.com/lyq863987322/p/8424253.html#_label0_2
OpenSSL命令—pkcs12***
https://blog.csdn.net/as3luyuan123/article/details/16105475
KeyTool、openssh构造数字证书**
https://blog.csdn.net/liuquan0071/article/details/50835405
nginx配置ssl双向验证的方法
https://www.jb51.net/article/57012.htm
NGINX 配置 SSL 双向认证
https://www.cnblogs.com/UnGeek/p/6049004.html
HTTPS证书验证流程及SSL证书生成步骤【附nginx开启https配置】
https://blog.csdn.net/witmind/article/details/78456660
nginx配置ssl加密(单/双向认证、部分https)
https://blog.csdn.net/lcathm/article/details/50958124