密码技术学习(8.3)-OpenSSL介绍

什么是OpenSSL

在之前的文章中我们介绍了JDK自带的keytool工具,现在我来介绍另一个证书管理工具,它就是OpenSSL。

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。百度百科

OpenSSL的基本用法

使用OpenSSL生成Key

使用OpenSSL生成Key你需要决定三件事

  1. 算法 支持RSA、DSA或ECDSA,但是你需要选择合适的算法
  2. 密钥长度 长度越长,则越安全
  3. 保护密码(可选)
1)生成RSA Key
openssl genrsa -aes128 -out shaozuo.key 2048

shaozuo.key文件中的内容,有固定的开头和结尾,使用Base64编码格式

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,A58EBD2BA301361A947DD0C703D99263

2HmGti8vmVGCIjayfpK7uAAyveCfp/ObRXF4f+EYn0lNY4TqBQ8AFJPS+YLK9SzL
wv23rhPt6uAQosFX7JW3FAfR7P+F3YdEnWD5UVrLJGHliaNDelgEr74Xl8EK4OWO
[.....]
R16TnMrCn8oq2p1KOvbgyyqpqCDi1hJrzDBKQTENVZmjiFgzsN5fvxl77FY+TMgX
ZZxas5BtUTCJY5/A7kXJfkSYak2rwE3sXzhXuDozSgbGUZ5MH1Vq/J4x3lSmYXQZ
-----END RSA PRIVATE KEY-----
2)查看生成RSA Key结构
openssl rsa -text -in shaozuo.key

使用该命令可以格式化显示key结构

Private-Key: (2048 bit)
modulus:
    00:b1:1b:ad:f3:aa:41:3c:46:2a:ed:8a:45:e3:ee:
	[.....]
publicExponent: 65537 (0x10001)
privateExponent:
    28:33:7c:3c:be:fc:a7:cd:d5:98:ad:b6:47:92:c3:
    [.....]
prime1:
    00:dd:c8:1b:04:31:b7:74:78:a4:ac:25:40:4e:eb:	
    [.....]
prime2:
    00:cc:6f:10:eb:97:b7:fc:c3:d5:f7:a7:d0:76:39:
    [.....]
exponent1:
    00:c1:22:b1:e4:45:27:6d:d6:62:11:47:9f:69:1a:
    [.....]
exponent2:
    7c:11:07:86:c2:eb:c0:f5:a4:bc:08:d7:25:78:75:
    [.....]
coefficient:
    6f:05:4f:fe:4f:dd:61:b3:ec:1f:0f:9e:30:2a:05:
    [.....]
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsRut86pBPEYq7YpF4+7XUQLBI2+/smgJTNdHba/ub3dTwPj+
[.....]
jlysZvgazPd+ZpbjkGoQMAfdp12+29c9FXf7vruHgjJoSUXGr3fF
-----END RSA PRIVATE KEY-----
           
3)导出RSA Key公钥
openssl rsa -in shaozuo.key -pubout -out shaozuo-public.key

显示已Base64格式编码的公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsRut86pBPEYq7YpF4+7X
UQLBI2+/smgJTNdHba/ub3dTwPj+40dt+RmxPlfdTAdm8vg3fegzEeg3FMRxireK
PrBOOupbIsZkhWNkhhgBUYM/WhyZlDBftkHuGmcx7KA/eg0E2HLs6qMq7r7c1n1n
ZaR3nxTedXvYiwXNlv8UblImz6OesTEJX12Zq+WsK3edeLgte1ubfhlY0SA8Go1U
ezHhd2YR8+X52J5orycb5JD/PL0+pG0Ii/FC9foTS8amIu3zTKbSBVsY/e3BEK/j
u9Aqud6Xp+cJab8axQ0cLZ5ZkqMjZYxrp+L+pskFz8/7UJf09iktZG1YXXtug+Zl
/QIDAQAB
-----END PUBLIC KEY-----

4)生成DSA Key

生成DSA Key 有两个步骤,第一个是生成DSA 参数,第二步是生成DSA Key。
先将参数保存到文件中,然后从文件中读取参数生成Key

openssl dsaparam -genkey 2048 >> dsa.param
cat dsa.param | openssl dsa -out dsa.key -aes128

也可以使用如下命令将两部联合到一行命令中,省去中间文件

openssl dsaparam -genkey 2048 | openssl dsa -out shaozuo-dsa.key -aes128	
5)生成ECDSA Key

与生成DSA Key类似,只是使用的参数不同。当然ECDSA不能任意指定生成的Key大小,它使用
-name curve 进行控制:

openssl ecparam -genkey -name secp256r1 | openssl ec -out shaozuo-ec.key -aes128	

其中curve是EC参数的简短名称,可用的名称可通过一下命名查询:

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
  [......]

生成证书请求文件(Certificate Signing Request,CSR)

CSR是Certificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。百度百科

1) 创建CSR文件

使用如下命令创建CSR文件,在这个过程中会通过交互的方式询问你的信息

openssl req -new -key shaozuo.key -out shaozuo.csr
2) 查看CSR文件内容
 openssl req -text -in shaozuo.csr -noout

命令的输出类似于:

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CN, ST=Beijing, L=Beijing, O=shaozuo, OU=shaozuo, CN=shaozuo/emailAddress=shaozuo@laozhai.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b1:1b:ad:f3:aa:41:3c:46:2a:ed:8a:45:e3:ee:
                    [......]
                Exponent: 65537 (0x10001)
        Attributes:
            unstructuredName         :laozhai
            challengePassword        :laozhai
    Signature Algorithm: sha256WithRSAEncryption
         96:df:c3:bf:a3:d8:52:44:7f:57:ad:8e:ba:31:fe:d7:e2:ec:
         [......]

3) 使用配置文件生成CSR文件

将如下内容保存到一个文件中,比如laozhai.cnf

[req]
prompt = no
distinguished_name = sz 
## 你使用的key的密码
input_password = shaozuo
## = distinguished_name
[sz]
C=CN
ST=Beijing
L=Beijing
O=shaozuo
OU=shaozuo
CN=shaozuo
emailAddress=shaozuo@laozhai.com

使用如下命令,生成CSR文件

openssl req -new -config laozhai.cnf -key shaozuo.key -out laozhai.csr

查看生成的CSR文件,显示如下信息,查看命令看上文

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CN, ST=Beijing, L=Beijing, O=shaozuo, OU=shaozuo, CN=shaozuo/emailAddress=shaozuo@laozhai.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b1:1b:ad:f3:aa:41:3c:46:2a:ed:8a:45:e3:ee:
                    [......]
                Exponent: 65537 (0x10001)
        Attributes:
            unstructuredName         :laozhai
            challengePassword        :laozhai
    Signature Algorithm: sha256WithRSAEncryption
         96:df:c3:bf:a3:d8:52:44:7f:57:ad:8e:ba:31:fe:d7:e2:ec:
         [......]

签名证书

如果你不想通过CA来签名你的证书(这是要花钱的),你也可以自己签名证书。

1) 自签名

使用如下命令签名证书:

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

生成的证书类型crt,我们可以使用windows打开:
Alt textAlt text

如果你不想产生CSR文件,而是想直接产生证书,可以用如下命令

openssl req -new -x509 -days 365 -key shaozuo.key -out shaozuo.crt

如果不想使用交互的方式来产生证书,可以添加-subj参数

openssl req -new -x509 -days 365 -key shaozuo.key -out shaozuo.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=shaozuo/CN=shaozuo"
2) 创建多主机证书

一般的证书只支持一个主机名,所以如果你有多个相关账号,你只能制作多张证书。在这种情况下,可以使用多域名证书。有两种机制来实现:

  1. 将所有的主机名存储在X.509的扩展字段 Subject Alternative Name (SAN)
  2. 使用通配符

首先将扩展信息写入一个文件,比如laozhai.ext

subjectAltName = DNS:*.laozhai.com, DNS:shaozuo.com

然后使用证书命令创建证书

openssl x509 -req -days 365 -in shaozuo.csr -signkey shaozuo.key -out shaozuo.crt -extfile laozhai.ext
3) 查看证书信息

使用如下命令查看证书信息

openssl x509 -text -in shaozuo.crt -noout

只列出扩展信息,其余信息就不列出了
Alt text

密钥和证书的转换

在之前的文章中,我们已经介绍过证书的格式。在这一节中,我们简单介绍一下如何使用OpenSSL转换格式

1) PEM 和 DER 的转换

证书转换使用x509命令

openssl x509 -in shaozuo.crt -out shaozuo.pem -outform PEM

pem -> der

openssl x509 -inform PEM -in shaozuo.pem -outform DER -out shaozuo.der

der -> pem

openssl x509 -inform DER -in shaozuo.der-outform PEM -out shaozuo.pem
2) 与PKCS#12 之间的转换

将key,Certificate转换为pkcs12格式,

 openssl pkcs12 -export -name "Shaozuo Certificate" -out shaozuo.p12 -inkey shaozuo.key -in shaozuo.crt

将pcks12转换为其他格式可以使用如下命令

openssl pkcs12 -in shaozuo.p12 -out shaozuo.pem -nodes

不过使用这个命令,会将所有信息都存在在shaozuo.pem文件中,需要你手动将证书、密钥等分离;也可以使用如下命令,只输出部分信息

openssl pkcs12 -in shaozuo.p12 -nocerts -out shaozuo.key -nodes
openssl pkcs12 -in shaouzo.p12 -nokeys -clcerts -out shaouzo.crt
3) 与PKCS#7之间的转换

使用如下命令

openssl crl2pkcs7 -nocrl -out shaozuo.p7b -certfile shaozuo.crt

参考资料

  1. OpenSSL 官网
  2. OpenSSL Windows版下载地址
    ##本系列其他文章
    密码技术学习系列文章
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值