安装Nginx和OpenSSL

yum install nginx openssl -y

SSL 服务器 / 客户端双向验证证书的生成

创建一个新的 CA 根证书,在 nginx 安装目录下新建 ca 文件夹,进入 ca,创建几个子文件夹

$ mkdir ca && cd ca
$ mkdir newcerts private conf server # newcerts 子目录将用于存放 CA 签署过的数字证书(证书备份目录);private 用于存放 CA 的私钥;conf 目录用于存放一些简化参数用的配置文件;server 存放服务器证书文件。

conf 目录新建 openssl.conf 文件

[ ca ]
default_ca = foo # The default ca section [ foo ]
dir = ./ # top dir
database = ./index.txt # index file.
new_certs_dir = ./newcerts # new certs dir certificate = ./private/ca.crt # The CA cert
serial = ./serial # serial no file
private_key = ./private/ca.key # CA private key
RANDFILE = ./private/.rand # random number file default_days = 3650 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha256 # message digest method to use
unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
policy = policy_any # default policy [ policy_any ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = match
localityName = optional
commonName = supplied
emailAddress = optional

生成私钥 key 文件

$ openssl genrsa -out private/ca.key 2048
输出
Generating RSA private key, 2048 bit long modulus
.......+++
.........................+++
e is 65537 (0x10001)
private 目录下有 ca.key 文件生成。

生成证书请求 csr 文件

$ openssl req -new -key private/ca.key -out private/ca.csr

生成凭证 crt 文件

$ openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt

private 目录下有 ca.crt 文件生成。

为我们的 key 设置起始序列号和创建 CA 键库

$ echo FACE > serial
#可以是任意四个字符
$ touch index.txt

为 "用户证书" 的移除创建一个证书撤销列表

$ openssl ca -gencrl -out ./private/ca.crl -crldays 7 -config "./conf/openssl.conf"
# 输出
Using configuration from ./conf/openssl.conf
private 目录下有 ca.crl 文件生成。

服务器证书的生成

创建一个 key

$ openssl genrsa -out server/server.key 2048
为我们的 key 创建一个证书签名请求 csr 文件
$ openssl req -new -key server/server.key -out server/server.csr
使用我们私有的 CA key 为刚才的 key 签名
$ openssl ca -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out server/server.crt -config "./conf/openssl.conf"
# 输出
Using configuration from ./conf/openssl.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :ASN.1 12:'GuangDong'
localityName :ASN.1 12:'XX'
organizationName :ASN.1 12:'****'
organizationalUnitName:ASN.1 12:'**'
commonName :ASN.1 12:'**'
emailAddress :IA5STRING:'****'
Certificate is to be certified until Mar 19 07:37:02 2017 GMT (365 days)
Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

注:签名信息每次必须输入一致

客户端证书的生成 * 创建存放 key 的目录 users

$ mkdir users  

* 为用户创建一个 key

$ openssl genrsa -des3 -out ./users/client.key 2048
输出:
Enter pass phrase for ./users/client.key:123
Verifying - Enter pass phrase for ./users/client.key:123
#要求输入 pass phrase,这个是当前 key 的口令,以防止本密钥泄漏后被人盗用。两次输入同一个密码(比如我这里输入 123),users 目录下有 client.key 文件生成。
为 key 创建一个证书签名请求 csr 文件
$ openssl req -new -key ./users/client.key -out ./users/client.csr
#users 目录下有 client.csr 文件生成。

使用我们私有的 CA key 为刚才的 key 签名

$ openssl ca -in ./users/client.csr -cert ./private/ca.crt -keyfile ./private/ca.key -out    ./users/client.crt -config "./conf/openssl.conf"

将证书转换为大多数浏览器都能识别的 PKCS12 文件

$ openssl pkcs12 -export -clcerts -in ./users/client.crt -inkey ./users/client.key -out ./users/client.p12

输出

Enter pass phrase for ./users/client.key:
Enter Export Password:
Verifying - Enter Export Password:

输入密码后,users 目录下有 client.p12 文件生成。

Nginx配置

vhosts.xxx.conf 在 server { }段输入如下代码

    listen       443;
server_name localhost;
ssi on;
ssi_silent_errors on;
ssi_types text/shtml; ssl on;
ssl_certificate /usr/local/nginx/ca/server/server.crt;
ssl_certificate_key /usr/local/nginx/ca/server/server.key;
ssl_client_certificate /usr/local/nginx/ca/private/ca.crt; ssl_session_timeout 5m;
ssl_verify_client on; #开户客户端证书验证
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:HIGH:!aNULL:!MD5:!ADH:!DH; ssl_prefer_server_ciphers on;

重新启动Nginx

nginx -t
nginx -s reload

在浏览器导入client.p12文件即可访问

Nginx SSL 双向认证的更多相关文章

  1. Nginx、SSL双向认证、PHP、SOAP、Webservice、https

    本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是 ...

  2. nginx支持ssl双向认证配置

    nginx支持ssl双向认证配置 listen 443; server_name test.com; ssl on; ssl_certificate server.crt; //server端公钥 s ...

  3. SSL双向认证(高清版)

    介绍了SSL双向认证的一些基本问题,以及使用Nginx+PHP基于它搭建https的Webservice. 之前的方式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这里我再整理记录下. 由于n ...

  4. php实现https(tls/ssl)双向认证

    php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...

  5. tomcat配置SSL双向认证

    一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...

  6. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

  7. apache用户认证,ssl双向认证配置

    安装环境: OS:contos 6.4 httpd:httpd-2.2.15-59.el6.centos.i686.rpm openssl:openssl-1.0.1e-57.el6.i686.rpm ...

  8. ssl双向认证

    ssl双向认证 一.背景知识 1.名词解释 ca.key: 根证书的私钥 , ca.crt: 根证书的签名证书 server.key, server.crt client.key, client.cr ...

  9. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...

  10. php使用curl库进行ssl双向认证

    官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?phpcurl_setopt($ch, CUR ...

随机推荐

  1. VUE百度地图API调用(手机端、PC端、微信通用)

    百度地图API-示例中心: https://lbsyun.baidu.com/jsdemo.htm#aCreateMap 1.引入百度地图(此处用到的是V2.0版本) 1> 建立一个js文件,例 ...

  2. python之爬虫二

    10正则表达式 正则表达式(regular expression)是一种字符串匹配模式或者规则,它可以用来检索.替换那些符合特定规则的文本.正则表达式几乎适用于所有编程语言,无论是前端语言 JavaS ...

  3. dev-tools

    Maven配置依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  4. LeeCode 栈与队列问题(二)

    LeeCode 239: 滑动窗口最大值 题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右 ...

  5. CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)

    本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址 ...

  6. Tomcat长轮询原理与源码解析

    Tomcat长轮询原理与源码解析 系列文章目录和关于我 零丶长轮询的引入 最近在看工作使用到的diamond配置中心原理,发现大多数配置中心在推和拉模型上做的选择出奇的一致选择了基于长轮询的拉模型 基 ...

  7. Abp框架Web站点的安全性提升

    本文将从GB/T 28448-2019<信息安全技术 网络安全等级保护测评要求>规定的安全计算环境中解读.摘要若干安全要求,结合Abp框架,对站点进行安全升级. [身份鉴别]应对登录的用户 ...

  8. jdk1.8 LocalTime、LocalDate、LocalDateTime 使用大全

    目录 LocalTime.LocalDate.LocalDateTime 区别 LocalTime.LocalDate.LocalDateTime 使用 now 获取当前 时刻.日期.时间 of 获取 ...

  9. R的基本用法

    R变量的命名格式 必须以字母开头 只能包含字母.数字.下划线和.. 对大小写敏感 不能是保留关键字 数据类型(mode) numeric - (10.5, 55, 787) integer - (1L ...

  10. Node.js躬行记(27)——接口管理

    在页面发生线上问题时,你要做的事情就是去查接口,响应数据是否正确,查接口的方法有两种: 第一种是在浏览器中打开地址,但是你必须得知道详细的 URL,并且有些页面还需要附带参数. 第二种是打开编辑器,启 ...