文档章节

创建自己的CA机构 - openssl cert 双向认证

Sub
 Sub
发布于 2015/12/03 17:59
字数 560
阅读 909
收藏 9

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1. 创建 openssl.cnf

[ ca ]
default_ca = subchen_ca

[ subchen_ca ]
certificate = ./ca-cert.pem
private_key = ./ca-key.pem
database = ./index.txt
serial = ./serial
new_certs_dir = ./certs

default_days = 3650
default_md = sha1

policy = subchen_ca_policy
x509_extensions = subchen_ca_extensions

[ subchen_ca_policy ]
commonName = supplied
stateOrProvinceName = optional
countryName = optional
emailAddress = optional
organizationName = optional
organizationalUnitName = optional

[ subchen_ca_extensions ]
basicConstraints = CA:false


[ req ]
default_bits = 2048
default_keyfile = ./ca-key.pem
default_md = sha1
prompt = yes
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions

[ root_ca_distinguished_name ]
countryName_default = CN

[ root_ca_extensions ]
basicConstraints = CA:true
keyUsage = cRLSign, keyCertSign

[ server_ca_extensions ]
basicConstraints = CA:false
keyUsage = keyEncipherment

[ client_ca_extensions ]
basicConstraints = CA:false
keyUsage = digitalSignature

2. 创建必要的文件和目录

mkdir certs
echo /dev/null > index.txt
echo 01 > serial

3. 创建自己的 CA 机构

openssl req -x509 -config openssl.cnf -newkey rsa:2048 -keyout ca-key.pem -days 3650 -out ca-cert.pem -nodes -subj /CN=SubchenCA/

// 如果需要,可以生成 cer 格式证书
openssl x509 -in ca-cert.pem -out ca-cert.cer -outform DER

4. 创建服务器端证书

openssl genrsa -out server-key.pem 2048
openssl req -new -key server-key.pem -out server-req.pem -nodes -subj /CN=subchen/O=server/
openssl ca -config openssl.cnf -in server-req.pem -out server-cert.pem -batch -extensions server_ca_extensions

// 将证书打包
openssl pkcs12 -export -out server-cert.p12 -in server-cert.pem -inkey server-key.pem -certfile ca-cert.pem -passout pass:secret

5. 创建客服端证书

openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client-req.pem -nodes -subj /CN=subchen/O=client/
openssl ca -config openssl.cnf -in client-req.pem -out client-cert.pem -batch -extensions client_ca_extensions

// 将证书打包
openssl pkcs12 -export -out client-cert.p12 -in client-cert.pem -inkey client-key.pem -certfile ca-cert.pem -passout pass:secret

6. Verify

Check certs info

openssl x509 -noout -text -in ca-cert.pem
openssl x509 -noout -text -in server-cert.pem
openssl x509 -noout -text -in client-cert.pem

Check keys and certificates with OpenSSL

// In one terminal window execute the following command:
openssl s_server -accept 8443 -cert server-cert.pem -key server-key.pem -CAfile ca-cert.pem

// In another terminal window execute
openssl s_client -connect localhost:8443 -cert client-cert.pem -key client-key.pem -CAfile ca-cert.pem

If the certificates and keys have been correctly created, an SSL connection establishment sequence will appear and the terminals will be linked. Input from either terminal will appear on the other. If the trust chain could be established, the second terminal will display this confirmation:

Verify return code: 0 (ok)

If you receive an error, confirm that the certificates and keys were generated correctly

7. Usage on NodeJS

Server

var https = require('https');  
var fs = require('fs');  
  
var options = {  
  ca: [fs.readFileSync('./ca-cert.pem')],  
  key: fs.readFileSync('./server-key.pem'),  
  cert: fs.readFileSync('./server-cert.pem')  
};  
  
// or using packaged cert file  
//var options = {  
//  pfx:fs.readFileSync('./server.p12'),  
//  passphrase:'your password'  
//};  
  
https.createServer(options, function(req, res){  
  res.writeHead(200);  
  res.end('hello world\n');  
}).listen(3000,'127.0.0.1');  

Client

var https = require('https');  
var fs = require('fs');  
  
var options = {  
  hostname:'127.0.0.1',  
  port:3000,  
  path:'/',  
  method:'GET',  
  ca: [fs.readFileSync('./ca-cert.pem')],  
  key:fs.readFileSync('./client-key.pem'),  
  cert:fs.readFileSync('./client-cert.pem'),  
  agent:false  
};  
  
// or using packaged cert file  
//var options = {  
//  pfx:fs.readFileSync('./client.p12'),  
//  passphrase:'your password'  
//};  
  
options.agent = new https.Agent(options);  
var req = https.request(options, function(res) {  
  console.log("statusCode: ", res.statusCode);  
});  
  
req.end();  

8. References

© 著作权归作者所有

Sub

Sub

粉丝 127
博文 94
码字总数 22632
作品 5
浦东
架构师
私信 提问
Linux openssh openssl

Linux openssh openssl 笔记日期20180524 目录 openssh 配置ssh基于密钥的方式认证 服务器端配置文件 ssh服务的最佳实践 OpenSSL 三个组件 PKI: Public Key Infrastructure 建立私有CA 证书申...

Winthcloud
2018/06/29
0
0
apache 搭建双向证书认证

一. CA自签 1.建立 CA 目录结构 mkdir -p ./demoCA/{private,newcerts} touch ./demoCA/index.txt echo 01 > ./demoCA/serial # 生成 CA 的 RSA 密钥对 openssl genrsa -des3 -out ./demoCA......

niceguy_php
2014/04/02
237
0
加密、解密及OpenSSL 详解

数据传输分类 在互联网上数据传输有两种:明文传输和加密传输。明文传输的协议有:ftp、http、smtp、telnet。但是为了数据的完整性和安全性,所以后来引用了加密等相关手段来保证数据的安全和...

五大三粗
2015/01/28
3.9K
1
公钥基础设施(PKI)/CFSSL证书生成工具的使用

公钥基础设施(PKI) 基础概念 CA(Certification Authority)证书,指的是权威机构给我们颁发的证书。 密钥就是用来加解密用的文件或者字符串。密钥在非对称加密的领域里,指的是私钥和公钥,他...

weilovepan520
2018/06/26
0
0
使用Openssl进行PKI实践(含多级证书详细步骤)

Openssl是Linux下的基础安全工具 先简要介绍一些基础知识: Openssl功能主要有:对称加密(DES、3DES、AES等),非对称加密(RSA),散列(MD5、SHA1等)以及证书的相关操作(创建、申请、颁...

niceguy_php
2014/04/02
410
0

没有更多内容

加载失败,请刷新页面

加载更多

在C语言中“静态”是什么意思?

我已经在C代码的不同地方看到了static一词。 这就像C#中的静态函数/类(实现在对象之间共享)吗? #1楼 多文件变量作用域示例 在这里,我说明了静态如何影响多个文件中函数定义的范围。 交流...

javail
6分钟前
3
0
利用 FC + OSS 快速搭建 Serverless 实时按需图像处理服务

作者:泽尘 简介 随着具有不同屏幕尺寸和分辨率设备的爆炸式增长,开发人员经常需要提供各种尺寸的图像,从而确保良好的用户体验。目前比较常见的做法是预先为一份图像存放多份具有不同尺寸的...

阿里巴巴云原生
8分钟前
2
0
前端架构最佳实践

Folders-by-Feature Structure 胜过 Folders-by-Type Structure

lilugirl
19分钟前
3
0
Seata AT 模式启动源码分析

从上一篇文章「分布式事务中间件Seata的设计原理」讲了下 Seata AT 模式的一些设计原理,从中也知道了 AT 模式的三个角色(RM、TM、TC),接下来我会更新 Seata 源码分析系列文章。今天就来分...

后端进阶
20分钟前
3
0
Python中“自我”一词的目的是什么?

Python中self词的目的是什么? 我知道它是指从该类创建的特定对象,但是我看不到为什么要将它显式地作为参数添加到每个函数中。 为了说明这一点,在Ruby中,我可以这样做: class myClass ...

技术盛宴
22分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部