0.环境

本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo

必须安装nginx,必须安装openssl,(用apt-get update, apt-get install来安装比较简单)

1.配置和脚本

先创建一个demo目录(位置自己选择,我选择建在nginx的目录下):

mkdir /etc/nginx/ca-demo
cd /etc/nginx/ca-demo

修改SSL配置openssl.cnf(也可能是openssl.conf,不知道在哪可以用find -name / openssl.cnf查找)

将dir属性改成你上一步自建的目录,不要用相对路径,会踩坑,保存,如图:

我喜欢自动化,所以写了三个如下脚本,可以直接使用:

ca.sh:

#!/bin/bash

#Create directory hierarchy.创建目录结构
touch index.txt serial
chmod index.txt serial
echo > serial
mkdir -p newcerts private

#生成RSA密钥对
openssl genrsa -des3 -out ./private/cakey.pem
#openssl req -new -days -key ./private/cakey.pem -out ca.csr
#openssl ca -selfsign -in ca.csr -out ca.crt
# one step.一步生成csr,crt,直接10年使用期
openssl req -new -x509 -days -key ./private/cakey.pem -out ca.crt

server.sh:

#!/bin/bash
# 签发服务器证书
mkdir server
openssl genrsa -out ./server/server.key
openssl req -new -key ./server/server.key -out ./server/server.csr
openssl ca -in ./server/server.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./server/server.crt -days

client.sh:

#!/bin/bash
# 签发client证书
mkdir client
openssl genrsa -des3 -out ./client/client.key
openssl req -new -key ./client/client.key -out ./client/client.csr
openssl ca -in ./client/client.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./client/client.crt -config "/etc/ssl/openssl.cnf"
openssl pkcs12 -export -clcerts -in ./client/client.crt -inkey ./client/client.key -out ./client/client.p12

以上三个脚本都可以在 https://github.com/dreamingodd/CA-generation-demo  找到

将以上三个脚本复制到自建demo目录中,如下所示:

加入运行权限:

chmod +x *.sh

结果如下:

2.自建CA证书

运行脚本ca.sh,效果如下:

a.输入密码短语:(随便,记住就行,我填的是"demo",需要填3次)

b.生成证书需要填入一些信息:Country Name(国家),State or Province Name(省),Locality Name(市),Organizational Name(组织名,随便填,我填的是Choosefine Ltd),Common Name(一般填域名),其他可以不填。

这样证书就生成并自签名了:

其中,newcerts目录用于存放CA签署(颁发)过的数字证书(证书备份目录)。private目录用于存放CA的私钥。 文件serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库。 文件serial填写第一个证书序列号(如10000001),之后每前一张证书,序列号自动加1。

可以把ca.crt下载到你的windows系统的PC机上,后面会用到。

3.签发服务端证书

运行脚本server.sh,效果如下:

最后一句是Data Base Updated,就表示成功了,要填的东西跟上一步非常相似,需要注意的是:

a.国家和省份必须和上一步一样。

b.Organizational Name必须和上一步一样。

c.Common Name,如果你的测试服务器有域名的话,填入域名,没有的话随便填一个网址,windows访问测试时配置一下hosts就好,我这里填的是ssl.demo.com。

d.challenge password随便填,记住就行,我填的demo。

e.pass phrase密码短语是CA证书的的,我生成的时候用的也是demo。

生成结果:

4.Nginx配置Https单向认证

这一步我要使用上面我们生成的证书s来配置一个安全的Https单向访问资源链接。

首先修改nginx配置文件,

vi /etc/nginx/nginx.conf

在http中加入以下内容:

        server {
server_name ssl.demo.com;
listen ;
ssl on;
ssl_certificate ca-demo/server/server.crt;
ssl_certificate_key ca-demo/server/server.key;
location / {
root html;
index index.html index.htm;
}
}

运行以下命令检查和重启nginx:

/usr/sbin/nginx -t
service nginx restart

使用IP访问一下:

成功了,会显示证书不安全。一般来说,如果花钱使用证书公司签发的server.crt和server.key不会有这个问题。

这里想解决这个问题的话需要windows本地信任我们自己的CA证书。如果对这个问题不感兴趣可以直接跳过。

首先,将我们第二步生成的CA证书下载到windows系统本地,双击打开

点击安装:

点击下一步:

选择自定义证书集合,点击浏览:

选择第二个,受信任的证书列表,一直下一步/完成/是的等,就可以了。

成功后效果如图:

一开始那个X已经没有了。

Status显示OK。

如果你想看到证书集合的情况,可以WIN+R -> certmgr.msc查看

名字是CA证书的Common Name。

最后(如果没有域名),修改以下hosts文件模拟一下域名:

使用域名访问,风险提示就消失了:

5.签发客户端证书

签发客户端证书,用于服务端开启了ssl的客户端验证时,要求客户端对请求做加密。

运行脚本client.sh

所有密码处我填的全是demo。

结果如下:

到此为止,证书的生成已经全部讲完了。

6.Nginx配置Https双向认证

Https双向认证不仅验证服务端的证书,服务端也要验证客户端的证书;不仅对客户端的请求进行了加密,并且服务端使用的加密方案也是使用客户端公钥加密后发送给客户端的。比单项认证更加安全。

我个人的理解是,单项认证防止请求被篡改,双向认证防止请求被模拟。

题外话,Https使用了对称加密+非对称加密,由于非对称加密的效率低,不适合传输的数据量大的时候。所以Https的客户端将对称加密的密钥用服务端的公钥进行加密再发送给服务端,服务端用私钥进行解密(非对称加密),对传输数据本身的加密使用的密钥是一样的(对称加密)。

进入正题,首先开启服务端nginx的客户端ssl认证,将之前加入的配置删除,贴入新的一份:

        server {
server_name ssl.demo.com;
listen ;
ssl on;
ssl_certificate ca-demo/server/server.crt;
ssl_certificate_key ca-demo/server/server.key; ssl_client_certificate ca-demo/ca.crt;
ssl_verify_client on; ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on; location / {
root html;
index index.html index.htm;
}
}

检查并重启,再次访问:

显示未发送客户端证书。

下载client.p12文件到本地,双击安装,这次安装到个人:

关闭浏览器再次访问,就有了证书选择的界面,选择后正常访问。

之前有不少网银都是使用这种方式进行交易的。

7.使用Java访问双向认证的Https资源

下一篇再讲...

未完待续...

To be Continued...

下一篇在这儿:http://www.cnblogs.com/dreamingodd/p/7491098.html

本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo

dreamingodd原创文章,如转载请注明出处。

Https、OpenSSL自建CA证书及签发证书、nginx单向认证、双向认证及使用Java访问的更多相关文章

  1. 基于OpenSSL自建CA和颁发SSL证书

    关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...

  2. 自建 CA 中心并签发 CA 证书

    目录 文章目录 目录 CA 认证原理浅析 基本概念 PKI CA 认证中心(证书签发) X.509 标准 证书 证书的签发过程 自建 CA 签发证书并认证 HTTPS 网站的过程 使用 OpenSSL ...

  3. 使用OpenSSL自建CA + Nginx配置HTTPS

    Ubuntu 16.04(ECS),OpenSSL 1.0.2g  1 Mar 2016,Nginx 1.10.3 (Ubuntu), 浏览器:Chrome 67,Firefox 61,Edge 40 ...

  4. 使用 OpenSSL 创建私有 CA:2 中间证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 本文将在前 ...

  5. 使用 OpenSSL 创建私有 CA:1 根证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 OpenS ...

  6. 使用 OpenSSL 创建私有 CA:3 用户证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...

  7. 利用openssl自建CA体系

    使用 OpenSSL 创建私有 CA:1 根证书 使用 OpenSSL 创建私有 CA:2 中间证书 使用 OpenSSL 创建私有 CA:3 用户证书 今天跟着上面的三部曲,做了一下openssl的 ...

  8. 基于openssl的单向和双向认证

    1.前言 最近工作涉及到https,需要修改nginx的openssl模块,引入keyless方案.关于keyless可以参考CloudFlare的官方博客: https://blog.cloudfl ...

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

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

随机推荐

  1. Install eclipse ns3 in ubuntu 14.04

    1. NS3 install 参考NS3 tutorial即可. 2.eclipse 2.1下载 下载地址:http://www.eclipse.org/downloads/              ...

  2. ASP.NET Core 框架本质学习

    本文作为学习过程中的一个记录. 学习文章地址: https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 一. ASP.N ...

  3. 常用maven 命令

    重新依赖:mvn package -U -DskipTest=true; 在本地安装jar包:mvn install 清除产生的项目:mvn clean 运行测试:mvn test 上传到私服:mvn ...

  4. 【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)

    题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作spl ...

  5. APP手机商城系统选择,混合开发与原生开发哪个好?

    关于手机APP开发用混合还是原生现在说法不一,有说混合开发好:时间短.费用低.效果也不错,有说原生开发好,原生APP在性能方面比较好.而商城系统中的手机APP用混合开发还是原生开发比较好呢? 最近我参 ...

  6. Java并发之内存模型(JMM)浅析

    背景 学习Java并发编程,JMM是绕不过的槛.在Java规范里面指出了JMM是一个比较开拓性的尝试,是一种试图定义一个一致的.跨平台的内存模型.JMM的最初目的,就是为了能够支多线程程序设计的,每个 ...

  7. Go_笔试题记录-不熟悉的

    1.golang中没有隐藏的this指针,这句话的含义是() A. 方法施加的对象显式传递,没有被隐藏起来 B. golang沿袭了传统面向对象编程中的诸多概念,比如继承.虚函数和构造函数 C. go ...

  8. 给定n个十六进制正整数,输出它们对应的八进制数。

    问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转 ...

  9. Python学习 之 Python入门

    第二章 Python入门 2.1 环境安装 2.1.1 下载解释器: py2.7.16 (2020年官方不再维护) py3.6.8 (推荐安装) 1.下载解释器一定去官网下载,https://www. ...

  10. The used SELECT statements have a different number of columns???

    今天我们组就我一个人留守在这里修复bug了,有点小悲伤啊,他们都问我能不能hold得住啊,我当然能hold得住啊: 在看一个入库的存储过程中,在数据库运行的时候是没问题的,项目已启动,进行入库操作就是 ...