创建私有CA,我就用openSSL
简介
一般情况下我们使用的证书都是由第三方权威机构来颁发的,如果我们有一个新的https网站,我们需要申请一个世界范围内都获得认可的证书,这样我们的网站才能被无障碍的访问。
如果在某些情况下,我们的网站或者系统并不是公开的,但是也需要使用tls协议的话,那么就需要自己搭建一个CA服务器。这样的CA服务器就叫做private CA。
熟悉证书的朋友可能会说了,为什么不使用自签名证书呢?也可以达到安全通信的目的。
这是因为自签名证书的作用比较有限,它没有CRL和OCSP的能力,并且使用起来也不是很方便。所以我们需要一整套有效的CA签发体系,这也是我们需要搭建private CA的目的。
搭建root CA
在搭建root CA之前我们需要创建几个合适的目录来保存CA的相关信息,比如我们需要一个保存证书的目录certs,一个保存密钥的地方keys,一个CA数据库db。
其中db需要一个index文件,serial文件和crlnumber文件。
我们用下面的命令创建对应的文件和目录:
mkdir certs db keys
touch db/index
openssl rand -hex 16 > db/serial
echo 1001 > db/crlnumber
目录建好之后,我们还需要一个非常重要的root ca配置文件。后续可以根据这个配置文件来创建CA相关的信息。
一般情况下CA配置文件是不需要的,只有我们需要创建比较复杂CA的情况下才需要使用ca配置文件。
下面是一个CA配置文件的例子:
[default]
name = root-ca
domain_suffix = flydean.com
default_ca = ca_config
name_opt = utf8,esc_ctrl,multiline,lname,align
[ca_config]
database = db/index
serial = db/serial
crlnumber = db/crlnumber
certificate = root-ca.crt
private_key = keys/root-ca.key
RANDFILE = keys/random
new_certs_dir = certs
unique_subject = no
copy_extensions = none
default_days = 365
default_crl_days = 100
default_md = sha256
policy = ca_policy
[ca_policy]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 4096
encrypt_key = yes
default_md = sha256
utf8 = yes
string_mask = utf8only
prompt = no
distinguished_name = ca_dist
req_extensions = ca_req_ext
[ca_dist]
countryName = "CN"
organizationName = "flydean"
commonName = "Root CA"
[ca_req_ext]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[sub_ca_ext]
authorityInfoAccess = @issuer_info
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:true,pathlen:0
crlDistributionPoints = @crl_info
extendedKeyUsage = clientAuth,serverAuth
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[crl_info]
URI.0 = http://crl3.digicert.com/DigiCertTLSRSASHA2562020CA1-4.crl
[issuer_info]
caIssuers;URI.0 = http://cacerts.digicert.com/DigiCertTLSRSASHA2562020CA1-1.crt
OCSP;URI.0 = http://ocsp.digicert.com
[ocsp_ext]
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:false
extendedKeyUsage = OCSPSigning
noCheck = yes
keyUsage = critical,digitalSignature
subjectKeyIdentifier = hash
生成root CA
有了上面的配置文件和目录信息,就可以生成root CA了。
首先我们需要创建私钥和root ca的csr文件如下:
openssl req -new -config root-ca.conf -out root-ca.csr -keyout keys/root-ca.key
接下来我们创建一个自签名的证书,这里我们需要用到配置文件中的ca_req_ext部分:
openssl ca -selfsign -config root-ca.conf -in root-ca.csr -out root-ca.crt -extensions ca_req_ext
运行该命令之后,我们会在certs文件夹中创建一个自签名证书文件。
除此之外,还向db中的index文件中写入了下面的内容:
V 230501041451Z 4445DE5C0285EAEF2E58757D5CB1E949 unknown /C=CN/O=flydean/CN=Root CA
这是一个文本文件,里面保存的是生成的证书索引,证书中的字段是通过tab来进行分割的。
第一个字段V表示valid也就是有效的意思,这个字段还可以有其他几个值,比如R表示revoked,E表示expired。
第二个字段是过期时间,格式是YYMMDDHHMMSSZ。
第三个字段是Revocation日期,如果空表示没有revoked。
第四个字段是序列号,也就是生成的CA名字。
第五个字段是文件的位置,unknown表示未知。
最后一个字段是这个证书的名字,用于和其他的证书做区分。
使用CRL
有了root-ca.conf之后,我们可以使用它来创建CRL:
openssl ca -gencrl -config root-ca.conf -out root-ca.crl
现在生成的root-ca.crl文件还没有任何证书信息。
如果我们想要撤销某个颁发的CA,可以使用下面的命令:
openssl ca -config root-ca.conf -revoke certs/torevoke.pem -crl_reason unspecified
在revoke中指定要revoke的证书即可。
这里要注意的是我们需要指定crl_reason,crl_reason可以是下面几个值:
unspecified
keyCompromise
CACompromise
affiliationChanged
superseded
cessationOfOperation
certificateHold
removeFromCRL
使用OSCP
对于OSCP来说,需要一个OCSP responder来响应OCSP的请求。这个OCSP responder和CA本身并不是同一个,需要单独创建。
首先,我们创建OCSP responder的key和证书请求CSR:
openssl req -new -newkey rsa:2048 -keyout keys/root-ocsp.key -out root-ocsp.csr
当然输入必须的参数之后,key和CSR就可以生成了。
接下来我可以使用root CA和root-ocsp.csr颁发OCSP证书,这里我们需要用到配置文件中的ocsp_ext部分。
openssl ca -config root-ca.conf -in root-ocsp.csr -out root-ocsp.crt -extensions ocsp_ext -days 10
上面的命令为OCSP responder生成了一个有效期为10天的证书。
有了证书,我们可以方便的搭建一个本地的OCSP responder如下所示:
openssl ocsp -port 9000 -index db/index -rsigner root-ocsp.crt -rkey keys/root-ocsp.key -CA root-ca.crt -text
Enter pass phrase for keys/root-ocsp.key:
Waiting for OCSP client connections...
这样我们就启动了一个OCSP服务器端。
另开一个窗口,执行下面的命令来请求OCSP:
openssl ocsp -issuer root-ca.crt -CAfile root-ca.crt -cert root-ocsp.crt -url http://127.0.0.1:9000
可以得到下面的结果:
Response verify OK
root-ocsp.crt: good
This Update: May 1 08:09:31 2022 GMT
这就说明OCSP responder搭建成功了。
这里启动的是一个本地服务,在正式环境中可以考虑将其迁移到单独的服务器中。
总结
使用上面的命令,我们搭建了一个私有的CA服务,和对应的OCSP,openssl非常强大,基本上你可以用他来做任何事情。
更多内容请参考 http://www.flydean.com/45-openssl-private-ca/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
创建私有CA,我就用openSSL的更多相关文章
- 使用 OpenSSL 创建私有 CA:3 用户证书
OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...
- 使用 OpenSSL 创建私有 CA:2 中间证书
OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 本文将在前 ...
- 使用 OpenSSL 创建私有 CA:1 根证书
OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 OpenS ...
- 自签名证书和私有CA签名的证书的区别 创建自签名证书 创建私有CA 证书类型 证书扩展名【转】
自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信 如果你的规划需要创建多个证书,那么使用私有 ...
- linux基础之加密解密、PKI及SSL、创建私有CA
加密解密基础 1. 对称加密: 加密和解密使用同一个密钥 常见的加密算法有:DES.3DES.AES.Blowfish.Twofish.IDEA.RC6.CAST5 特性: 1. 加密.解密使用同一个 ...
- 创建私有CA并签发证书
一.创建私有CA 1.创建所需要的文件 2.创建私有密钥 3.CA自签证书 -new: 生成新证书签署请求: -x509: 专用于CA生成自签证书:不自签的时候不要加该选项 ...
- 创建私有CA, 加密解密基础, PKI, SSL
发现了一篇图文并茂的超棒的 加密解密, CA, PKI, SSL 的基础文章, 链接如下:https://blog.csdn.net/lifetragedy/article/details/5223 ...
- OpenSSL创建私有CA
1.编辑/etc/pki/tls/openssl.cnf [ CA_default ] dir = /etc/pki/CA # 工作目录certs ...
- ssl协议,openssl,创建私有CA
SSL是Security Socket Layer:安全的套接字层 他介于HTTP和TCP协议层之间 SSL是Netscape公司开发的,属于个人 TLS是标准委员会制定的 OpenSSL是SSL的开 ...
随机推荐
- CentOS7安装部署Mongodb
1.下载安装包 打开官网,跳转至下载界面,选择对应版本的安装包,拷贝其链接,这里是手动安装,所以下载tgz安装包,如果要自动化安装,选择server的rpm自动安装包 https://www.mong ...
- 请求扩展、蓝图、g对象
今日内容概要 请求扩展 蓝图 g对象 内容详细 1.请求扩展 # 在请求来了,请求走了,可以做一些校验和拦截,通过装饰器来实现 7 个 # 1 before_request 类比django中间件中的 ...
- 详细剖析pyecharts大屏的Page函数配置文件:chart_config.json
目录 一.问题背景 二.揭开json文件神秘面纱 三.巧用json文件 四.关于Table图表 五.同步讲解视频 5.1 讲解json的视频 5.2 讲解全流程大屏的视频 5.3 讲解全流程大屏的文章 ...
- unity---世界坐标和本地坐标的转换
会受到缩放的影响 用的比较多的是 本地坐标转换为世界坐标,比如在自己周围释放物体 当物体发生旋转,方向会发生变化
- 从标准输入流中读取并执行shell指定函数
巧妙的ohmytmux配置 看oh my tmux的配置,发现他们很巧妙的将配置和shell函数放到一个文件里 比如切换鼠标模式的相关配置和shell函数, # : << EOF # .. ...
- MongoDB 设置用户和密码
每日一句 Zeal without knowledge is fire without light. 没有知识的热忱犹如火之无光. 给每个数据库设置单独的管理员 我们除了可以设置数据库的超级管理员以外 ...
- 微信小程序避坑指南——input框里的图标在部分安卓机里无法点击的问题
问题场景: 下图中的显隐密码和验证码均为包裹在 input标签 中的 image标签, 但在开发测试中发现点击不了这俩个image标签,因为是被input标签的padding挡住了. 解决方法:将im ...
- Kubernetes client-go DeltaFIFO 源码分析
概述Queue 接口DeltaFIFO元素增删改 - queueActionLocked()Pop()Replace() 概述 源码版本信息 Project: kubernetes Branch: m ...
- Code Forces 1367A Sorting Parts 题解
(原题链接:CF传送门) 题目背景(我看不懂英文嘤嘤嘤) Sorting Parts You have an array a of length n. You can exactly once sel ...
- stm32f103ve+BH1750使用教程+oled(HAL库)
1.硬件:BH1750模块+oled 2.代码:BH1750是标准的iic协议的外设,我这里单独有iic的文件,之后想要实现多个设备共用一个iic. BH1750.c 1 #include " ...