网络安全-openssl工具

OpenSSl是一个开源项目,包括密码库SSL/TLS工具集。它已是在安全领域的事实标准,并且拥有比较长的历史,现在几乎所有的服务器软件和很多客户端都在使用openssl,其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。功能主要包括:

创建RSA,DSA,DH密钥对
公共密钥的加密操作
创建X509证书,CSR和CRLs
生成消息摘要
使用加密算法加密解密
SSL/TLS服务器客户端测试
处理S/MIME签名或者加密邮件
时间戳记的请求,生成和验证


由于美国加密算法的限制,CENTOS的OpenSSL不支持IDEA,RC5和MDC2。以下为其配置文件openssl.cnf的位置以及默认的主要目录

基础


linux上基本已经安装了OpenSSL,无需再安装,而windows上OpenSSL则需要另外单独配置。本次是基于centos8的上的OpenSSL进行测试。

确定OpenSSL版本和配置

openssl version


不同的操作系统会经常修改OpenSSL的代码,主要是修复一些已知的漏洞,然而项目的名称和版本号经常保持原样。

可以使用-a参数获取完整的版本信息。

openssl version -a

输出如下:

OpenSSL 1.1.1k  FIPS 25 Mar 2021
built on: Wed Aug 31 14:57:14 2022 UTC
platform: linux-x86_64
options:  bn(64,64) md2(char) rc4(16x,int) des(int) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wa,--noexecstack -Wa,--generate-missing-build-notes=yes -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DZLIB -DNDEBUG -DPURIFY -DDEVRANDOM="\"/dev/urandom\"" -DSYSTEM_CIPHERS_FILE="/etc/crypto-policies/back-ends/openssl.config"
OPENSSLDIR: "/etc/pki/tls"
ENGINESDIR: "/usr/lib64/engines-1.1"
Seeding source: os-specific
engines:  rdrand dynamic


上面OPENSSLDIR:"/etc/pki/tls"是默认情况下查找配置和证书的目录。在centos8中,该位置是/etc/ssl的别名,系统会在其中保存TLS相关的文件。

misc目录包含一些补充脚本,其中最为有用的的脚本允许你实现一个私有证书的颁发机构。

查看可用命令


OpenSSL包含了很多密码相关的工具,通过以下命令显示可用命令。

openssl help


列出了所有可以使用的工具,如果对于某个命令,想获取更加详细的信息,可以使用man加上工具的名称。

Standard commands 标准命令
Message Digest commands 消息摘要命令
Cipher commands 加密命令

密钥和证书管理


OpenSSL能够运行并支持SSL的web服务器,整个过程包含以下三个步骤:

生成强加密的私钥
创建证书签名申请(certificate signing request,CSR),并且发送给CA
在web服务器上安装CA提供的证书

PKI,CA与证书管理


PKI (Public Key Infrastructure,公共密钥设施),是一个基于非对称加密技术实现并提供安全服务的具有通用行的安全设施,它通过一系列组件和规程,支持利用数字证书管理密钥并建立新人关系。PKI同时融合了Hash算法以及对称加密技术。

PKI由多个组件构成,其中最基本的组件是数字证书,它就是PKI管理的对象。证书是将所有者的身份信息和其所拥有的公钥进行绑定的文件。证书文件还包括颁发证书的权威机构(CA)对该证书的签名。通过签名保证了证书的合法性和有效性,当前,通常使用x.509 V3标准的证书,内容如下所示:

按照证书签名者的身份不同,证书可以分为3类

1:自签名证书,通常在实验环境使用
2:由本地CA签署的证书,
3:由可信的CA签署的证书


CA,证书权威机构,是PKI中受信任的第三方实体,它是信任起点,各个实体必须对CA高度信任,因为要通过CA的担保来认证其他实体。

CA是PKI的核心,主要任务包括:

证书的颁发,吊销,更新和续订等
CRL,证书吊销列表的管理和发布
OSCP,在线证书状态协议,的管理和发布
证书的存储以及事件日志记录等。


生成密钥


在使用公钥之前第一步是先生成一个私钥,在生成私钥的时候,必须有以下几项:

密钥算法
支持RSA,DSA和ECDSA密钥,但是在实际使用场景中不是所有的密钥类型都适用的。对于web服务器的密钥,一般都选RSA,因为DSA一般因为效率问题会限制在1024位,而且IE浏览器不支持更长的DSA密钥。ECDSA还没有被大部分的CA支持,对于SSH来说,一般都是使用DSA和RSA

密钥长度
默认的密钥长度一般都不够安全,所以需要手动指定要配置的密钥长度。例如RSA密钥的默认长度是512位,不够安全。一般认为2048位的RSA密钥是安全的,DSA密钥也应该不少于2048位,ECDSA密钥则应该在256位以上。

密码
应该使用密码去保存密钥,虽然这个只是一个可选项,受密码保护的密钥可以安全的存储传输以及备份,但是密钥的密码也经常带来不便。例如每次需要重启web服务器的时候就会要求输入密码,因此在现时中无法使用。

使用genrsa命令来生成RSA密钥

openssl genrsa -aes128 -out fd.key 2048


这里指定私钥使用AES-128算法来加密保存,也可以使用AES-192或者AES-256,建议不要使用其他算法,如DES,3DES,SEED。

这里会提示需要创建密钥的密码,并重复确认。

以上的输出结果e值代表公用指数,默认情况下会设为64537,它会显著的提供高RSA的验证功能。

私钥以所谓的PEM格式存储,该格式仅包含文本。

cat fd.key


初略看私钥是一堆随机数,其实并不是,可以使用rsa命令解析出私钥的结构

openssl rsa -text -in fd.key  #提示需要输入密钥密码

如果需要单独查看密钥的公开部分,可以使用如下命令

openssl rsa -in fd.key -pubout -out fd-public.key


 查看生成的文件,会发现有明显的标识,表示这部分确实是公开的信息。

DSA的密钥生成分成两个部分,先生成DSA的参数,然后再生成密钥,如下所示:

openssl dsaparam -genkey 2048 | openssl dsa -out dsa.key -aes128


这种方式可以生成一个受密码保护的密钥,而不会在磁盘上留下临时文件DSA参数,或者临时的密钥。

创建ECDSA密钥的过程是类似的,但是不能创建任意长度的密钥。对于每个密钥,需要选择一个命名曲线(named curve),它可以控制密钥的长度,同时也限定了椭圆曲线的参数。

openssl ecparam -genkey -name secp256r1 | openssl ec -out ec.key -ase128


OpenSSL支持非常多的命名曲线,但是对于WEB服务器使用的密钥来说,只能使用两种,secp256r1和secp384r1。

创建证书签名申请


一旦有了私钥,就可以创建证书签名CSR。这是要求CA给证书签名的一种正式申请,该申请包含证书的实体公钥以及该实体的某些信息。该数据将成为证书的一部分,CSR始终使用它携带的公钥所对应的的私钥进行签名。

CSR的创建过程一般都是交互式的,需要提供区分证书所需的不同元素。如果想让某一个字段为空,不要直接回车,必须输入一个点(.),如果直接回车,OpenSSL会直接使用这个字段的默认值。

CSR请求配置如下:

openssl req -new -key fd.key -out fd.csr


配置说明

Enter pass phrase for fd.key:                      #输入加密密码
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:              #必填,国家代码
State or Province Name (full name) []:HUBEI      #必填,省份
Locality Name (eg, city) [Default City]:WUHAN    #必填,城市
Organization Name (eg, company) [Default Company Ltd]:CCB  #必填 公司名
Organizational Unit Name (eg, section) []:DEVOPS   #必填,组织名
Common Name (eg, your name or your server's hostname) []:www.devops.com  #必填,域名
Email Address []:abc@qq.com      #必填,管理员邮箱Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:    #可选,用于确认身份
An optional company name []:  #可选


A challenge password ,质询密码是一个可选字段,用于在证书吊销过程中确认申请过该证书最初的实体的身份。如果输入这个字段,则会将密码包括CSR文件中并发送给CA,但是机会没有CA会依赖这个字段。一般建议将该字段留空,因为设置这个并没有增加CSR的任何安全性,另外它与密钥密码不一样。

CSR生成之后,可以使用它直接去进行证书的签名或者将它发送给公共CA让他们对证书进行签名。

可以用如下命令来检查CSR是否正确。

openssl req -text -in fd.csr -noout


使用当前证书生成CSR文件


如果需要更新一张证书,但是不想对里面的证书做任何更改,可以使用如下命令创建一个全新的CSR文件:

openssl x509 -x509toreq -in fd.crt -out fc.csr -singkey fd.key


非交互方式生成CSR


在使用自定义的OpenSSL配置文件,可以实现非交互的自动化生成CSR。例如想生成www.devops.com的csr文件,可以先创建一个fd.cnf文件,内容如下:

#cat fd.cnf
[req]
prompt=no
distinguished_name=dn
input_passwrd=******  #此处写入密码[dn]
CN=ww.devops.com
emailAddress=abc@qq.com
O=CCB
L=hubei
C=CN
ST=wuhan


然后使用下面的命令直接创建CSR文件

openssl req -new -config fd.cnf -key fd.key -out fd.csr


自签名证书


如果只是实验环境,那么不需要找CA上获取一个公共可信任的证书,则可以生成自签名的证书。使用之前创建的CSR文件,按照如下方法创建证书

openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd1.crt


也可以无需单独创建CSR ,直接使用私钥创建签名证书

#带有交互
openssl req -new -x509 -days 365 -key fd.key out -fd2.crt
#不带交互
openssl req -new -x509 -days 365 -key fd.key out -fd2.crt \
-subj "/C=CN/L=HUBEI/O=CCB/CN=www.devops.com"


创建多个主机名的有效证书


默认情况下,OpenSSL创建的证书只包含一个公用名而且只能设置一个主机名。这个限制下,即便由多个关联的站点,也不得不为每个站点生成一张单独的证书。此时需要使用多域名证书,即使维护一个站点,也得确保用户在访问站点的子域名的时候证书是有效的。在实际中使用至少两个名称,一个为www开头的,一个是没有任何前缀的。如www.devops.com​,和devops.com。

有两种方式在一张证书里里面支持多个主机名。

在x.509的使用者可选名称,SAN扩展字段里面列出所有需要使用的主机名
使用泛域名
在实际使用过程中,结合两种方法,可以设置定级域名和一个泛域名来涵括素有的二级域名,如www.devops.com  和 *.devops.com 

当证书包括可选名称的时候,所有的公用名就会被忽略CA所有新创建的证书甚至可能不再包括任何公用名。

首先将扩展信息放在一个单独文本文件中,名为fd.ext.文件中指定扩展的名称subjectAltName,列出所需的主机名

#vim fd.ext
subjectAltName = DNS:*.devops.com,DNS:devops.com



然后在使用x509命令签发证书的时候,使用-extfile参数引用该文件

openssl x509 -req -days 365 \
-in fd.csr -signkey fd.key -out fd3.crt -extfile fd.ext

检查证书


x509命令可以对刚生成的自签名的证书进行检查。

openssl x509 -text -in fd.crt -noout # -text打印证书内容,-noout则不打印编码后的证书内容,减少信息干扰


自签名证书一般只包括最基本的证书数据,而公共CA签发的证书则含有更多有意义的信息,包括

基本约束basic constraint
该扩展用于标记证书是否是一个CA,这样证书就可以给其他证书进行签名

密钥用法key usage,KU和 扩展密钥用法(extended key usage,EKU)
该扩展限制了证书的使用范围,如果这两个扩展同时存在,只有列表的方法可用。如果该扩展不存在,则没有任何限制。

CRL分发点 CRL distribution point
该扩展列出了CA证书吊销列表的地址,当证书需要被吊销的时候这个信息非常重要。CA会对CRL进行签名,并且每隔一段时间发布一次。

证书策略 certificate policy
该扩展用来指出证书使用那种策略签发,例如EV扩展验证。每个标识都拥有一个唯一的对象标识符号。另外这个扩展一般还包括了一个或者多个证书策略申明。

颁发机构信息访问 authority information access,AIA
该扩展包括了两个重要信息,首先它列出了CA的在线证书状态协议OCSP,响应程序的地址,可以用来实时检测证书的吊销情况。该扩展还带上了该证书颁发者的证书地址(也就是证书链的上一层证书)。现在的证书已经很少直接用根证书进行签名了,所以一般用户需要在配置中加上一个或者多个中间证书,这是就容易因为漏导致证书验证失败。有些客户端会使用这个信息来获取中间CA的证书。

使用者密钥标识符subject key identifier 和颁发机构密钥标识符authority key identifier
这两个扩展分别建立了唯一的使用者和颁发机构的标识符。证书的颁发机构密钥标识符的信息必须与颁发者的使用者密钥标识符扩展信息一致。

使用者可选名称 subject alternatice name
该扩展用来列出所有合法的主机名,这个扩展是可选的。如果不存在,客户端就会使用Subject 字段里面的公用名cn提供的信息,如果该扩展存在,那么在验证过程中CN字段的内容会被忽略。

密钥和证书格式转换


私钥和证书可以用各种格式进行存储,所以可能需要进行各种格式之间的转换。常见格式如下:

Binary (DER) certificate
原始格式的x.509证书,使用DER ASN.1编码

ASCII (PEM) certificate
包含base64编码的DER证书,以---BEGIN CERTIICATE---开头,以---END--CERTIFICATE---结尾,可以将多个证书链放在这同一个文件中。

Binary(DER) key
包含DER ANS.1编码后的私钥的原始格式

ACSII(PEM) key
包括base64编码后的der密钥和一些元数据信息

PCKS#7 certficate(s)
一种比较复杂的格式,设计的目的是用于签名和加密数据的传输,一般常见的是.p7b和.p7c扩展名的文件,并且文件里面可以包括所需的整个证书链。java的进程密钥管理工具支持这种格式

PCKS#12(PFX) key and certificate(s)
一种可以保存服务器私钥和整个证书链的复杂格式。一般以.p12 和.pfx扩展名结尾。该证书常见微软的产品,

PEM和 DER转换

#PEM转换到DER
openssl x509 -inform PEM -in fd.pem -outform DER -out fd.der
#DER转换到PEM
openssl x509 -inform DER -in fd.der -outform PEM -out fd.pem


PKCS#12(PFX)转换

openssl pkcs12 -export \
-name "My Certifcate" \
-out fd.p12 \
-inkey fd.key \
-in fd.crt \
-certfile fd-chain.crt


PKCS#7 转换

#PEM转换为PKCS#7
openssl crl2pkcs7 -nocrl -out fc.p7b -certfile fd.crt -certfile fd-chain.crt
#PKCS#7转换为PEM
openssl pkcs7 -in fd.p7b -print_certs -out fd.pem

最后我也整理了一些网络安全(黑客)方面的学习进阶资料

如果你想跟同道中人交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23198.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

el-dropdown选中效果

vue2版本 <template><el-dropdown size"mini" command"handleCommand"><span class"el-dropdown-link">{{ selectedOption }}<i class"el-icon-arrow-down el-icon--right"></i></span><el-d…

Deepseek首页实现 HTML

人工智能与未来&#xff1a;机遇与挑战 引言 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了突飞猛进的发展。从语音助手到自动驾驶汽车&#xff0c;AI 正在深刻地改变我们的生活方式、工作方式以及社会结构。然而&#xff0c;随着 AI 技术的普及…

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…

Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件&#xff0c;专注于处理高并发流量分发&#xff0c;广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么&#xff1f; 本质&#xff1a; 基于 C 语言开发 的轻量级工具&a…

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内&#xff0c;右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑&#xff0c;点击【属性】 5.下滑滚动条&…

Spring Boot 日志管理(官网文档解读)

摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容&#xff0c;文章主要参考官网文章的描述内容&#xff0c;并在其基础上进行一定的总结和拓展&#xff0c;以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…

【废物研究生零基础刷算法】DFS与递归(一)典型题型

文章目录 跳台阶递归实现指数级枚举递归实现排列型枚举上面两题总结 递归实现组合型枚举P1036选数 跳台阶 思路&#xff1a; 如果 n 1&#xff0c;只有一种走法&#xff08;走 1 级&#xff09;。如果 n 2&#xff0c;有两种走法&#xff08;11 或 2&#xff09;。对于 n &g…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

at32f103a+rtt+AT组件+esp01s 模块使用

AT组件使用 这里需要设置wifi名称和密码 配置使用的串口 配置上边的自动会配置,at_device 依赖了at_client 依赖sal也自动加入 依赖了串口2 uart2 连接WiFi AT+ CWJAP = TP-LINK_45A1

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类&#xff0c;只要是他的子类&#xff0c;或子类的子类&#xff0c;都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…

[漏洞篇]文件上传漏洞详解

[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的&#xff0c;“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xf…

Grok 3与GPT-4.5的“智能天花板”争夺战——谁才是大模型时代的算力之王?

2025年2月18日&#xff0c;马斯克旗下 xAI 高调发布新一代大模型Grok 3&#xff0c;号称“地球上最聪明AI”&#xff0c;在数学推理、代码生成等核心能力上碾压 GPT-4o、DeepSeek-V3 等对手。而就在同一天&#xff0c;OpenAI创始人 Sam Altman 暗示 GPT-4.5 即将登场&#xff0…

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…

3、Kubernetes 集群部署 Prometheus 和 Grafana

Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…

MySQL中Binlog Redolog Undolog区别?

MySQL中Binlog Redolog Undolog区别 在学习MySQL数据库管理和优化的过程中&#xff0c;理解和区分Binlog&#xff08;二进制日志&#xff09;、RedoLog&#xff08;重做日志&#xff09;和UndoLog&#xff08;撤销日志&#xff09;是至关重要的。这三种日志在MySQL中扮演着不同…

C++中结构体与结构体变量 和 类与对象的区别

具体区别如下&#xff1a; 结构体 -> 结构体变量 { 结构体&#xff1a;struct student{ 具体是多少&#xff0c;年龄&#xff0c;名字&#xff0c;性别&#xff0c;成绩 } 结构体变量&#xff1a; stu{ 名字&#xff1a;张三&#xff0c;年龄&#xff1a;18&#…