抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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

评论吧



本站总访问量为 访客数为

鲁 ICP 备 20018157 号-1
Copyright 2021 - 2022 sizaif. All Rights Reserved