Openssl基础

语法

1
2
openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-out filename] 
[-print] [-print_certs] [-text] [-noout] [-engine id

选项说明:

  • -inform PEM|DER::输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。
  • -outform DER|PEM:输出文件格式,DER或者PEM格式。
  • -in filename:输入的需要处理的文件,默认为标准输入。
  • -out filename:输出文件,默认为标准输出。
  • -print:打印出pkcs7的所有信息值。
  • -print_certs:打印证书或CRL信息,在一行中打印出持有者和颁发者。
  • -text:打印证书相关信息。
  • -noout:不打印证书信息值。
  • -engine id:指定硬件引擎。

openssl中后缀名文件的含义

后缀 说明
.key格式 私有的密钥
.csr格式 证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crt格式 证书文件,certificate的缩写
.crl格式 证书吊销列表,Certificate Revocation List的缩写
.pem格式 用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

OpenSSL生成自签名证书

CA根证书的生成

生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)(CA给自已颁发的证书)。

1
2
3
4
5
6
# Generate CA private key
$ openssl genrsa -out ca.key 2048
# Generate CSR
openssl req -new -key ca.key -out ca.csr
# Generate Self Signed certificate(CA 根证书)
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

在实际的软件开发工作中,往往服务器就采用这种自签名的方式,因为毕竟找第三方签名机构是要给钱的,也是需要花时间的。

用户证书的生成

生成私钥(.key)-->生成证书请求(.csr)-->用CA根证书签名得到证书(.crt)

1
2
3
4
5
6
7
### 服务器端用户证书
# private key
$ openssl genrsa -des3 -out server.key 1024
# generate csr
$ openssl req -new -key server.key -out server.csr
# generate certificate
$ openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

客户端用户证书

1
2
3
$ openssl genrsa -des3 -out client.key 1024 
$ openssl req -new -key client.key -out client.csr
$ openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

生成pem格式证书

有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成

1
2
$ cat client.crt client.key> client.pem 
$ cat server.crt server.key > server.pem

结果: 服务端证书:ca.crt, server.key, server.crt, server.pem 客户端证书:ca.crt, client.key, client.crt, client.pem

基础命令

打印证书

Apple's .mobileconfig files are signed using PKCS7. The signing certificate data can be shown using the following command:

1
$ openssl pkcs7 -inform DER -print_certs -in ~/Settings.mobileconfig

You can copy/paste ASCII certificate data from the output into a plain text file (with a .cer filename extension) to create copies of the certificates:

1
2
3
4
5
6
7
8
9
-----BEGIN CERTIFICATE-----
MIIElTCCA32gAwIBAgIBAjALBgkqhkiG9w0BAQswga4xQDA+BgNVBAMMN0tlbGxl
eSBDb21wdXRpbmcgT3BlbiBEaXJlY3RvcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkxGTAXBgNVBAoMEEtlbGxleSBDb21wdXRpbmcxJTAjBgNVBAsMHE1BQ09TWCBP
...
q19fbG33zNwRhVHceYMpcbWG1MSqLxnPu4wo75OZFIJCaByZykfpKAzRZl9aa7rD
5bAuzZAziXBW7WWKce2a4hGN804W9RHco5HIGLsQAdg4pLZvENXF1+JNHtBVXjjL
WJrCDKjnCyS1DqmJqijk9KIDM8gP6iLLeQ==
-----END CERTIFICATE-----

OpenSSL can be used to verify the code-signing certificate as well. Assuming that we've copied the signing CA's certificate text/data into ~/CA.crt, and copied the code signing certificate into ~/CodeSigner.crt.:

1
$ openssl verify -CAfile ~/CA.crt ~/CodeSigner.crt

Removing the signature from a file can be accomplished using this command:

1
$ openssl smime -inform DER -verify -in ~/Settings.mobileconfig -noverify -out ~/Unsigned.mobileconfig

证书请求和密钥生成

使用新的私钥生成CSR或证书签名请求 :

1
$ openssl req -sha256 -nodes -newkey rsa:2048 -keyout www.server.com.key -out www.server.com.csr

使用现有私钥生成新证书请求

1
openssl req -new -sha256 -key www.server.com.key -out www.server.com.csr

从现有证书开始生成证书请求

1
$ openssl x509 -x509toreq -in www.server.com.crt -out www.server.com.csr -signkey www.server.com.key

生成新的RSA私钥

1
$ openssl genrsa -out www.server.com.key 2048

使用密码加密私钥

1
$ openssl rsa -in www.server.com.key -out www.server.com.key -des3

从加密的私钥中删除密码

1
$ openssl rsa -in www.server.com.key -out www.server.com.key

生成新的ECC私钥

1
$ openssl ecparam -out server.key -name prime256v1 -genkey

创建自签名证书

1
$ openssl req -x509 -newkey rsa:2048 -nodes -keyout www.server.com.key -out www.server.com.crt -days 365

查看和验证证书

检查并显示证书申请(CSR)

1
$ openssl req -noout -text -verify -in www.server.com.csr

验证并显示密钥对

1
$ openssl rsa -noout -text -check -in www.server.com.key

查看PEM编码的证书

1
$ openssl x509 -noout -text -in www.server.com.crt

查看以PKCS#7格式编码的证书

1
$ openssl pkcs7 -print_certs -in www.server.com.p7b

查看以PKCS#12格式编码的证书和密钥对

1
$ openssl pkcs12 -info -in www.server.com.pfx

验证SSL连接并显示链中的所有证书

1
openssl s_client -connect www.server.com:443

控制证书,证书请求和私钥是否具有相同的公钥

1
2
3
$ openssl x509 -noout -modulus www.server.com.crt | openssl sha256
$ openssl req -noout -modulus www.server.com.csr | openssl sha256
$ openssl rsa -noout -modulus www.server.com.key | openssl sha256

检查证书及其中间证书链以获取Web服务器

1
$ openssl verify -purpose sslserver -CAfile certificatebundle.pem -verbose www.server.com.crt

证书转换

将具有私钥和证书的PKCS#12(.pfx .p12,通常用于Microsoft Windows)文件转换为PEM(通常在Linux上使用):

1
$ openssl pkcs12 -nodes -in www.server.com.pfx -out www.server.com.crt

将PEM转换为PKCS#12

1
$ openssl pkcs12 -export -in www.server.com.crt -inkey www.server.com.key -out www.server.com.pfx

将PKCS#7格式(.p7b .p7c)转换为PEM

1
$ openssl pkcs7 -print_certs -in www.server.com.p7b -out www.server.com.crt

将PEM格式转换为PKCS#7

1
$ openssl crl2pkcs7 -nocrl -certfile www.server.com.crt -out www.server.com.p7b

将DER(.crt .cer或.der)转换为PEM

1
$ openssl x509 -inform der -in certificate.cer -out certificate.pem

从PEM转换为DER格式

1
$ openssl x509 -outform der -in certificate.pem -out certificate.cer

cer转pem

1
2
$ openssl x509 -inform der -in businessgate.cer -out businessgate.pem
$ openssl x509 -inform der -in apple_pay.cer -out apple_pay_certificate.pem

pfx转pem

1
$ openssl pkcs12 -in test.pfx -nodes -out test.pem

.key 转换成 .pem

1
$ openssl rsa -in temp.key -out temp.pem

.crt 转换成 .pem

1
$ openssl x509 -in tmp.crt -out tmp.pem

crt格式证书转换cer

1
$ openssl x509 -in ca.crt -out server.cer -outform der

检查SSL连接

这将输出网站的证书,包括任何中间证书

1
$ openssl s_client -connect https://www.server.com:443

打印pkcs7的所有信息

1
$ openssl pkcs7 -inform DER -print_certs -in deviceInfo5.push -print

找到签名

1
$ openssl asn1parse -inform der -in deviceInfo5.push

生成RSA测试密钥和证书

1
$ openssl req -x509 -nodes -newkey rsa:1024 -keyout keyfile.key -out certificate.cer

使用密钥文件和证书对数据进行签名

1
2
3
4
5
$ openssl smime -sign -md sha1 \
-binary -nocerts -noattr \
-in data.txt -out data.txt.signed -outform der \
-inkey keyfile.key \
-signer certificate.cer

提取二进制RSA加密哈希

1
dd if=data.txt.signed of=signed-sha1.bin bs=1 skip=$[ 171 + 3 ] count=128

从证书中提取公钥

1
$ openssl x509 -inform pem -in certificate.cer -noout -pubkey > pubkey.pem

验证

1
$ openssl rsautl -verify -pubin -inkey pubkey.pem < signed-sha1.bin > verified.bin

签名

1
$ openssl smime -sign -nodetach -in unsigned-original.txt -out signed.p7 -outform pem -inkey keyfile.key -signer certificate.cer

验证

1
2
$ openssl smime -verify -in signed.p7 -inform pem
$ openssl smime -verify -in signed.p7 -inform pem -noverify

摘要

1
2
3
4
$ openssl smime -encrypt -in plain-original.txt -outform pem -out encrypted.p7 certificate.cer
$ openssl smime -decrypt -inform pem -in encrypted.p7 -inkey keyfile.key
$ openssl smime -sign -nodetach -in unsigned-original.txt -out signed.p7 -outform pem -inkey keyfile.key -signer certificate.cer
$ openssl smime -verify -in signed.p7 -inform pem

证书请求内容

证书1

标题 说明
C US
ST -
L -
O Apple Inc.
OU Apple Certification Authority
CN Apple Root CA
emailAddress -

证书2

标题 说明
C US
ST -
L -
O Apple Inc.
OU Apple Certification Authority
CN Apple iPhone Certification Authority
emailAddress -

证书3

标题 说明
C US
ST -
L -
O Apple Inc.
OU Apple iPhone
CN Apple iPhone Device CA
emailAddress -

参考

坚持原创技术分享,您的支持将鼓励我继续创作!
0%