AutoSar之对称加密和非对称加密

一、RSA

非对称加密算法

  • 虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。

  • 非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
  • 比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人:银行才能对你的消息解密。
  • 与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。

常见的非对称加密算法:

  • RSA:RSA 是目前应用最广泛的数字加密和签名技术,比如国内的支付宝就是通过RSA算法来进行签名验证。它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等,理论上秘钥越长越难于破解。不过目前看 2048 位的秘钥已经足够安全了,支付宝的官方文档上推荐也是2048位。
  • DSA:既 Digital Signature Algorithm,数字签名算法,和 RSA 不同的是,DSA 仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快。
  • ECDSA:相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障,据称256位的ECC秘钥的安全性等同于3072位的RSA秘钥,和普通DSA相比,ECDSA在计算秘钥的过程中,部分因子使用了椭圆曲线算法。

公开密钥与私有密钥是一对

  • 如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密
  • 如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
  • 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

二、AES

对称加密算法

  • 最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法。
  • 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

优点:

  • 对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。
  • 密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

缺点:

  • 对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。
  • 在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

三、客户端加密过程

步骤:

1.客户端:随机产生AES的密钥
2.客户端:对身份证信息(重要信息)进行AES加密
3.客户端:通过使用RSA对AES密钥进行公钥加密
4.服务端:对加密后的AES密钥进行RSA私钥解密,拿到密钥原文;
5.服务端:对加密后的重要信息进行AES解密,拿到原始内容。

eg:

  1. 客户端传输重要信息给服务端,服务端返回的信息不需加密的情况

客户端传输重要信息给服务端,服务端返回的信息不需加密,例如绑定银行卡的时候,需要传递用户的银行卡号,手机号等重要信息,客户端这边就需要对这些重要信息进行加密,使用RSA公钥加密,服务端使用RSA解密,然后返回一些普通信息,比如状态码code,提示信息msg,提示操作是成功还是失败。这种场景下,仅仅使用RSA加密是可以的。

2.客户端传输重要信息给服务端,服务端返回的信息需加密的情况

客户端传输重要信息给服务端,服务端返回的信息需加密,例如客户端登录的时候,传递用户名和密码等资料,需要进行加密,服务端验证登录信息后,返回令牌token需要进行加密,客户端解密后保存。此时就需要结合这两种算法了。

三、RSA签名的PSS模式

PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。

  • 目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography Standards)是一种能够自我从签名,而PSS无法从签名中恢恢复原来的签名。
  • openssl-1.1.x以后默认使用更安全的PSS的RSA签名模式。

RSA算法比较慢,一般private key用来进行签名和public key用来进行验证

RSA加密算法引入padding机制的原因:

  • 因RSA算法沒有加入乱数,当出现重复性的原始资料,攻击者会通过相同加密密文而猜测出原文,因此导入padding的机制來加強安全性。
  • TLS流程中的密钥材料若不进行填充而直接加密,那么显然相同的key,会得到相同的密文。这种在语义上来说,是不安全的。

四、RSA加密、解密、签名、验签实际操作

说明:测试RSA加密解密(encrypt、decrypt)和签名验证(sign,verify)

文件:

  • rsa_private.key:私钥
  • rsa_public.key:公钥
  • data: 明文
  • endata: 密文
  • sign: 签名
  • de_sign: 解签名

默认情况下,openssl 输出格式为 PKCS#1-PEM(RSA加密的两种算法分别是RSAES-PKCS-v1_5 and RSAES-OAEP。)
1.生成RSA私钥(无加密)

openssl genrsa -out rsa_private.key 2048

生成RSA公钥

openssl rsa -in rsa_private.key -pubout -out rsa_public.key

2.原始数据

 echo "wangji is a goog boy" > ./data

3.加密和解密
用公钥进行加密:

openssl rsautl -pubin -inkey ./rsa_public.key -in ./data -encrypt -out ./endata

用户私钥进行解密:

wangji@script-wang:/tmp/test$ openssl rsautl -inkey ./rsa_private.key -in ./endata -decrypt
wangji is a goog boy

openssl加解密大文件见:怎样使用openssl加解密大文件

4.签名和验证(sign, verify)

签名过程包括hash和加密。hash函数一般使用sha1。这样输入明文,直接生成sign签名。

如果是私钥签名所做的事就是先hash再加密,选择一种hash算法把原始消息计算后成ASN1格式,再把这个资料用private key加密后送出,资料本身不加密,这种方式主要是用來验证资料来源是否可信任的,送出时把原始资料和签名一起送出。

私钥签名,输出格式为ASN1格式

openssl sha1 -sign ./rsa_private.key  ./data > ./sign

公钥验签,使用ASN1解开签名文件de_sign

wangji@script-wang:/tmp/test$ openssl rsautl -pubin -inkey ./rsa_public.key -in sign -verify -out ./de_sign
wangji@script-wang:/tmp/test$ openssl asn1parse -inform der -in ./de_sign
    0:d=0  hl=2 l=  33 cons: SEQUENCE
    2:d=1  hl=2 l=   9 cons: SEQUENCE
    4:d=2  hl=2 l=   5 prim: OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim: NULL
   13:d=1  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:2E40F194522192093EE96F72A1A4EFB6DEC80C7C

用public key解开签名文件sign,使用ASN1解开签名

wangji@script-wang:/tmp/test$ openssl rsautl -pubin -inkey ./rsa_public.key -in ./sign -verify -asn1parse
    0:d=0  hl=2 l=  33 cons: SEQUENCE
    2:d=1  hl=2 l=   9 cons:  SEQUENCE
    4:d=2  hl=2 l=   5 prim:   OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim:   NULL
   13:d=1  hl=2 l=  20 prim:  OCTET STRING
      0000 - 2e 40 f1 94 52 21 92 09-3e e9 6f 72 a1 a4 ef b6   .@..R!..>.or....
      0010 - de c8 0c 7c                                       ...|

用public key解开签名文件sign,并且保留padding:

wangji@script-wang:/tmp/test$ openssl rsautl -pubin -inkey ./rsa_public.key -in ./sign  -raw -hexdump
...
01d0 - ff ff ff ff ff ff ff ff-ff ff ff ff 00 30 21 30   .............0!0
01e0 - 09 06 05 2b 0e 03 02 1a-05 00 04 14 2e 40 f1 94   ...+.........@..
01f0 - 52 21 92 09 3e e9 6f 72-a1 a4 ef b6 de c8 0c 7c   R!..>.or.......|

和本地sha1对比

wangji@script-wang:/tmp/test$ openssl sha1 ./data
SHA1(./data)= 2e40f194522192093ee96f72a1a4efb6dec80c7c

如果两者hash结果是一样,那么确定签名送过来是正确的。

五、openssl 工具

1. openssl rsautl工具支持的填充模式

openssl rsautl --help,可以看到支持的padding模式有

 -ssl                     Use SSL v2 padding
 -raw                     Use no padding
 -pkcs                    Use PKCS#1 v1.5 padding (default)
 -oaep                    Use PKCS#1 OAEP

2.PSS填充模式的特点

PSS是RSA的填充模式中的一种。

完整的RSA的填充模式包括:

RSA_SSLV23_PADDING(SSLv23填充)
RSA_NO_PADDING(不填充)
RSA_PKCS1_OAEP_PADDING (RSAES-OAEP填充,强制使用SHA1,加密使用)
RSA_X931_PADDING(X9.31填充,签名使用)
RSA_PKCS1_PSS_PADDING(RSASSA-PSS填充,签名使用)
RSA_PKCS1_PADDING(RSAES-PKCS1-v1_5/RSASSA-PKCS1-v1_5填充,签名可使用)

其中主流的填充模式是PKCS1和PSS模式
PSS的优缺点如下:

  • PKCS#1 v1.5比较简易实现,但是缺少security proof。
  • PSS更安全,所以新版的openssl-1.1.x优先使用PSS进行私钥签名(具体在ssl握手的server key exchange阶段)

3.openssl 命令参考

1. openssl list-standard-commands(标准命令)
    1) asn1parse: asn1parse用于解释用ANS.1语法书写的语句(ASN一般用于定义语法的构成) 
    2) ca: ca用于CA的管理 
    openssl ca [options]:
        2.1) -selfsign
        使用对证书请求进行签名的密钥对来签发证书。即"自签名",这种情况发生在生成证书的客户端、签发证书的CA都是同一台机器(也是我们大多数实验中的情况),我们可以使用同一个
密钥对来进行"自签名"
        2.2) -in file
        需要进行处理的PEM格式的证书
        2.3) -out file
        处理结束后输出的证书文件
        2.4) -cert file
        用于签发的根CA证书
        2.5) -days arg 
        指定签发的证书的有效时间
        2.6) -keyfile arg   
        CA的私钥证书文件
        2.7) -keyform arg
        CA的根私钥证书文件格式:
            2.7.1) PEM
            2.7.2) ENGINE 
        2.8) -key arg   
        CA的根私钥证书文件的解密密码(如果加密了的话)
        2.9) -config file    
        配置文件
    example1: 利用CA证书签署请求证书
    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key  

    3) req: X.509证书签发请求(CSR)管理
    openssl req [options] <infile >outfile
        3.1) -inform arg
        输入文件格式
            3.1.1) DER
            3.1.2) PEM
        3.2) -outform arg   
        输出文件格式
            3.2.1) DER
            3.2.2) PEM
        3.3) -in arg
        待处理文件
        3.4) -out arg
        待输出文件
        3.5) -passin        
        用于签名待生成的请求证书的私钥文件的解密密码
        3.6) -key file
        用于签名待生成的请求证书的私钥文件
        3.7) -keyform arg  
            3.7.1) DER
            3.7.2) NET
            3.7.3) PEM
        3.8) -new
        新的请求
        3.9) -x509          
        输出一个X509格式的证书 
        3.10) -days
        X509证书的有效时间  
        3.11) -newkey rsa:bits 
        生成一个bits长度的RSA私钥文件,用于签发  
        3.12) -[digest]
        HASH算法
            3.12.1) md5
            3.12.2) sha1
            3.12.3) md2
            3.12.4) mdc2
            3.12.5) md4
        3.13) -config file   
        指定openssl配置文件
        3.14) -text: text显示格式
    example1: 利用CA的RSA密钥创建一个自签署的CA证书(X.509结构) 
    openssl req -new -x509 -days 3650 -key server.key -out ca.crt 
    example2: 用server.key生成证书签署请求CSR(这个CSR用于之外发送待CA中心等待签发)
    openssl req -new -key server.key -out server.csr
    example3: 查看CSR的细节
    openssl req -noout -text -in server.csr

    4) genrsa: 生成RSA参数
    openssl genrsa [args] [numbits]
        [args]
        4.1) 对生成的私钥文件是否要使用加密算法进行对称加密:
            4.1.1) -des: CBC模式的DES加密
            4.1.2) -des3: CBC模式的DES加密
            4.1.3) -aes128: CBC模式的AES128加密
            4.1.4) -aes192: CBC模式的AES192加密
            4.1.5) -aes256: CBC模式的AES256加密
        4.2) -passout arg: arg为对称加密(des、des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
        4.3) -out file: 输出证书私钥文件
        [numbits]: 密钥长度
    example: 生成一个1024位的RSA私钥,并用DES加密(密码为1111),保存为server.key文件
    openssl genrsa -out server.key -passout pass:1111 -des3 1024 

    5) rsa: RSA数据管理
    openssl rsa [options] <infile >outfile
        5.1) -inform arg
        输入密钥文件格式:
            5.1.1) DER(ASN1)
            5.1.2) NET
            5.1.3) PEM(base64编码格式)
         5.2) -outform arg
         输出密钥文件格式
            5.2.1) DER
            5.2.2) NET
            5.2.3) PEM
        5.3) -in arg
        待处理密钥文件 
        5.4) -passin arg
        输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
        5.5) -out arg
        待输出密钥文件
        5.6) -passout arg  
        如果希望输出的密钥文件继续使用加密算法的话则指定密码 
        5.7) -des: CBC模式的DES加密
        5.8) -des3: CBC模式的DES加密
        5.9) -aes128: CBC模式的AES128加密
        5.10) -aes192: CBC模式的AES192加密
        5.11) -aes256: CBC模式的AES256加密
        5.12) -text: 以text形式打印密钥key数据 
        5.13) -noout: 不打印密钥key数据 
        5.14) -pubin: 检查待处理文件是否为公钥文件
        5.15) -pubout: 输出公钥文件
    example1: 对私钥文件进行解密
    openssl rsa -in server.key -passin pass:111 -out server_nopass.key
    example:2: 利用私钥文件生成对应的公钥文件
    openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key

    6) x509:
    本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等X.509证书的管理工作
    openssl x509 [args]    
        6.1) -inform arg
        待处理X509证书文件格式
            6.1.1) DER
            6.1.2) NET
            6.1.3) PEM
        6.2) -outform arg   
        待输出X509证书文件格式
            6.2.1) DER
            6.2.2) NET
            6.2.3) PEM
        6.3) -in arg 
        待处理X509证书文件
        6.4) -out arg       
        待输出X509证书文件
        6.5) -req            
        表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发 
        6.6) -days arg       
        表明将要签发的证书的有效时间 
        6.7) -CA arg 
        指定用于签发请求证书的根CA证书 
        6.8) -CAform arg     
        根CA证书格式(默认是PEM) 
        6.9) -CAkey arg      
        指定用于签发请求证书的CA私钥证书文件,如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有
        6.10) -CAkeyform arg  
        指定根CA私钥证书文件格式(默认为PEM格式)
        6.11) -CAserial arg   
        指定序列号文件(serial number file)
        6.12) -CAcreateserial 
        如果序列号文件(serial number file)没有指定,则自动创建它     
    example1: 转换DER证书为PEM格式
    openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
    example2: 使用根CA证书对"请求签发证书"进行签发,生成x509格式证书
    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    example3: 打印出证书的内容
    openssl x509 -in server.crt -noout -text 

    7) crl: crl是用于管理CRL列表 
    openssl crl [args]
        7.1) -inform arg
        输入文件的格式
            7.1.1) DER(DER编码的CRL对象)
            7.1.2) PEM(默认的格式)(base64编码的CRL对象)
        7.2) -outform arg
        指定文件的输出格式 
            7.2.1) DER(DER编码的CRL对象)
            7.2.2) PEM(默认的格式)(base64编码的CRL对象)
        7.3) -text: 
        以文本格式来打印CRL信息值。
        7.4) -in filename
        指定的输入文件名。默认为标准输入。
        7.5) -out filename
        指定的输出文件名。默认为标准输出。
        7.6) -hash
        输出颁发者信息值的哈希值。这一项可用于在文件中根据颁发者信息值的哈希值来查询CRL对象。
        7.7) -fingerprint
        打印CRL对象的标识。
        7.8) -issuer
        输出颁发者的信息值。
        7.9) -lastupdate
        输出上一次更新的时间。
        7.10) -nextupdate
        打印出下一次更新的时间。 
        7.11) -CAfile file
        指定CA文件,用来验证该CRL对象是否合法。 
        7.12) -verify
        是否验证证书。        
    example1: 输出CRL文件,包括(颁发者信息HASH值、上一次更新的时间、下一次更新的时间)
    openssl crl -in crl.crl -text -issuer -hash -lastupdate –nextupdate 
    example2: 将PEM格式的CRL文件转换为DER格式
    openssl crl -in crl.pem -outform DER -out crl.der  

    8) crl2pkcs7: 用于CRL和PKCS#7之间的转换 
    openssl crl2pkcs7 [options] <infile >outfile
    转换pem到spc
    openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
    https://www.openssl.org/docs/apps/crl2pkcs7.html

    9) pkcs12: PKCS#12数据的管理
    pkcs12文件工具,能生成和分析pkcs12文件。PKCS#12文件可以被用于多个项目,例如包含Netscape、 MSIE 和 MS Outlook
    openssl pkcs12 [options] 
    http://blog.csdn.net/as3luyuan123/article/details/16105475
    https://www.openssl.org/docs/apps/pkcs12.html

    10) pkcs7: PCKS#7数据的管理 
    用于处理DER或者PEM格式的pkcs#7文件
    openssl pkcs7 [options] <infile >outfile
    http://blog.csdn.net/as3luyuan123/article/details/16105407
    https://www.openssl.org/docs/apps/pkcs7.html
 
2. openssl list-message-digest-commands(消息摘要命令)
    1) dgst: dgst用于计算消息摘要 
    openssl dgst [args]
        1.1) -hex           
        以16进制形式输出摘要
        1.2) -binary        
        以二进制形式输出摘要
        1.3) -sign file    
        以私钥文件对生成的摘要进行签名
        1.4) -verify file    
        使用公钥文件对私钥签名过的摘要文件进行验证 
        1.5) -prverify file  
        以私钥文件对公钥签名过的摘要文件进行验证
        verify a signature using private key in file
        1.6) 加密处理
            1.6.1) -md5: MD5 
            1.6.2) -md4: MD4         
            1.6.3) -sha1: SHA1 
            1.6.4) -ripemd160
    example1: 用SHA1算法计算文件file.txt的哈西值,输出到stdout
    openssl dgst -sha1 file.txt
    example2: 用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem
    openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

    2) sha1: 用于进行RSA处理
    openssl sha1 [args] 
        2.1) -sign file
        用于RSA算法的私钥文件 
        2.2) -out file
        输出文件爱你
        2.3) -hex   
        以16进制形式输出
        2.4) -binary
        以二进制形式输出  
    example1: 用SHA1算法计算文件file.txt的HASH值,输出到文件digest.txt
    openssl sha1 -out digest.txt file.txt
    example2: 用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem
    openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

3. openssl list-cipher-commands (Cipher命令的列表)
    1) aes-128-cbc
    2) aes-128-ecb
    3) aes-192-cbc
    4) aes-192-ecb
    5) aes-256-cbc
    6) aes-256-ecb
    7) base64
    8) bf
    9) bf-cbc
    10) bf-cfb
    11) bf-ecb
    12) bf-ofb
    13) cast
    14) cast-cbc
    15) cast5-cbc
    16) cast5-cfb
    17) cast5-ecb
    18) cast5-ofb
    19) des
    20) des-cbc
    21) des-cfb
    22) des-ecb
    23) des-ede
    24) des-ede-cbc
    25) des-ede-cfb
    26) des-ede-ofb
    27) des-ede3
    28) des-ede3-cbc
    29) des-ede3-cfb
    30) des-ede3-ofb
    31) des-ofb
    32) des3
    33) desx
    34) rc2
    35) rc2-40-cbc
    36) rc2-64-cbc
    37) rc2-cbc
    38) rc2-cfb
    39) rc2-ecb
    40) rc2-ofb
    41) rc4
    42) rc4-40

六、SSL证书格式

1 DER,CER格式

.DER .CER,文件是二进制格式,只保存证书,不保存私钥。

  • 该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。

OpenSSL 查看

openssl x509 -in certificate.der -inform der -text -noout

转换为 PEM:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

2 PEM

.PEM,一般是文本格式,可保存证书,可保存私钥。

Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN… 开头,以 -----END… 结尾。

  • 中间的内容是 BASE64 编码。
  • 这种格式可以保存证书和私钥,有时我们也把PEM 格式的私钥的后缀改为 .key 以区别证书与私钥。具体你可以看文件的内容。
openssl x509 -in certificate.pem -text -noout

转换为 DER:

openssl x509 -in certificate.pem -outform der -out cert.der

3 CRT

.CRT,可以是二进制格式,可以是文本格式,与 .DER 格式相同,不保存私钥。

Certificate 的简称,有可能是 PEM 编码格式,也有可能是 DER 编码格式。如何查看请参考前两种格式。

4 PFX

.PFX .P12,二进制格式,同时包含证书和私钥,一般有密码保护。

Predecessor of PKCS#12,这种格式是二进制格式,且证书和私钥存在一个 PFX 文件中

  • 一般用于 Windows 上的 IIS 服务器。
  • 该格式的文件一般会有一个密码用于保证私钥的安全。

OpenSSL 查看:

openssl pkcs12 -in for-iis.pfx

转换为 PEM:

openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

5 JKS

.JKS,二进制格式,同时包含证书和私钥,一般有密码保护。

Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。

七、RSA密钥操作

默认情况下,openssl 输出格式为 PKCS#1-PEM

1.生成RSA密钥对

默认情况下,openssl 输出格式为 PKCS#1-PEM

生成RSA私钥(无加密)

openssl genrsa -out rsa_private.key 2048

生成RSA公钥

openssl rsa -in rsa_private.key -pubout -out rsa_public.key

2.使用AES256加密的RSA密钥对

生成RSA私钥(使用aes256加密)

  • 其中 passout 代替shell 进行密码输入,否则会提示输入密码;
openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048

此时若生成公钥,需要提供密码

  • 其中 passout 代替shell 进行密码输入,否则会提示输入密码;
openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key

八、转换命令

1.加密和非加密私钥转换

加密的私钥转非加密

 openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key

非加密的私钥转加密

openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key

2. 私钥PEM转DER

私钥PEM转DER

  • -inform和-outform 参数制定输入输出格式,由der转pem格式同理
openssl rsa -in rsa_private.key -outform der -out rsa_aes_private.der

查看私钥明细

openssl rsa -in rsa_private.key -noout -text

查看公钥明细

 openssl rsa -in rsa_public.key -noout -text -pubin

3. 私钥PKCS#1转PKCS#8

私钥PKCS#1转PKCS#8

openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key
  • 其中-passout指定了密码,输出的pkcs8格式密钥为加密形式,pkcs8默认采用des3 加密算法,内容如下:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Base64 Encoded Data
-----END ENCRYPTED PRIVATE KEY-----
  • 使用-nocrypt参数可以输出无加密的pkcs8密钥,如下:
-----BEGIN PRIVATE KEY-----
Base64 Encoded Data
-----END PRIVATE KEY-----

九、生成CA自签名证书

1.生成 RSA 私钥和自签名证书

  • req是证书请求的子命令,
  • -newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8格式),
  • -nodes 表示私钥不加密,若不带该参数将提示输入密码;
  • -x509表示输出证书,-days365 为有效期,此后根据提示输入证书拥有者信息;
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt

若执行自动输入,可使用-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/[email protected]"

使用 已有RSA 私钥生成自签名证书

  • -new 指生成证书请求,加上-x509 表示直接输出证书,-key 指定私钥文件,其余选项与上述命令相同
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt

或者
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt  -subj  "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
wangji@script-wang:/tmp/test4$ file -b *
PEM certificate
ASCII text

或者

wangji@script-wang:/tmp/test4$ openssl genrsa -out ca.key 1024
wangji@script-wang:/tmp/test4$ openssl req -new -x509 -days 365 -key ca.key -out ca.cr -subj  "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"

wangji@script-wang:/tmp/test4$ ls
ca.cr  ca.key
wangji@script-wang:/tmp/test4$ file -b *
PEM certificate
PEM RSA private key

十、生成CA签名请求及CA 签名

使用 RSA私钥生成 CSR 签名请求

openssl genrsa -aes256 -passout pass:111111 -out server.key 2048

此后输入密码、server证书信息完成,也可以命令行指定各类参数

openssl req -new -key server.key -out server.csr

或者
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/[email protected]"

此时生成的 csr签名请求文件可提交至 CA进行签发

查看CSR 的细节

cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
Base64EncodedData
-----END CERTIFICATE REQUEST-----

wangji@script-wang:/tmp/test4$ file -b server.*
PEM certificate request
PEM RSA private key

使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书

  • 其中 CAxxx 选项用于指定CA 参数输入
//生成RSA私有密钥
wangji@script-wang:/tmp/test4$ openssl genrsa -out rsa_private.key 2048

//使用 已有RSA 私钥生成自CA签名证书 cert.crt
wangji@script-wang:/tmp/test4$ openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"

//使用 已有的RSA私钥生成 CSR 签名请求
wangji@script-wang:/tmp/test4$ openssl req -new -key ./rsa_private.key  -passin pass:111111 -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"

//使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书
wangji@script-wang:/tmp/test4$ openssl x509 -req -days 3650 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt

wangji@script-wang:/tmp/test4$ ll
total 428
drwxr-xr-x    2 wangji wangji   4096 May 23 15:53 ./
drwxrwxrwx 2569 root   root   409600 May 23 15:13 ../
-rw-r--r--    1 wangji wangji   1375 May 23 15:48 cert.crt
-rw-------    1 wangji wangji   1679 May 23 15:48 rsa_private.key
-rw-r--r--    1 wangji wangji   1253 May 23 15:53 server.crt
-rw-r--r--    1 wangji wangji   1021 May 23 15:52 server.csr
wangji@script-wang:/tmp/test4$ file -b *
PEM certificate
ASCII text
PEM RSA private key
PEM certificate
PEM certificate request

十一、证书查看及转换

查看证书细节

openssl x509 -in cert.crt -noout -text

转换证书编码格式

openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem

合成 pkcs#12 证书(含私钥)
将 pem 证书和私钥转 pkcs#12 证书

openssl pkcs12 -export -in server.crt -inkey rsa_private.key -passin pass:111111 -password pass:111111 -out server.p12
  • 其中-export指导出pkcs#12 证书,
  • -inkey 指定了私钥文件,
  • -passin 为私钥(文件)密码(nodes为无加密),
  • -password 指定 p12文件的密码(导入导出)

将 pem 证书和私钥/CA 证书 合成pkcs#12 证书

wangji@script-wang:/tmp/test4$ openssl pkcs12 -export -in server.crt -inkey rsa_private.key -passin pass:111111 -chain -CAfile server.crt -password pass:111111 -out server-all.p12

其中:

  • -chain指示同时添加证书链,
  • -CAfile 指定了CA证书,
  • 导出的p12文件将包含多个证书。
  • (其他选项:-name可用于指定server证书别名;-caname用于指定ca证书别名)

pcks#12 提取PEM文件(含私钥)

openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -out out/server.pem
  • 其中-password 指定 p12文件的密码(导入导出),
  • -passout指输出私钥的加密密码(nodes为无加密)
  • 导出的文件为pem格式,同时包含证书和私钥(pkcs#8):

仅提取私钥

wangji@script-wang:/tmp/test4$  openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out out/key.pem

仅提取证书(所有证书)

wangji@script-wang:/tmp/test4$ openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out out/key.pem

仅提取ca证书

openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out out/cacert.pem 

仅提取server证书

openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out out/cert.pem 

十二、查看证书信息

查看证书中的公钥信息:
openssl x509 -in ./cert.crt -pubkey

查看证书信息:
wangji@script-wang:/tmp/test4$ openssl x509 -in server.crt -noout -text

查看key信息:
wangji@script-wang:/tmp/test4$ openssl rsa -noout -text -in rsa_private.key

查看csr信息:
wangji@script-wang:/tmp/test4$ openssl req -noout -text -in server.csr

验证公钥和私钥是否匹配
wangji@script-wang:/tmp/test4$ diff -eq <(openssl x509 -pubkey -noout -in cert.crt) <(openssl rsa -pubout -in ./rsa_private.key)
writing RSA key
wangji@script-wang:/tmp/test4$ diff -eq <(openssl x509 -pubkey -noout -in server.crt) <(openssl rsa -pubout -in ./rsa_private.key)
writing RSA key

其他命令:

链接远程服务器:openssl s_client -connect www.google.com.hk:443

模拟https服务器
openssl s_server -accept 10086 -cert server.crt -key rsa_private.key -www

模拟client
openssl s_client -host 127.0.0.1  -port 10086 -showcerts -msg -state -tls1_2  -cert cert.crt  -key rsa_private.key  -CAfile server.crt


不同格式的证书转换
PEM转换为DER: openssl x509 -outform der -in myserver.crt -out myserver.der
DER转换为PEM:openssl x509 -inform der -in myserver.cer -out myserver.pem
PEM转换为PKCS:openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
PKCS转换为PEM: openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes

参考:
RSA AES-对称加密和非对称加密
常见非对称加密算法
RSA签名的PSS模式
使用 openssl 生成证书
SSL 证书格式普及,PEM、CER、JKS、PKCS12
6.openssl解析证书常用命令;
【一】生成CA根证书、公钥、私钥指令(数字证书)
一文搞懂X509证书PEM DER CRT CER的区别
6.openssl解析证书常用命令

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/130822366