OpenSSL 是什么?
OpenSSL 是什么?
libcrypto
:具有通用功能的加密库,里面包含众多加密算法libssl
:实现 SSL/TLS 功能openssl
:多功能的命令行工具,可以实现加密、解密、自建 CA、创建证书、吊销证书等功能
基础概念
- 非对称加密:
- Private Key:
- CSR(Certificate Signing Request,证书签名请求):
- CRT(数字证书):
- 保密性 - 只有收件人才能阅读信息
- 认证性 - 确认信息发送者的身份
- 完整性 - 信息在传递过程中不会被篡改
- 不可抵赖性 - 发送者不能否认已发送的信息
- 用户首先产生自己的密钥对
- 将公共密钥和部分个人身份信息传递给证书授权中心
- 证书授权中心在核实用户身份后,将给用户颁发数字证书,其中包含用户的身份信息和公共密钥,同时还附有证书授权中心的签名信息
- 使用接收双方约定的 HASH 算法对报文计算出固定位数的摘要。在数学上保证:只要改动报文中的任何一位,重新计算出的报文摘要值就与原先的值不相符。这样即可保证报文的不可更改性
- 使用发送者的私钥对报文摘要值进行加密,然后连同原报文一起发送给接收者,加密后的报文摘要即为数字签名
- 接收方收到数字签名后,用同样的 HASH 算法对原报文计算出报文摘要值,然后与使用发送者的公开密钥对数字签名进行解密得到的报文摘要值进行比较,如果相等,则说明报文确实来自所称的发送者
- 之所以对报文摘要进行加密,而不是对原报文进行加密,是因为 RSA 加解密非常耗时,被加密的报文越大,耗时越多
- CA(Certificate Authority,证书授权中心):
- 证书链(Certificate Chain)
- CRL(Certificate Revocation List,证书吊销列表):
- 泄漏密钥
- 泄漏 CA
- 从属关系改变
- 被取代
- 业务终止
- SNI(Server Name Indication):
使用 OpenSSL 自建 CA
- 初始化环境
$ mkdir /var/MyCA
$ cd /var/MyCA
$ mkdir certs private
$ chmod g-rwx,o-rwx private
$ echo "01" > serial
$ touch index.txt
$ tree .
.
├── cacert.pem # CA 证书
├── certs # 该目录下保存 CA 颁发的所有证书的副本
├── index.txt # 排序数据库,用来追踪已经颁发的证书
├── openssl.cnf # openssl 的配置文件
├── private # 保存 CA 私钥的目录
│ └── cakey.pem # CA 私钥
└── serial # 用来追踪最后一次颁发的证书的序列号
2 directories, 5 files
- 创建 openssl 的配置文件 openssl.cnf
[ ca ]
default_ca = myca
[ myca ]
dir = /var/MyCA
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial
default_crl_days = 7
default_days = 365
default_md = sha256
policy = myca_policy
x509_extensions = certificate_extensions
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName= supplied
organizationalUnitName = optional
[ certificate_extensions ]
basicConstraints = CA:false
- 生成根证书(Root Certificate)
[ req ]
default_bits = 2048
default_keyfile = /var/MyCA/private/cakey.pem
default_md = sha256
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = My Test CA # 名称
stateOrProvinceName = BJ # 州或省代码
countryName = CN # 国家代码
emailAddress = test@cert.com # 邮箱地址
organizationName = Root Certification Authority
[ root_ca_extensions ]
basicConstraints = CA:true
openssl
命令指定配置文件有两种方式:- 通过
OPENSSL_CONF
环境变量设置 - 通过
-config
命令行选项设置
$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 365 -config /var/MyCA/openssl.cnf
$ OPENSSL_CONF=/var/MyCA/openssl.cnf openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 365
-days 365
是证书的有效期)。$ openssl x509 -in cacert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 12778548659037981755 (0xb156864d3f00cc3b)
Signature Algorithm: md5WithRSAEncryption
Issuer: CN=Test 06 29 2016, ST=BJ, C=CN/emailAddress=jordan23nbastar@yeah.net, O=Root Certification Authority
Validity
Not Before: Jun 29 07:08:24 2016 GMT
Not After : Jun 29 07:08:24 2017 GMT
Subject: CN=Test 06 29 2016, ST=BJ, C=CN/emailAddress=jordan23nbastar@yeah.net, O=Root Certification Authority
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:2c:54:34:2b:a9:30:3e:51:20:c3:ad:21:b7:
21:9e:5c:f8:23:7a:4a:12:0f:9b:30:a8:1b:5f:10:
7e:51:01:ed:64:61:04:bb:28:82:16:05:5b:5a:e8:
5b:b6:21:73:68:eb:d7:89:db:a0:d7:ce:8a:92:f5:
8f:b3:92:ea:cd:d5:05:dd:49:a1:c4:7e:fd:1e:60:
8d:71:a4:e9:d5:35:ad:e8:c7:1a:e8:6d:52:6d:ff:
30:b1:ff:80:7d:59:4c:91:ca:67:c2:56:d6:ad:5b:
8c:58:ea:70:b3:60:97:0e:98:d5:35:46:f3:fb:ad:
57:ef:a6:55:b2:b5:13:f7:47:a8:c1:31:06:86:fc:
8a:ae:08:2e:fd:9e:ae:fe:f7:d5:35:c7:d4:45:de:
79:70:d8:c6:73:bd:47:75:90:24:d0:22:f4:f8:76:
f2:e8:2a:ef:3f:64:16:a7:8d:40:b0:94:76:f3:56:
7f:61:b4:54:c0:76:5f:33:a1:61:97:33:98:21:5c:
ec:88:95:3e:56:f1:2f:be:d9:68:cb:90:84:42:00:
24:49:c0:26:19:0f:f3:09:f7:06:1d:3b:b7:29:ac:
b3:31:ee:23:f5:58:c9:4e:de:5f:82:02:5a:50:87:
fe:72:5d:6c:4c:65:bb:59:1e:42:ab:20:42:c8:6b:
4f:f7
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: md5WithRSAEncryption
af:9a:28:1b:67:44:87:d1:cc:cb:1f:e7:88:e5:74:f3:cd:d5:
ca:cc:f6:51:f9:e6:31:c2:93:c4:37:18:0a:29:29:68:b2:41:
d7:37:be:40:5d:87:04:d8:b2:03:4a:8e:fc:5e:b0:9a:bc:4c:
2d:88:69:90:63:21:34:16:e2:30:7f:76:c0:b8:64:79:e3:0f:
2e:f6:91:af:a3:fd:c2:45:40:68:5f:19:a0:e3:6e:19:d1:2a:
21:32:76:32:15:03:79:c3:da:aa:1d:1e:97:c4:de:d8:40:4a:
df:75:4f:a6:61:ed:d5:54:40:be:30:f4:0d:ac:86:2a:30:7d:
c3:28:69:e9:7b:b3:c0:19:8e:86:e7:7d:f3:55:04:ee:b1:6f:
98:f8:33:0d:16:4b:bb:d5:3d:e1:0c:31:13:1d:a6:ee:40:1f:
5f:d8:fb:b9:bc:4c:8b:4b:b9:d9:5b:b2:0d:f9:3c:84:16:90:
eb:25:33:af:cf:e5:94:94:dc:a5:64:8b:22:d0:ad:55:a7:50:
fe:e6:91:9e:98:2e:3c:03:04:2d:5a:54:97:7a:a7:c6:9f:dc:
11:86:2d:43:1d:7c:b1:48:27:c9:77:a7:3f:93:d6:ee:96:f5:
ef:27:2c:88:fd:64:30:28:fb:72:4b:cc:be:99:d4:67:00:e4:
c7:21:b4:4b
使用 OpenSSL 生成证书
- Create key
$ openssl genrsa -out prvtkey.pem 2048 #(without password protected)
$ openssl genrsa -des3 -out prvtkey.pem 2048 #(password protected)
- Create certification signing request
$ openssl req -new -key prvtkey.pem -out cert.csr
- Send certificate request to Certification Authority
$ cd /var/MyCA/
$ openssl ca -in cert.csr -config /var/MyCA/openssl.cnf
验证证书
import socket
import ssl
def main():
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations(<CA 根证书>)
with socket.create_connection(("127.0.0.1", 9443)) as sock:
with context.wrap_socket(sock, server_hostname=<域名>) as ssock:
msg = "do I connect with server ?".encode("utf-8")
ssock.send(msg)
msg = ssock.recv(1024).decode("utf-8")
print(f"receive msg from server: {msg}")
ssock.close()
if __name__ == "__main__":
main()
import ssl
import socket
def main():
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(<证书>, <私钥>, <密码>)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
sock.bind(('127.0.0.1', 9443))
sock.listen(5)
with context.wrap_socket(sock, server_side=True) as ssock:
while True:
client_socket, addr = ssock.accept()
msg = client_socket.recv(1024).decode("utf-8")
print(f"receive msg from client {addr}:{msg}")
msg = f"yes, you have connected with server.\r\n".encode("utf-8")
client_socket.send(msg)
client_socket.close()
if __name__ == "__main__":
main()
使用 OpenSSL 吊销证书和生成 CRL
- 吊销证书:
$ openssl ca -revoke certs/01.pem -config /var/MyCA/openssl.cnf
Using configuration from /var/MyCA/openssl.cnf
Enter pass phrase for /var/MyCA/private/cakey.pem:
Revoking Certificate 01.
Data Base Updated
- 生成证书吊销列表(CRL):
# 还可以添加 -crldays 或 -crlhours 参数,以说明下一个吊销列表将在多少天(或多少小时)后发布
$ openssl ca -gencrl -out testca.crl -config /var/MyCA/openssl.cnf
- 用以下命令检查 testca.crl:
$ openssl crl -in testca.crl -text -noout
Certificate Revocation List (CRL):
Version 1 (0x0)
Signature Algorithm: md5WithRSAEncryption
Issuer: /CN=Test 06 29 2016/ST=BJ/C=CN/emailAddress=jordan23nbastar@yeah.net/O=Root Certification Authority
Last Update: Jun 29 07:45:30 2016 GMT
Next Update: Jul 6 07:45:30 2016 GMT
Revoked Certificates:
Serial Number: 01
Revocation Date: Jun 29 07:34:11 2016 GMT
Signature Algorithm: md5WithRSAEncryption
45:ac:4e:f5:be:e2:ee:87:5f:99:d7:20:a3:14:aa:3c:18:46:
e9:75:92:0b:86:f2:52:1a:cf:24:70:f5:da:ec:fc:77:6f:2d:
ee:be:4f:ab:39:89:89:ff:6c:b8:89:a9:10:4a:4a:45:3c:15:
cc:78:5b:de:b0:99:40:72:bd:5d:d2:a3:49:4a:90:94:74:4d:
80:4e:6f:21:29:81:f8:a7:25:c7:b9:6c:e5:68:76:a9:d3:89:
8d:a0:f3:ce:42:6e:f0:34:63:a0:47:37:2d:12:e6:16:8e:c6:
20:4c:e8:77:6b:8a:77:ff:95:83:02:b9:3f:d7:46:3d:64:62:
f5:a6:39:db:c8:26:e0:e0:a0:eb:97:6a:7e:2c:2c:6d:78:32:
2d:fc:09:f4:92:96:1d:22:7b:6c:37:71:53:51:26:bb:4d:b7:
cd:7b:51:ae:49:7e:54:06:55:c1:db:5d:e5:61:4a:c2:ac:93:
7b:c8:c6:fc:f0:ee:68:bd:67:33:78:1e:9c:a3:dd:1c:48:2d:
93:0c:e5:2b:ae:f1:55:07:ae:03:e3:17:f5:d5:b7:4d:b1:26:
ce:c7:6a:78:46:a4:cb:e1:35:07:8f:60:c1:98:44:4a:f4:3d:
1a:2f:9f:4a:2c:c8:a3:8a:2e:2a:5a:dd:d9:54:4e:54:73:c1:
75:b0:77:cd
OpenSSL 是什么?的更多相关文章
- RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密
最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...
- 显示本地openssl支持的加密算法
参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...
- 非阻塞/异步(epoll) openssl
前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定.因此把相关的资料整理一下,并给出简单的例子,让 ...
- PHPmailer关于Extension missing: openssl报错的解决
最近在写一个网页的时候,需要用到PHPmailer来发送邮件,按照官网上给出的demo写出一个例子,却报错Extension missing: openssl 最后发现需要修改php.ini中的配置: ...
- openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
今天尝试在mac机上搭建docker registry私有仓库时,杯具的发现最新的registry出于安全考虑,强制使用ssl认证,于是又详细了解linux/mac上openssl的使用方法,接触了一 ...
- Windows10下安装OpenSSL
Windows10下安装的方法 安装环境:Windows10专业版+VS2013 工具:ActivePerl-5.22.1.2201-MSWin32-x64-299574.msi,下载地址:http: ...
- CentOS升级openssl
才设置了http2,结果蓝狗说我网站不安全,检测一下发现openssl有漏洞,于是准备升级一下openssl 检测网站: www.ssllabs.com/ssltest/analyze.html # ...
- openssl+前端jsrsa签名+后端nodejs验签
内容如标题所示,总体分为三个部分: 一.win10下安装openssl,然后通过openssl工具生成RSA的公钥和私钥 (1)win10下安装openssl需要的工具有:VS2013,Perl,na ...
- openssl用法详解
OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls openssl可以 ...
- Nginx 1.10.1 编译、配置文档(支持http_v2,TLSv1.2,openssl v1.0.2)
1.安装常用工具及基础包: [root@localhost /]# yum -y install wget git vim make gcc gcc-c++ openssl-devel [root@l ...
随机推荐
- 机器学习基础09DAY
分类算法之逻辑回归 逻辑回归(Logistic Regression),简称LR.它的特点是能够是我们的特征输入集合转化为0和1这两类的概率.一般来说,回归不用在分类问题上,因为回归是连续型模型,而且 ...
- ACM-NEFUOJ-最小树-Prim算法
最小树1 Description 某省长调查交通情况,发现本省交通事故发生不断,于是决定在本省内全部修建地铁. 该省长得到的统计表中列出了任意两市之间的距离,为了确保任何两个市都可以直接 或者间接实现 ...
- 案例(一) Z-Indexing Geometry
使用官方github包,部分解释来源于Viewer - Cesium Documentation Cesium.Ion.defaultAccessToken = " ...
- Java -- 增强for循环(foreach)
增强for循环 相对于经典for循环, foreach可以减少代码量,但不是所有情况下foreach都可以代替for循环 当需要修改元素的值或和下标相关的操作需要使用标准for循环 foreach格式 ...
- 【Vue原理模拟】模拟Vue实现响应式数据
1. 预期效果 当数据变动时,触发自定义的回调函数. 2. 思路 对对象 object 的 setter 进行设置,使 setter 在赋值之后执行回调函数 callback(). 3.细节 3.1 ...
- pandas之时间操作
顾名思义,时间序列(time series),就是由时间构成的序列,它指的是在一定时间内按照时间顺序测量的某个变量的取值序列,比如一天内的温度会随时间而发生变化,或者股票的价格会随着时间不断的波动,这 ...
- [VMware]常见问题处理
参考文献 [1] VMware 无法打开虚拟机 该虚拟机似乎正在使用 - 百度经验 [2] 233 http://10.0.8.46:8080/cas/autologin?username=admin ...
- Vue2异步更新及nextTick原理
vue 官网中是这样描述 nextTick 的 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,可以获取更新后的 DOM. 在学习 nextTick 是如何实现之前,我们 ...
- python过滤列表元素
li = [1, 2, 3, 4, 5, 6] def fun(item, num): if item == num: return 1 else: return 0 def fun1(item, n ...
- 【python爬虫】爬取美女图片
一,导入包文件 os:用于文件操作.这里是为了创建保存图片的目录 re:正则表达式模块.代码中包含了数据处理,因此需要导入该模块 request:请求模块.通过该模块向对方服务器发送请求获取数据包 l ...