1 OpenSSL介绍
- OpenSSL 是一个开源且功能强大的包含丰富的密码算法和 SSL/TLS 协议的库,主要包括的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供了多用途的命令行工具。使用 c 语言编写,跨平台性能好,支持 Linux、Windows、BDS、Mac、VMS 等平台。
- Openssl由3部分组成
- The Crypto library(密码学算法库) : 主要提供对称加解密、非对称加解密、证书管理、数据签名、数据摘要等接口供用户调用。
- The SSL library(SSL/TLS协议库) : 主要提供SSL/TLS接口、用于HTTPS通信。
- Command line tool(命令行工具) : 可以在终端使用命令行实现加解密等一些列操作。
- OpenSSL被广泛应用在密码学以及网络安全相关领域
- 本文章主要介绍下OpenSSL各个版本的安装步骤以及使用命令行工具进行加解密和证书生成的一些功能。
2 资源
3 版本介绍
- openssl主要有三个大版本,分别为1.0.x,1.1.x,3.x
- 1.0.x
- 1.0.x 系列最新版本为1.0.2,已于2019年12月停止更新。
- 1.0.x 系列不支持TLS 1.3协议。
- 1.1.x
- 1.1.x 系列最新版本为1.1.1,支持到2023年9月,后续不再更新。
- 1.1.x 相较1.0.x系列有了很大改动,首先是支持了TLS 1.3协议,其次在1.0.x中,很多结构是可以直接访问到内部成员的,比如X509结构,可以直接对其内部成员赋值和修改,而1.1.x版本引入了模块化的设计理念,不允许再访问这些结构的内部成员。因此,1.0.x如果和1.1.x版本混用,可能存在结构不兼容的问题。
- 目前1.1.x系列版本是使用最为广泛的版本。
- 3.x
- 3.x系列版本为最新版本,长期进行维护。目前最新版本为3.3.0。
- 3.x系列版本使用没有1.1.x版本广泛,但1.1.x版本已停止更新,切换到3.x版本也是大趋势。
- 3.x在国密算法方面有了更为全面的支持,比如在签发证书时,1.1.x系列版本不支持证书签名摘要算法为SM3,但3.x对此已经支持,
- 废弃了1.1.x版本中一些接口(SM2加解密算法相关函数EVP_PKEY_set_alias_type已废弃)。对一些弱加密算法也不再支持(如DES加密算法)。更多的特性读者可自行去探索。
4 安装
4.1 linux平台安装
- 命令行安装
-
# 安装 sudo apt-get install openssl sudo apt-get install libssl-dev # 卸载 sudo apt-get remove openssl
-
- 源码编译安装
- 下载安装包解压后执行以下命令
-
# --prefix指定安装目录,不指定的话安装到系统默认目录下 ./config --prefix=${PWD}/_install sudo make sudo make install
4.2 windows平台安装
- Windows平台编译OpenSSL源码必须先安装Visual Studio
- 安装包安装
- 安装包: 可以下载安装包直接双击安装。
- 源码编译安装
-
Perl: 下载一个msi后缀的Perl安装包双击安装。
-
Perl安装后设置下环境变量
-
-
NASM: 选择一个版本,选择windows平台的exe安装包安装。
-
同样的也设置下NASM的环境变量
-
-
如果设置环境变量后未生效,需要重启下电脑。
-
在菜单栏找到Visual Studio,我使用的是Visual Studio 2015。选择一个命令行工具,这里就选择VS2015 x86工具编译32位的程序。
-
-
打开命令行工具后进入到OpenSSL源码路径
-
-
执行以下命令安装
-
perl Configure VC-WIN32 --prefix=F:\openssl-1.1.1u\openssl-1.1.1u\build
-
nasm主要是优化一些编译步骤,可以使用 no-asm 参数指定不使用nasm,也就不用安装nasm了。–prefix 指定的时编译文件的安装目录,如果不指定,则安装到系统默认目录下。
-
执行成功后,会有以下打印
-
-
再执行 nmake 进行编译,编译过程可能较长。
-
编译完成后,执行nmake install 进行安装,对应的库文件和头文件就会被拷贝对指定的安装目录下。
-
- 借助libcurl工程编译源码
- 还可以借助libcurl工程编译OpenSSL代码
- libcurl发行版: 下载一个libcurl源码包,在libcurl源码根目录的projects目录下有一个build-openssl.bat文件,拷贝到我们下载的OpenSSL源码根目录下
- Perl: 下载一个msi后缀的Perl安装包双击安装。
- 然后直接在OpenSSL源码根目录下执行以下命令,必须要有Visual Studio工具,我使用的是Visual Studio 2015。-VSpath指定的是Visual Studio安装的根目录。最后面跟编译文件的释放目录,指定./编译文件会释放的当前目录的build目录下。
-
build-openssl.bat vc14 -VSpath "D:\Microsoft Visual Studio 14.0" x86 release ./
- build-openssl.bat脚本参数介绍
-
Usage: build-openssl <compiler> [platform] [configuration] [directory] [-VSpath] ["VSpath"] [-perlpath] ["perlpath"] Compiler: vc10 - Use Visual Studio 2010 vc11 - Use Visual Studio 2012 vc12 - Use Visual Studio 2013 vc14 - Use Visual Studio 2015 vc14.1 - Use Visual Studio 2017 vc14.2 - Use Visual Studio 2019 vc14.3 - Use Visual Studio 2022 Platform: x86 - Perform a 32-bit build x64 - Perform a 64-bit build Configuration: debug - Perform a debug build release - Perform a release build Other: directory - Specifies the OpenSSL source directory -VSpath - Specify the custom VS path if Visual Studio is not located at "C:\<ProgramFiles>\Microsoft Visual Studio <version>" For e.g. -VSpath "C:\apps\MVS14" -perlpath - Specify the custom perl root path if perl is not located at "C:\Perl" and it is a portable copy of perl and not installed on the win system. For e.g. -perlpath "D:\strawberry-perl-5.24.3.1-64bit-portable"
- 编译成功后,就会在build目录下生成对应的头文件和库文件。
5 对称加解密
-
enc是openssl提供的一个对称加解密命令行工具。安装openssl后,执行命令openssl enc -list,可以看到enc支持的所有对称加密算法
-
Supported ciphers: -aes-128-cbc -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr -aes-128-ecb -aes-128-ofb -aes-192-cbc -aes-192-cfb -aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr -aes-192-ecb -aes-192-ofb -aes-256-cbc -aes-256-cfb -aes-256-cfb1 -aes-256-cfb8 -aes-256-ctr -aes-256-ecb -aes-256-ofb -aes128 -aes128-wrap -aes192 -aes192-wrap -aes256 -aes256-wrap -aria-128-cbc -aria-128-cfb -aria-128-cfb1 -aria-128-cfb8 -aria-128-ctr -aria-128-ecb -aria-128-ofb -aria-192-cbc -aria-192-cfb -aria-192-cfb1 -aria-192-cfb8 -aria-192-ctr -aria-192-ecb -aria-192-ofb -aria-256-cbc -aria-256-cfb -aria-256-cfb1 -aria-256-cfb8 -aria-256-ctr -aria-256-ecb -aria-256-ofb -aria128 -aria192 -aria256 -bf -bf-cbc -bf-cfb -bf-ecb -bf-ofb -blowfish -camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1 -camellia-128-cfb8 -camellia-128-ctr -camellia-128-ecb -camellia-128-ofb -camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1 -camellia-192-cfb8 -camellia-192-ctr -camellia-192-ecb -camellia-192-ofb -camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1 -camellia-256-cfb8 -camellia-256-ctr -camellia-256-ecb -camellia-256-ofb -camellia128 -camellia192 -camellia256 -cast -cast-cbc -cast5-cbc -cast5-cfb -cast5-ecb -cast5-ofb -chacha20 -des -des-cbc -des-cfb -des-cfb1 -des-cfb8 -des-ecb -des-ede -des-ede-cbc -des-ede-cfb -des-ede-ecb -des-ede-ofb -des-ede3 -des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8 -des-ede3-ecb -des-ede3-ofb -des-ofb -des3 -des3-wrap -desx -desx-cbc -id-aes128-wrap -id-aes128-wrap-pad -id-aes192-wrap -id-aes192-wrap-pad -id-aes256-wrap -id-aes256-wrap-pad -id-smime-alg-CMS3DESwrap -rc2 -rc2-128 -rc2-40 -rc2-40-cbc -rc2-64 -rc2-64-cbc -rc2-cbc -rc2-cfb -rc2-ecb -rc2-ofb -rc4 -rc4-40 -seed -seed-cbc -seed-cfb -seed-ecb -seed-ofb -sm4 -sm4-cbc -sm4-cfb -sm4-ctr -sm4-ecb -sm4-ofb
-
enc完整命令
- openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e ] [-d ] [-a ] [-A] [-k password ] [-kfile filename] [-K key] [-iv IV] [-p] [-P] [-bufsize number] [-nopad] [-debug]
- -ciphername:对称算法名称(就是上面执行openssl enc -list命令后展示的那些)
- -in filename:输入文件,默认为标准输入。
- -out filename:输出文件,默认为标准输出。
- -pass arg:输入文件如果有密码保护,指定密码来源。
- -e:进行加密操作,默认操作。
- -d:进行解密操作。
- -a:当进行加解密时,它只对数据进行运算,有时需要进行base64转换。设置此选项后,加密结果进行base64编码;解密前先进行base64解码。
- -A:默认情况下,base64编码结果在文件中是多行的。如果要将生成的结果在文件中只有一行,需设置此选项;解密时,必须采用同样的设置,否则读取数据时会出错。
- -k password:指定加密口令,不设置此项时,程序会提示用户输入口令。
- -kfile filename:指定口令存放的文件。
- -K key:密钥,为16进制。
- -iv IV:初始化向量,为16进制。
- -p:打印出使用的salt、口令以及初始化向量IV。
- -P:打印使用的salt、口令以及IV,不做加密和解密操作。
- -bufsize number:设置I/O操作的缓冲区大小,因为一个文件可能很大,每次读取的数据是有限的。
- -debug:打印调试信息。
-
AES加解密
- 加密
- openssl enc -aes-128-cbc -in in.txt -out out.txt -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF
- 解密
- openssl enc -aes-128-cbc -in out.txt -out inin.txt -d -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF
- 我们选择的密钥长度为128位,从上面列表可以知道,密钥长度可以选取128位,192位,256位。选择的加密模式为cbc,加密模式可以选取ecb,cbc,cfb,ofb,ctr。
- 如果你要阅读密文,要指定参数-a进行base64编码,否则密文是二进制文件,解密时也要指定-a参数,先进行base64解码,再进行解密。默认是加密操作,加密时可以不指定参数,但解密时我们要指定参数-d。ecb模式是没有初始化向量的,所以ecb模式我们不用指定-iv参数
-
DES加解密
- 加密
- openssl enc -des-ecb -K 0123456789AAAAAA -in in.txt -out out.txt -a
- 解密
- openssl enc -des-ecb -d -K 0123456789AAAAAA -in out.txt -out inin.txt -a
- des密钥长度是固定的,为64位,所以我们只需要选择加密模式。
-
其他对称加解密算法这里就不演示,用法基本都一样。
6 非对称加解密
-
RSA
- 生成私钥 2048为密钥位数
openssl genrsa -out private.key 2048
- 从私钥文件中导出公钥
openssl rsa -in private.key -pubout -out public.key
- RSA公钥加密 in.txt为源文件,out.txt为加密后的文件
openssl rsautl -encrypt -pubin -inkey public.key -in in.txt -out out.txt
- RSA私钥解密 inin.txt为解密后的文件
openssl rsautl -decrypt -inkey private.key -in out.txt -out inin.txt
-
ECC
- 查看支持的椭圆曲线
- openssl ecparam -list_curves
- 可以看到支持的所有椭圆曲线,最前面就是曲线名称
-
secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SECG curve over a 128 bit prime field secp128r2 : SECG curve over a 128 bit prime field secp160k1 : SECG curve over a 160 bit prime field secp160r1 : SECG curve over a 160 bit prime field secp160r2 : SECG/WTLS curve over a 160 bit prime field secp192k1 : SECG curve over a 192 bit prime field secp224k1 : SECG curve over a 224 bit prime field secp224r1 : NIST/SECG curve over a 224 bit prime field secp256k1 : SECG curve over a 256 bit prime field secp384r1 : NIST/SECG curve over a 384 bit prime field secp521r1 : NIST/SECG curve over a 521 bit prime field prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field prime192v2: X9.62 curve over a 192 bit prime field prime192v3: X9.62 curve over a 192 bit prime field prime239v1: X9.62 curve over a 239 bit prime field prime239v2: X9.62 curve over a 239 bit prime field prime239v3: X9.62 curve over a 239 bit prime field prime256v1: X9.62/SECG curve over a 256 bit prime field sect113r1 : SECG curve over a 113 bit binary field sect113r2 : SECG curve over a 113 bit binary field sect131r1 : SECG/WTLS curve over a 131 bit binary field sect131r2 : SECG curve over a 131 bit binary field sect163k1 : NIST/SECG/WTLS curve over a 163 bit binary field sect163r1 : SECG curve over a 163 bit binary field sect163r2 : NIST/SECG curve over a 163 bit binary field sect193r1 : SECG curve over a 193 bit binary field sect193r2 : SECG curve over a 193 bit binary field sect233k1 : NIST/SECG/WTLS curve over a 233 bit binary field sect233r1 : NIST/SECG/WTLS curve over a 233 bit binary field sect239k1 : SECG curve over a 239 bit binary field sect283k1 : NIST/SECG curve over a 283 bit binary field sect283r1 : NIST/SECG curve over a 283 bit binary field sect409k1 : NIST/SECG curve over a 409 bit binary field sect409r1 : NIST/SECG curve over a 409 bit binary field sect571k1 : NIST/SECG curve over a 571 bit binary field sect571r1 : NIST/SECG curve over a 571 bit binary field c2pnb163v1: X9.62 curve over a 163 bit binary field c2pnb163v2: X9.62 curve over a 163 bit binary field c2pnb163v3: X9.62 curve over a 163 bit binary field c2pnb176v1: X9.62 curve over a 176 bit binary field c2tnb191v1: X9.62 curve over a 191 bit binary field c2tnb191v2: X9.62 curve over a 191 bit binary field c2tnb191v3: X9.62 curve over a 191 bit binary field c2pnb208w1: X9.62 curve over a 208 bit binary field c2tnb239v1: X9.62 curve over a 239 bit binary field c2tnb239v2: X9.62 curve over a 239 bit binary field c2tnb239v3: X9.62 curve over a 239 bit binary field c2pnb272w1: X9.62 curve over a 272 bit binary field c2pnb304w1: X9.62 curve over a 304 bit binary field c2tnb359v1: X9.62 curve over a 359 bit binary field c2pnb368w1: X9.62 curve over a 368 bit binary field c2tnb431r1: X9.62 curve over a 431 bit binary field wap-wsg-idm-ecid-wtls1: WTLS curve over a 113 bit binary field wap-wsg-idm-ecid-wtls3: NIST/SECG/WTLS curve over a 163 bit binary field wap-wsg-idm-ecid-wtls4: SECG curve over a 113 bit binary field wap-wsg-idm-ecid-wtls5: X9.62 curve over a 163 bit binary field wap-wsg-idm-ecid-wtls6: SECG/WTLS curve over a 112 bit prime field wap-wsg-idm-ecid-wtls7: SECG/WTLS curve over a 160 bit prime field wap-wsg-idm-ecid-wtls8: WTLS curve over a 112 bit prime field wap-wsg-idm-ecid-wtls9: WTLS curve over a 160 bit prime field wap-wsg-idm-ecid-wtls10: NIST/SECG/WTLS curve over a 233 bit binary field wap-wsg-idm-ecid-wtls11: NIST/SECG/WTLS curve over a 233 bit binary field wap-wsg-idm-ecid-wtls12: WTLS curve over a 224 bit prime field Oakley-EC2N-3: IPSec/IKE/Oakley curve #3 over a 155 bit binary field. Not suitable for ECDSA. Questionable extension field! Oakley-EC2N-4: IPSec/IKE/Oakley curve #4 over a 185 bit binary field. Not suitable for ECDSA. Questionable extension field! brainpoolP160r1: RFC 5639 curve over a 160 bit prime field brainpoolP160t1: RFC 5639 curve over a 160 bit prime field brainpoolP192r1: RFC 5639 curve over a 192 bit prime field brainpoolP192t1: RFC 5639 curve over a 192 bit prime field brainpoolP224r1: RFC 5639 curve over a 224 bit prime field brainpoolP224t1: RFC 5639 curve over a 224 bit prime field brainpoolP256r1: RFC 5639 curve over a 256 bit prime field brainpoolP256t1: RFC 5639 curve over a 256 bit prime field brainpoolP320r1: RFC 5639 curve over a 320 bit prime field brainpoolP320t1: RFC 5639 curve over a 320 bit prime field brainpoolP384r1: RFC 5639 curve over a 384 bit prime field brainpoolP384t1: RFC 5639 curve over a 384 bit prime field brainpoolP512r1: RFC 5639 curve over a 512 bit prime field brainpoolP512t1: RFC 5639 curve over a 512 bit prime field SM2 : SM2 curve over a 256 bit prime field
-
生成参数文件
- openssl ecparam -name secp256k1 -out secp256k1.pem
-
显示参数文件参数
- openssl ecparam -in secp256k1.pem -text -param_enc explicit -noout
-
使用参数文件生成私钥
- openssl ecparam -in secp256k1.pem -genkey -out secp256k1-key.key
-
从私钥中导出公钥
- openssl ec -in secp256k1-key.key -pubout -out public.key
-
备注:使用命令行工具我只查到了如何生成ECC公私钥,没有找到加解密的功能。ECC椭圆曲线比较常用的两种,SM2和secp256k1,SM2在国内的商用密码产品中已经广泛使用,secp256k1主要用于区块链和比特币领域。
7 证书
- 生成虚拟CA证书
- 生成RSA私钥
- openssl genrsa -out ca.key 1024
- 说明:1024为密钥位数
- 执行命令后,就会在当前目录下生成一个ca.key文件,其中记录RSA私钥。可以直接查看内容
-
-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQDDu6lkJcarc1lmBebpPmluRTf6awjDibqU/zTDBmQCBhwnQi3P LSZ12YFA8vo7DOKhABztZXNxEV08WFgqPB43GhJohYDeDybAwXukKSxmJab5ekvr rNr4szExWCNb2Id1ZOmkbjakHwZStwd54haOa395xVtl5xCZUn4t0K82uwIDAQAB AoGAFyAR6FoqOdF8C3jBCmesTzHwZi7FL00TdU0dr7kOkcqlAuJnxSWBeMUE52aN t/JSyFDaGhY1aHNzv5B0gjDuJMGErAdBaTIXTXc25AOTgMhW/RT1SUzLhZh2IfMN /wSTRlO3trU+mzumY2DbdFG5e4CYv9zRUpRqjnNT/w3Md3ECQQDqrk54+a3acZcC eXioouIVb4VZ3L6xuSM55jdFw+/XFDADpPIBMiLgy7xwIrwQEGfx5uCO5H5FJ+UN j2ccB4zJAkEA1YOXhac16Lblnv4Ygk4wyPmt/LcLUjDMUO7aKR8MLDkVvNlc/qVW FqqAWT+fmICjUJ+xEJorQM0RkwsybckdYwJASGJXBe1M+FGM2FCLLMiAn0f0g5EY qEyIVvVxGu2ibl5lqNoZYtEJ/PgaOSQdiX7l8LDblndXkxEJDzOqA/U4MQJBAMni HhAa1adP4HfgDC6RXiF5q6BrNwIk79uKrK77E1hxNXOWFw8UJ/1QhAFfXjklUMZ3 6EUpcMJZ5Ecj7C/QXL8CQFBpVXikMCE7WwAkNlyOO97cVrLOkDcopi5W1WdfGzt4 uWF56WpDo9ZJb/eevGUqcIa304nxnV80g+myJlRVbHI= -----END RSA PRIVATE KEY-----
- 生成CA证书
- openssl req -new -x509 -key ca.key -out ca.crt -days 365
- 说明 : -days指定证书有效期
- 输入命令后,需要填写以下信息
-
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) [AU]:CH #国家名 State or Province Name (full name) [Some-State]:ShanXi #省份名 Locality Name (eg, city) []:XiAn #城市名 Organization Name (eg, company) [Internet Widgits Pty Ltd]:csdn #公司名 Organizational Unit Name (eg, section) []:csdn #部门 Common Name (e.g. server FQDN or YOUR name) []:CA Email Address []:
- 输入以上信息后,就会生成一个ca.crt的证书文件,可以使用以下命令查看证书内容
- openssl x509 -noout -text -in ca.crt
-
Certificate: Data: Version: 3 (0x2) Serial Number: 17:55:d5:5e:1c:bb:92:cc:09:08:64:c7:1b:b0:e5:27:f6:76:e6:31 Signature Algorithm: sha256WithRSAEncryption Issuer: C = CH, ST = ShanXi, L = XiAn, O = csdn, OU = csdn, CN = CA Validity Not Before: Jan 1 10:30:58 2022 GMT Not After : Jan 1 10:30:58 2023 GMT Subject: C = CH, ST = ShanXi, L = XiAn, O = csdn, OU = csdn, CN = CA Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (1024 bit) Modulus: 00:c3:bb:a9:64:25:c6:ab:73:59:66:05:e6:e9:3e: 69:6e:45:37:fa:6b:08:c3:89:ba:94:ff:34:c3:06: 64:02:06:1c:27:42:2d:cf:2d:26:75:d9:81:40:f2: fa:3b:0c:e2:a1:00:1c:ed:65:73:71:11:5d:3c:58: 58:2a:3c:1e:37:1a:12:68:85:80:de:0f:26:c0:c1: 7b:a4:29:2c:66:25:a6:f9:7a:4b:eb:ac:da:f8:b3: 31:31:58:23:5b:d8:87:75:64:e9:a4:6e:36:a4:1f: 06:52:b7:07:79:e2:16:8e:6b:7f:79:c5:5b:65:e7: 10:99:52:7e:2d:d0:af:36:bb Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: FB:C8:7A:FA:ED:91:C1:60:0A:54:A4:22:F4:6D:BC:9C:47:DE:76:AF X509v3 Authority Key Identifier: keyid:FB:C8:7A:FA:ED:91:C1:60:0A:54:A4:22:F4:6D:BC:9C:47:DE:76:AF X509v3 Basic Constraints: critical CA:TRUE Signature Algorithm: sha256WithRSAEncryption 0c:4c:be:50:27:dc:fe:b8:dc:cf:f6:9f:85:26:ec:25:34:d6: 3f:54:32:a7:16:78:11:ff:28:4a:c9:43:db:22:c0:ff:8f:fb: 54:1f:ab:8c:3d:a4:21:bc:a7:ea:88:32:c9:31:16:49:96:86: 7a:b2:c3:cf:50:25:ee:bd:dd:61:00:97:88:86:10:4a:93:e0: 16:eb:ce:89:77:c3:f0:fc:4e:73:9f:7f:82:fa:76:52:1f:4d: a7:a7:5c:fe:f6:b5:5a:a5:4b:2d:19:e1:80:b8:63:02:b2:2f: 83:5b:1b:8d:6a:9e:93:3e:70:9b:bc:4d:bd:24:ae:ed:f6:52: 2b:65
- 可以把证书文件后缀名改为.cer或.der,然后拷贝到windows系统上,可以直接双击查看证书内容。
- 使用CA证书签发普通证书
- 生成RSA私钥
- openssl genrsa -out server.key 1024
- 生成证书请求文件
- openssl req -new -key server.key -out server.csr
- 使用CA证书签发普通证书
- openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365
- 到这里,我们就成功构造出一张由模拟CA机构签发的一张数字证书server.crt
- 使用以下命令查看证书内容
- openssl x509 -noout -text -in server.crt
-
Certificate: Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = CH, ST = ShanXi, L = XiAn, O = csdn, OU = csdn, CN = CA Validity Not Before: Jan 1 11:40:40 2022 GMT Not After : Jan 1 11:40:40 2023 GMT Subject: C = CH, ST = ShanXi, L = Xian, O = dacaoyuan, OU = dacaoyuan, CN = xll Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (1024 bit) Modulus: 00:c2:82:90:cd:dc:77:3a:10:d0:50:f0:f5:71:f3: bc:30:df:02:42:4d:21:cb:34:f1:7e:ca:c8:de:ed: 3e:49:36:3f:98:48:05:7f:3a:73:22:89:91:53:76: c1:3b:5f:48:a6:03:7c:15:04:01:16:ab:26:7e:3f: 17:a4:74:90:12:d2:3f:e0:84:d4:0b:d2:f0:3c:8e: a9:4c:e3:f4:74:1d:c0:71:3e:8b:85:4b:66:8f:bb: 1c:61:2e:40:2d:e8:05:ec:1f:ea:8d:d7:66:3a:2d: 83:5d:5a:69:1a:e7:69:9f:01:2a:a6:98:e3:53:eb: ef:19:33:df:33:9e:67:a6:df Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption 71:c0:e7:13:63:2a:b7:44:15:d8:a2:7c:15:82:21:70:74:ae: 1f:93:24:d5:a1:6c:eb:ac:32:ed:ea:aa:d2:64:f4:5b:59:7f: 85:1f:1e:9f:a3:d9:b7:9d:80:80:44:5b:4b:fa:f3:b4:ae:ff: 11:c0:23:20:e2:60:58:c3:ba:d8:36:b7:6a:7d:97:f1:2b:50: 45:4d:c9:20:1b:01:34:88:5e:be:5c:ce:54:66:1f:72:e7:a9: 1b:96:41:48:14:f7:e1:2b:89:93:45:e3:a5:7a:5d:f1:43:d7: 8b:d5:90:07:d6:20:3b:bb:47:ff:92:20:36:8d:5e:16:89:17: e8:12
- 可以把CA证书和普通证书进行下比对,可以看到CA证书的颁发者和使用者都是CA,而普通证书的颁发者是CA,使用者是自己。
8 SSL/TLS协议
- openssl也支持使用命令行工具进行SSL/TLS通信,有两个命令:
s_server
和s_client
s_server
和s_client
命令的详细参数可以分别执行openssl.exe s_server -help
和openssl.exe s_client -help
查看,或者从官网查看 openssl-s_server。下面只介绍常用的一些参数。- s_client命令主要参数
-
-connect val # 设置要连接的服务器地址,格式:ip:port -bind val # 绑定一个本地地址去连接服务器,格式:ip:port -verify +int # 设置校验深度 -cert infile # 指定客户端证书文件 -certform PEM|DER # 指定客户都安证书文件格式,支持PEM和DER -key val # 指定客户端私钥 -keyform PEM|DER|ENGINE # 客户端私钥格式, 支持PEM、DER和engine, 默认为PEM -pass val # 私钥口令 -CAfile infile # 指定CA证书 -CApath dir # 指定CA证书目录 -tls1 # 只使用 TLSv1 -tls1_1 # 只使用 TLSv1.1 -tls1_2 # 只使用 TLSv1.2 -tls1_3 # 只使用 TLSv1.3
-
- s_server命令主要参数
-
-port +int # 设置监听端口,默认为4433 -accept val # 监听本地地址和端口,接收连接。默认为4433 -verify int # 设置验证深度, 客户端可以不提供证书 -Verify int # 设置验证深度, 客户端必须提供证书 -cert infile # 指定服务端证书, 如果未指定, 默认为server.pem -certform PEM|DER # 指定证书格式, 支持PEM和DER -key val # 指定私钥文件 -keyform format # 指定私钥格式, 支持PEM和DER -pass val # 私钥口令 -CAfile infile # 指定CA证书 -CApath dir # 指定CA证书目录 -www # 客户端连接状态返回给客户端 -verify_return_error # 验证错误则关闭连接 -tls1 # 只使用 TLSv1 -tls1_1 # 只使用 TLSv1.1 -tls1_2 # 只使用 TLSv1.2 -tls1_3 # 只使用 TLSv1.3
-
- 单向认证测试
-
# 服务端启动命令 # rev 表示将客户端发送过来的字符串反转并发送回去 openssl.exe s_server -port 443 -cert rsa.openssl_cn.crt.pem -key rsa.openssl_cn.key.pem -rev # 客户端启动命令 openssl.exe s_client -connect 127.0.0.1:443
-
- 双向认证测试
-
# 服务端启动命令 # Verify表示校验深度为1,并且强制校验 openssl.exe s_server -port 443 -cert rsa.openssl_cn.crt.pem -key rsa.openssl_cn.key.pem -CAfile rsa.ca.pem -Verify 1 -rev -tls1_2 # 客户端启动命令 openssl.exe s_client -connect 127.0.0.1:443 -cert rsa.openssl_cn.crt.pem -key rsa.openssl_cn.key.pem
-
9 数据加解密和证书管理工具
- 这是本人开发的一款数据加解密和证书管理工具,起名为密码行者。
- 支持对称加解密、非对称加解密、证书解析和证书签发。
- gitee链接地址