OpenSSL 教程
2022-07-30 09:41:34
sizaif
基础知识
.crt .pem .key
PEM - Privacy Enhanced Mail 以“-----BEGIN…”开头,“-----END…”结尾,内容是 BASE64
编码。
PEM格式是证书颁发机构颁发证书的最常见格式.PEM证书通常具有扩展名,例**.pem,.crt,.cer和.key**。它们是Base64编码的ASCII文件,包含“----- BEGIN CERTIFICATE -----”和“----- END CERTIFICATE -----”语句。服务器证书,中间证书和私钥都可以放入PEM格式。
openssl x509 -in certificate.pem -text -noout #pem
DER - Distinguished Encoding Rules
DER格式只是证书的二进制形式,而不是ASCII PEM格式。它有时会有**.der的文件扩展名,但它的文件扩展名通常是.cer所以判断DER .cer文件和PEM .cer文件之间区别的唯一方法是在文本编辑器中打开它并查找BEGIN / END语句。所有类型的证书和私钥都可以用DER格式编码。DER通常与Java平台一起使用,**Java 和 Windows 服务器偏向于使用这种编码格式。SSL转换器只能将证书转换为DER格式
openssl x509 -in certificate.der -inform der -text -noout #der
CRT 是 certificate 的三个字母,其实还是证书的意思。常见于 UNIX 系统,有可能是 PEM 编码,也有可能是 DER 编码,大多数应该是 PEM 编码,相信你已经知道怎么辨别。
CER 还是 certificate,还是证书。常见于 Windows 系统,同样的可能是 PEM 编码,也可能是 DER 编码,大多数应该是 DER 编码。
KEY 通常用来存放一个公钥或者私钥,并非 X.509 证书。编码同样的,可能是 PEM,也可能是 DER
openssl rsa -in mykey.key -text -noout # pem
openssl rsa -in mykey.key -text -noout -inform der # der
CSR Certificate,Signing Request,即证书签名请求。这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息)。在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。做过 iOS APP 的朋友都应该知道是,怎么向苹果申请开发者证书的吧。
openssl req -noout -text -in my.csr #
查看帮助
openssl help
genrsa
平时主要用来生成私钥,选择使用的算法、对称加密密码和私钥长度来生成私钥
openssl genrsa [args] [numbits]
# 【更多参数查看:openssl genrsa -help】
args1 对生成的私钥文件是否要使用加密算法进行对称加密:
-des : CBC模式的DES加密
-des3 : CBC模式的3DES加密
-aes128 : CBC模式的AES128加密
-aes192 : CBC模式的AES192加密
-aes256 : CBC模式的AES256加密
args2 对称加密密码
-passout passwords
其中passwords为对称加密(des、3des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
args3 输出文件
-out file : 输出证书私钥文件
[numbits]: 密钥长度,理解为私钥长度
生成一个2048位的RSA私钥,并用des3加密(密码为123456),保存为server.key文件
openssl genrsa -des3 -passout pass:123456 -out server.key 2048
// -des3 是第一个参数args1;
// -passout pass:123456 是第二个参数写法 args2
// -out server.key 第三个参数args3;
// 2048 最后一个[numbits]参数
req
req
的基本功能主要有两个:生成证书请求和生成自签名证书,当然这并不是其全部功能,但是这两个最为常见;
常见使用方法:
openssl req [args] outfile
主要参数:【更多参数查看:openssl req -help】
args1 是输入输入文件格式:-inform arg
-inform DER 使用输入文件格式为DER
-inform PEM 使用输入文件格式为PEM
args2 输出文件格式:-outform arg
-outform DER 使用输出文件格式为DER
-outform PEM 使用输出文件格式为PEM
args3 是待处理文件
-in inputfilepath
args4 待输出文件
-out outputfilepath
args5 用于签名待生成的请求证书的私钥文件的解密密码
-passin passwords
args6 用于签名待生成的请求证书的私钥文件
-key file
args7指定输入密钥的编码格式 -keyform arg
-keyform DER
-keyform NET
-keyform PEM
args8 生成新的证书请求
-new
args9输出一个X509格式的证书,签名证书时使用
-x509
args10使用X509签名证书的有效时间
-days // -days 3650 有效期10年
args11生成一个bits长度的RSA私钥文件,用于签发【生成私钥、并生成自签名证书】
-newkey rsa:bits
args12设置HASH算法-[digest]【生成私钥指定的hash摘要算法】
-md5
-sha1 // 高版本浏览器开始不信任这种算法
-md2
-mdc2
-md4
args13指定openssl配置文件,很多内容不容易通过参数配置,可以指定配置文件
-config filepath
args14 显示格式txt【用于查看证书、私钥信息】
-text
使用的案例:利用私钥生成证书请求csr
openssl req -new -key server.key -out server.csr
使用案例:利用私钥生成自签名证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
生成私钥
genrsa genkey这两种方法都创建RSA密钥,尽管格式不同。genrsa输出pkcs# 1格式的RSA密钥,而genpkey输出一个更通用的容器,可以管理不同类型的密钥(RSA、DSA、DH、EC等)
genrsa
openssl genrsa [args] [numbits]
args1 对生成的私钥文件是否要使用加密算法进行对称加密:
-des : CBC模式的DES加密
-des3 : CBC模式的3DES加密
-aes128 : CBC模式的AES128加密
-aes192 : CBC模式的AES192加密
-aes256 : CBC模式的AES256加密
args2 对称加密密码
-passout passwords
其中passwords为对称加密(des、3des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
args3 输出文件
-out file : 输出证书私钥文件
[numbits]: 密钥长度,理解为私钥长度
Usage: genrsa [options]
Valid options are:
-help Display this summary
-3 Use 3 for the E value
-F4 Use F4 (0x10001) for the E value
-f4 Use F4 (0x10001) for the E value
-out outfile Output the key to specified file
-rand val Load the file(s) into the random number generator
-writerand outfile Write random data to the specified file
-passout val Output file pass phrase source
-* Encrypt the output with any supported cipher
-engine val Use engine, possibly a hardware device
-primes +int Specify number of primes
例如生成一个2048位的RSA私钥,并用des3加密(密码为123456),保存为rsa_private_key.pem
文件
openssl genrsa -des3 -passout pass:123456 -out rsa_private_key.pem 2048
// -des3 是第一个参数args1;
// -passout pass:123456 是第二个参数写法 args2
// -out server.key 第三个参数args3;
// 2048 最后一个[numbits]参数
私钥转⾮加密
openssl rsa -in rsa_private_key.pem -passin pass:123456 -out rsa_private.key
私钥转加密
openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key
私钥PEM转DER
openssl rsa -in rsa_private.key -outform der-out rsa_aes_private.der
genkey
genpkey命令用于产生各种密钥(RSA、DSA、DH、EC等)的私钥
Usage: genpkey [options]
Valid options are:
-help Display this summary
-out outfile Output file
-outform PEM|DER output format (DER or PEM)
-pass val Output file pass phrase source
-paramfile infile Parameters file
-algorithm val The public key algorithm
-pkeyopt val Set the public key algorithm option as opt:value
-genparam Generate parameters, not key
-text Print the in text
-* Cipher to use to encrypt the key
-engine val Use engine, possibly a hardware device
Order of options may be important! See the documentation.
生成DSA算法的私钥
openssl genpkey -genparam -algorithm DSA -out dsap2048.pem -pkeyopt dsa_paramgen_bits:2048
生成RSA算法的私钥
openssl genpkey -algorithm RSA -out rsa2048_key.pem -pkeyopt rsa_keygen_bits:2048
生成公钥
Usage: rsa [options]
Valid options are:
-help Display this summary
-inform format Input format, one of DER PEM
-outform format Output format, one of DER PEM PVK
-in val Input file
-out outfile Output file
-pubin Expect a public key in input file
-pubout Output a public key
-passout val Output file pass phrase source
-passin val Input file pass phrase source
-RSAPublicKey_in Input is an RSAPublicKey
-RSAPublicKey_out Output is an RSAPublicKey
-noout Don't print key out
-text Print the key in text
-modulus Print the RSA key modulus
-check Verify key consistency
-* Any supported cipher
-pvk-strong Enable 'Strong' PVK encoding level (default)
-pvk-weak Enable 'Weak' PVK encoding level
-pvk-none Don't enforce PVK encoding
-engine val Use engine, possibly a hardware device
公钥由私钥运算生成
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成⾃签名证书
⽣成 RSA 私钥和⾃签名证书
openssl req -newkey rsa:2048-nodes -keyout rsa_private.key -x509 -days 365-out cert.crt
# req是证书请求的⼦命令,
# -newkey rsa:2048 -keyout private_key.pem 表⽰⽣成私钥(PKCS8格式),
# -nodes 表⽰私钥不加密,若不带参数将提⽰输⼊密码;
# -x509表⽰输出证书,
# -days365 为有效期,此后根据提⽰输⼊证书拥有者信息;
# 若执⾏⾃动输⼊,可使⽤-subj选项:
openssl req -newkey rsa:2048-nodes -keyout rsa_private.key -x509 -days 365-out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/emailAddress=yy@vivo.com"
使⽤已有RSA 私钥⽣成⾃签名证书
openssl req -key rsa_private.key -new -x509 -days 365 -out cert.crt
# -new 指⽣成证书请求 加上-x509 表⽰直接输出证书
# -key 指定私钥⽂件,其余选项与上述命令相同
⽣成签名请求及CA 签名
使⽤ RSA私钥⽣成 CSR 签名请求
openssl genrsa -aes256 -passout pass:111111 -out server.key 2048
openssl req -new -key server.key -out server.csr
此后输⼊密码、server证书信息完成,也可以命令⾏指定各类参数
openssl req -new-key server.key -passin pass:111111-out server.csr -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/emailAddress=yy@vivo.com"
此时⽣成的 csr签名请求⽂件可提交⾄ CA进⾏签发
使⽤ CA 证书及CA密钥 对请求签发证书进⾏签发,⽣成 x509证书
openssl x509 -req -days 3650-in server.csr -CA ca.crt -CAkey ca.key -passin pass:111111-CAcreateserial -out server.crt
其中 CAxxx 选项⽤于指定CA 参数输⼊
s_client 与 s_server 相互通信
TODO:
Code
#!/bin/bash
# 生成DES算法私钥 并生成自签名证书
for len in 512 1024 2048 3072
do
openssl genpkey -genparam -algorithm DSA -out dsap${len}.pem -pkeyopt dsa_paramgen_bits:${len}
openssl genpkey -paramfile dsap${len}.pem -out dsa${len}_key.pem
openssl req -key dsa${len}_key.pem -new -x509 -days 2000 -out dsa${len}_cert.pem -subj "/CN=tls-attacker.com"
done
# 生成RSA算法私钥 并生成自签名证书
for len in 512 1024 2048 4096
do
openssl genpkey -algorithm RSA -out rsa${len}_key.pem -pkeyopt rsa_keygen_bits:${len}
openssl req -key rsa${len}_key.pem -new -x509 -days 2000 -out rsa${len}_cert.pem -subj "/CN=tls-attacker.com"
done
# 生成EC椭圆算法的私钥 并生成自签名证书
for named_curve in secp160k1 secp160r1 secp160r2 secp192k1 secp224k1 secp224r1 secp256k1 secp384r1 secp521r1 sect163k1 sect163r1 sect163r2 sect193r1 sect193r2 sect233k1 sect233r1 sect239k1 sect283k1 sect283r1 sect409k1 sect409r1 sect571k1 sect571r1
do
openssl ecparam -name ${named_curve} -genkey -out ec_${named_curve}_key.pem
openssl req -key ec_${named_curve}_key.pem -new -x509 -days 2000 -out ec_${named_curve}_cert.pem -subj "/CN=tls-attacker.com"
done
#
openssl req -x509 -new -nodes -extensions v3_ca -key rsa2048_key.pem -days 2000 -out rsa_ca.pem -sha256 -subj "/CN=TLS-Attacker CA"
openssl req -x509 -new -nodes -extensions v3_ca -key dsa1024_key.pem -days 2000 -out dsa_ca.pem -sha256 -subj "/CN=TLS-Attacker CA"
# 生成 dh参数 dhparam.pem
openssl dhparam -out dhparam.pem 1024
# 根据dh参数 生成 dh私钥
openssl genpkey -paramfile dhparam.pem -out dhkey.pem
# pkey命令用于处理公钥或私钥,
# 根据dh私钥生成dh公钥
openssl pkey -in dhkey.pem -pubout -out dhpubkey.pem
# 使用 rsa2048_key.pem 生成自签名证书 rsa.csr
openssl req -new -key rsa2048_key.pem -out rsa.csr -subj "/CN=tls-attacker.com"
openssl x509 -req -in rsa.csr -CAkey rsa2048_key.pem -CA rsa_ca.pem -force_pubkey dhpubkey.pem -outrsa_dhcert.pem -CAcreateserial
openssl req -new -key dsa1024_key.pem -out dsa.csr -subj "/CN=tls-attacker.com"
openssl x509 -req -in dsa.csr -CAkey dsa1024_key.pem -CA dsa_ca.pem -force_pubkey dhpubkey.pem -out
dsa_dhcert.pem -CAcreateserial
for named_curve in secp160k1 secp160r1 secp160r2 secp192k1 secp224k1 secp224r1 secp256k1 secp384r1 secp521r1 sect163k1 sect163r1 sect163r2 sect193r1 sect193r2 sect233k1 sect233r1 sect239k1 sect283k1 sect283r1 sect409k1 sect409r1 sect571k1 sect571r1
do
openssl ecparam -out ec_param_${named_curve}.pem -name ${named_curve}
openssl genpkey -paramfile ec_param_${named_curve}.pem -out ec_rsa_private_key_${named_curve}.pem
openssl pkey -in ec_rsa_private_key_${named_curve}.pem -pubout -out ec_rsa_public_key_${named_curve}.pem
openssl x509 -req -in rsa.csr -CAkey rsa2048_key.pem -CA rsa_ca.pem -force_pubkey ec_rsa_public_key_${named_curve}.pem -out ec_rsa_cert_${named_curve}.pem -CAcreateserial
done