OpenSSL 介绍

发布时间: 更新时间: 总字数:2317 阅读时间:5m 作者:IP:上海 网址

OpenSSL 是一个加密工具包,用于执行 Secure Sockets Layer (SSL, 安全套接字层)Transport Layer Security (TLS, 传输层安全) 网络协议及其所需的相关加密标准。

介绍

用途(更多参考 man openssl

  • 创建和管理私钥、公钥和参数
  • 公钥加密操作
  • 创建 X.509 证书、CSR 和 CRL
  • 计算报文摘要和报文验证码
  • 使用密码进行加密和解密
  • SSL/TLS 客户端和服务器测试,参考SSL/TLS 原理详解
  • 处理 S/MIME 签名或加密邮件
  • 时间戳请求、生成和验证

安装

源码安装

tar zxvf openssl-1.0.2l.tar.gz
mkdir /usr/local/openssl12
cd openssl-1.0.2l/
./config --prefix=/usr/local/openssl12/
make && make install

ubuntu

apt install openssl

help

openssl --help ...

使用示例

openssl s_client -connect google.com:443

openssl speed -evp aes-256-gcm

openssl base64 -A < "/root/ca.crt"
base64 | tr -d '\n'

RSA

  • openssl rsa RSA 对称密钥的处理工具
  • openssl pkey 通用非对称密钥处理工具
openssl rsa  [-in filename] [-passin arg] [-passout arg] [-out filename] [-des|-des3|-idea] [-text] [-noout] [-pubin] [-pubout] [-check]

openssl pkey [-in filename] [-passin arg] [-passout arg] [-out filename] [-cipher]          [-text] [-noout] [-pubin] [-pubout]

说明:

  • -in filename 输入的密钥文件

    • 当指定 -pubin 选项是,表示读取公钥
      • 公钥文件:一般以 -----BEGIN PUBLIC KEY----- 开头和以 -----END PUBLIC KEY----- 结尾
    • 当不指定时,从 stdin 读取
  • -passin arg 解密密钥文件的密码

  • -passout arg 加密输出文件的密码

  • -out filename 输出的文件

  • -des|-des3|-idea 加密输出文件

  • -text 转换输入和输出的密钥文件格式为纯文本格式

  • -noout 不输出任何密钥信息

  • -pubout 从私钥中提取公钥

  • -check 检查 RSA 密钥是否完整未被修改过,只能检测私钥

  • 示例

# 生成不加密的私钥
$ openssl genrsa -out private.pem 2048

# 查看私钥
$ cat private.pem
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

# 读取私钥
$ openssl rsa -in private.pem
writing RSA key
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

# 读取加密私钥
$ openssl rsa -in private.pem -passin pass:123456

# 以文本格式输出私钥
$ openssl rsa -in private.pem -text
Private-Key: (2048 bit, 2 primes)
modulus:
    00:9c:9b:47:58:85:e8:e7:36:cc:4c:12:f4:fb:c2:
    ...
publicExponent: 65537 (0x10001)
privateExponent:
    01:fd:44:f8:3e:67:39:7c:ac:36:b1:2c:f4:7f:c1:
    ...
prime1:
    00:d9:28:6c:9f:f3:02:d4:1f:b9:e6:fc:eb:05:cd:
    ...
prime2:
    00:b8:9e:3b:52:c1:f9:a0:fa:02:8a:28:53:62:ad:
    ...
exponent1:
    5b:30:1e:6d:0c:1e:a3:f4:ae:9b:d0:98:e0:56:c9:
    ...
exponent2:
    00:86:63:58:57:a3:af:ed:08:50:b4:f5:29:cd:d9:
    ...
coefficient:
    00:cb:17:9f:4c:1d:f8:3a:60:8e:3e:74:d7:f5:15:
    ...
writing RSA key
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

# 不输出私钥内容
$ openssl rsa -in private.pem -text -noout

# 从私钥中提取公钥
$ openssl rsa -in private.pem -pubout -out public.pem
writing RSA key
$ cat public.pem
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

# 读取公钥
$ openssl rsa  -pubin -in public.pem
writing RSA key
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

# 以文本格式输出公钥
$ openssl rsa -pubin -in public.pem -text
Public-Key: (2048 bit)
Modulus:
    ...
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

# 不输出公钥内容
$ openssl rsa -pubin -in public.pem -text -noout

# 添加密码
openssl rsa -in private.pem -passout pass:123456

# 加密输出到文件
openssl rsa -des -in private.pem -out encrypt.key

# 检测私钥文件的一致性(是否被修改)
$ openssl rsa -in private.pem -check
RSA key ok
writing RSA key
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

RSA 格式

特点 -----BEGIN RSA PRIVATE KEY----- -----BEGIN PRIVATE KEY-----
标准 PKCS#1 PKCS#8
密钥类型 仅限 RSA 私钥 通用,可包含任何算法的私钥(如 RSA, DSA, ECC 等)
算法标识 不包含在头部,隐含为 RSA 包含在内部数据结构中(AlgorithmIdentifier)
兼容性 较老系统或只支持 RSA 的应用可能只接受此格式 现代系统和应用更倾向于使用,因为其通用性和可扩展性更好
OpenSSL 较老版本默认生成,新版本可通过参数生成 较新版本默认生成
  • -----BEGIN RSA PRIVATE KEY----- (PKCS#1 格式)
    • 这种格式是 PKCS#1 (Public-Key Cryptography Standards #1) 标准定义的 RSA 私钥
    • 它专门用于 RSA 算法的私钥
    • 其内部结构直接包含了 RSA 私钥的各个组成部分(模数 $n$、公钥指数 $e$、私钥指数 $d$、素数因子 $p$ 和 $q$ 等)
    • 它不包含标识密钥算法类型的 OID(Object Identifier,对象标识符)
    • 是 OpenSSL 较老版本默认生成的 RSA 私钥格式,也称为传统 OpenSSL 格式
  • -----BEGIN PRIVATE KEY----- (PKCS#8 格式)
    • 这种格式是 PKCS#8 (Public-Key Cryptography Standards #8) 标准定义的私钥
    • 它是一种 通用格式,可以用于存储任何类型的私钥,而不仅仅是 RSA 私钥
    • 其内部结构包含一个 AlgorithmIdentifier(算法标识符),明确指出私钥所使用的算法(例如 RSA、DSA、ECC 等)
    • 这意味着即使看到 BEGIN PRIVATE KEY,也需要解析其内部数据才能知道它是哪种算法的私钥
    • 是 OpenSSL 较新版本默认生成的私钥格式
    • PKCS#8 格式还可以包含加密的私钥(即 -----BEGIN ENCRYPTED PRIVATE KEY-----),而 PKCS#1 格式的私钥通常不直接支持加密(OpenSSL 对 PKCS#1 加密是一种 Ad-hoc 实现)
  • 转换
    • PKCS#1 到 PKCS#8:
    bash
    openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in old_private_key_pkcs1.pem -out new_private_key_pkcs8.pem
    openssl rsa -in old_private_key_pkcs8.pem -out new_private_key_pkcs1.pem

Elliptic Curve/EC

  • openssl ecparam 是一个用于椭圆曲线(Elliptic Curve,EC)密钥参数生成及操作的命令行工具
    • 椭圆曲线密码学(ECC)相对于传统的 RSA 等算法,在提供相同安全强度的情况下,所需的密钥长度更短,因此更节省存储空间和计算资源
    • openssl ecparam 生成的椭圆曲线密钥参数遵循国际标准和最佳实践,确保了密钥的安全性和可靠性

help

openssl ecparam --help ...

说明:

  • -inform PEM|DER 输入文件格式
    • DER 格式采用 ASN1 的 DER 标准格式
    • PEM 格式采用 base64 编码格式(使用较多)
  • -in filename 输入的椭圆曲线密钥文件,默认为标准输入
  • -out filename 椭圆曲线密钥输出文件,默认为标准输出
  • -noout 不打印参数编码的版本信息
  • -text 打印椭圆曲线密钥参数信息值
  • -C 以 C 语言风格打印信息
  • -check 检查椭圆曲线密钥参数
  • -name arg:采用短名字,打印所有椭圆曲线 短名称 的列表
$ openssl ecparam -list_curves
  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
  prime256v1: X9.62/SECG curve over a 256 bit prime field

使用示例

  • 生成 SSL 证书
$ openssl ecparam -genkey -name prime256v1 -out server.key
$ cat server.key
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIJvikw5C8JZk645GiT2rfoYm1svhTtVR8FinUgzT+7TgoAoGCCqGSM49
AwEHoUQDQgAEJU88pkrY7XodDRfVmx3x2UqSJTfCF/iFOSw/hd92//tD2ct94yj2
G4cOBtYcB4LhsTpPvXv3d+DxoazoW87RfQ==
-----END EC PRIVATE KEY-----

# csr: 需要输入国家、组织、CN(通用名称,通常是你的域名或IP地址)
$ openssl req -new -key server.key -out server.csr

# 生成自签证书
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = XX, L = Default City, O = Default Company Ltd
Getting Private key

# openssl ecparam -name prime256v1 -genkey -noout > eckey
# openssl req -new -x509 -sha256 -key eckey -out server.pem -days 10000 -subj '/C=CN/ST=SH/L=SH/O=IT/OU=IT/CN=xiexianbin.cn/emailAddress=me@xiexianbin.cn'
  • 生成 SSL 证书:CA 方式
# create ca
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 7200 -key ca.key -out ca.pem

$ cat san.cnf
subjectAltName = @alt_names

[alt_names]
DNS.1 = xiexianbin.cn

# 生成 SSL 证书
openssl ecparam -genkey -name secp384r1 -out server.key
openssl req -new -key server.key -out server.csr
openssl x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in server.csr -out server.crt -extfile san.cnf

# 查看证书
openssl x509 -in server.crt --noout -text
  • 生成椭圆曲线参数
$ openssl ecparam -genkey -name secp256k1 -out eckey.pem
$ cat eckey.pem
-----BEGIN EC PARAMETERS-----
BgUrgQQACg==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBXpqqvKqukB9dtDa9/TWpd+wM34l2wtKvc2cqcp2KukoAcGBSuBBAAK
oUQDQgAEDzaDWpfyQ9nnxSfkcK+LlDaSnNn+Y50wBL+HhOT5khB3Ke7ayjlrekV9
xs8taudj5wtCLgzLnylSbus/NEgYuw==
-----END EC PRIVATE KEY-----

# 查看椭圆曲线参数
$ openssl ecparam -in eckey.pem -text -noout
ASN1 OID: secp256k1

# 检查
$ openssl ecparam -in eckey.pem --check
checking elliptic curve parameters: ok
-----BEGIN EC PARAMETERS-----
BgUrgQQACg==
-----END EC PARAMETERS-----
本文总阅读量 次 本站总访问量 次 本站总访客数