数字证书学习-1- 应用于https


分析服务端环境

先搞清楚服务器部署了哪种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 NameC证书持有者所在国家要求填写国家代码,用2个字母表示
State or Province NameST证书持有者所在州或省份填写全称,可省略不填
Locality NameL证书持有者所在城市可省略不填
Organization NameO证书持有者所属组织或公司最好还是填一下
Organizational Unit NameOU证书持有者所属部门可省略不填
Common NameCN证书持有者的通用名必填。对于非应用证书,它应该在一定程度上具有惟一性;对于应用证书,一般填写服务器域名或通配符样式的域名。
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步

Created with Raphaël 2.2.0 开始 生成非对称秘钥 生成数字签名 生成数字证书 结束

写法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 创建数字证书, 也是三步

Created with Raphaël 2.2.0 开始 生成非对称秘钥 生成数字签名 生成数字证书 结束
  1. 生成秘钥的写法

openssl genrsa -out client.key
或者
openssl genrsa -out clientkey.pem

  1. 生成数字签名(又叫数字证书请求文件)的写法

openssl req -new -key client.key -out nginx.csr
或者
openssl req -new -key clientkey.pem -out nginx.csr

  1. 生成数字证书的写法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值