zoukankan      html  css  js  c++  java
  • 【转】密钥、证书生成和管理总结

    来源:https://www.cnblogs.com/pixy/p/4722381.html

    目录

    1. openSSH的ssh-keygen工具
    2. openSSL
    3. keytool
    4. GPG
    5. PGP
    6. Putty
    7. 其他未整理内容

      

    一、OpenSSH和ssh-keygen 

    OpenSSH是SSH协议的开源版本(SSH:Secure SHell)。使用SSH透过计算机网络实现加密通讯,可以进行远程控制,在计算机之间传送文件等等。SSH传输的数据都进行了加密,比telnet,rcp,ftp,rlogin,rsh等以明文传输密码的工具更安全。

    OpenSSH提供了实现SSH协议的很多工具。其中ssh-keygen用于生成,管理和转换用于认证的密钥和证书。

    ssh-keygen

    • -b <bits>       密钥长度,默认为2048
    • -t <type>       密钥类型, rsa|des... (默认类型为rsa)
      • SSH1:   RSA
      • SSH2:   RSA, DSA,  ECDSA
    • -N <password>   新密码
    • -f <file>        指定密钥文件,创建时会同时生成一个.pub结尾的公钥文件。
    • -C <comment>
    • -c            修改公钥或私钥文件中的注释
    • -p            修改私钥文件密码
    • -P <password>   旧密码
    • -e            导出为其它格式的密钥文件,可以转换密钥类型
    • -i            从其他格式的密钥文件导入,可以转换密钥类型
    • -m  <PEM|PKCS8|RFC4716>   与-e,-i配合使用,指明导出或导入的密钥文件格式
    • -y        读入密钥并显示公钥

    二、OpenSSL

    OpenSSL 是一个强大的安全套接字层密码库,包括了加密算法,常用密钥和证书管理,SSL协议等功能。OpenSSL提供的命令非常多,这里只简单列出OpenSSL生成密钥和证书的一些操作(Window需要以管理员身份运行cmd)。

    v1.0.1+密钥默认采用PKCS#8格式(之前版本为PEM)。

    查看openSSL版本

    openssl version
    openssl version -a

    enc  对称加密 

    1.密钥生成(genrsa,genpkey,req在证书请求时同时生成密钥, gendh, gendsa)

    (1) openssl genrsa [options] [bits_num]    

    • -out <file>   指定输出文件,不指定时在终端显示密钥内容
    • -passout pass:<password>   设置私钥文件密码
    • -f4    使用F4(0x10001)作为公钥的E参数(默认)
    • -3     使用3作为公钥的E参数
    • -des , -des3, -aes128, -aes192, -aes256   指定加密算法(默认不加密)

    默认生产的密钥格式为PEM。openssl默认只生成了私钥文件,当需要提取公钥时使用rsa命令。

    示例

    #生成RSA密钥对。位长度为2048,保持到rsakey0.pem文件中。
    openssl genrsa -out rsakey0.pem 2048  
    #生成RSA密钥对。使用DES3加密,密钥使用密码保护,位长度为1024 openssl genrsa -des3 -out rootca.key -passout pass:123456 1024

    (2) openssl genpkey [options]   v1.0.1+

    示例

    #生成RSA密钥,位长度为2048,格式为DER
    openssl genpkey -algorithm RSA -out rsapriKey.pem -pkeyopt rsa_keygen_bits:2048 -outform DER

    (3) openssl req请求时生成新的密钥对

    openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes

     2.密钥文件管理和转换(rsa, pkey)

    (1) openssl rsa [options]  <infile  >outfile

    • -in <infile>   输入密钥文件
    • -passin pass:<password>   输入密钥保护密码
    • -inform  <DER|NET|PEM>   输入密钥格式,默认为PEM
    • -out <outfile>  输出密钥文件
    • -outform <DER|NET|PEM>  输出密钥格式,默认为PEM
    • -passout pass:<password>   输出密钥保护密码
    • -pubin     指示输入的是公钥,默认输出的是密钥对或私钥
    • -pubout   输出公钥到文件(公钥一般无需加密)
    • -des, -des3, -aes128, -aes192, -aes256  指定密钥加密算法
    • -text   明文输出密钥参数
    • -noout   不输出密钥到文件
    • -check    验证一致性
    • -modulus   显示RSA密钥模值

    示例

    复制代码
    #提取密钥公钥到单独的文件
    openssl rsa -in rsakey0.pem -pubout -out rsakey0.pub    
    
    #转换密钥格式(DER->PEM)
    openssl rsa -in rsakeypair.der -inform DER -out rsakeypair.pem 

    #改加密算法,移除密码保护
    openssl rsa -in rsakeypair.pem -passin pass:123456 -des3 -out rsakeypair1.pem
    复制代码

    (2) openssl pkey [options]  v1.0.1+

    (3) 将PEM格式密钥转换成Java JCE 能使用的DER格式密钥的另一种方式

    openssl pkcs8 -topk8 -inform PEM -outform DER -in <rsa_pem.key> -out <pkcs8_der.key> -nocrypt

    (4) OpenSSL公钥和OpenSSH公钥格式转换

    OpenSSL生成的公钥格式和OpenSSH公钥格式不一致,把OpenSSL生成的公钥用于配置SSH连接,验证会失败。

    OpenSSL公钥(PEM)格式为:

    复制代码
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk
    O3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2
    eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1
    QWPdspTBKcxeFbccDwIDAQAB
    -----END PUBLIC KEY-----
    复制代码

    OpenSSH公钥格式为:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDw==
    • 从私钥重新生成OpenSSH格式公钥
    ssh-keygen -y -f priKey.pem   > sshPubkey.pub
    • 将OpenSSL格式公钥转换成OpenSSH格式
    ssh-keygen -i -m PKCS8 -f sslPubKey.pub 〉 sshPubKey.pub    #-m支持 PEM,PKCS8,RFC4716
    • 将OpenSSH格式公钥转换成OpenSSL格式公钥
    ssh-keygen -e -m PEM -f sshPubKey.pub >sslPubKey.pub        #-m支持 PEM,PKCS8,RFC4716

    3.使用密钥(rsautl),不支持大文件

    openssl rsautl  [options]

    • -in  <file>     输入需加密解密文件
    • -out <file>    输出加密或解密后的文件
    • -inkey  <file>   输入密钥文件
    • -passin pass:<password>   输入密钥文件的保护密码
    • -keyform  <PEM|DER|NET>   输入密钥文件格式,默认为PEM
    • -pubin    指明输入的是公钥文件
    • -certin    指明输入的是包含公钥的证书
    • -sign      使用私钥签名签名(加密)
    • -verify    似乎用公钥验证签名(解密)
    • -encrypt   使用公钥加密
    • -decrypt   使用私钥解密
    • -hexdump  输出十六进制
    • -pkcs, -ssl, -raw, -oaep   数据补齐方式,默认为pkcs

      使用RSA加密时,要求被加密的数据长度与RSA密钥长度一致,数据过短时会补齐。过长时会分段加密。实际应用中很少会使用非对称加密算法对大的文件进行加密操作,而是使用对称加密算法加密文件,然后再使用<非对称加密算法>对<对称算法的密钥>进行加密

    示例:

    复制代码
    #使用公钥加密
    openssl rsautl -in test.txt  -out test_enc.txt -inkey rsakeypair.pub -pubin -encrypt
    
    #使用私钥解密
    openssl rsautl -in test_enc.txt -out text_dec.txt -inkey rsakeypair.pem -decrypt

    #使用私钥签名
    openssl rsautl -in test.txt -out test_sign.txt -inkey rsakeypair.pem -sign

    #使用公钥验证签名
    openssl rsautl -in test_sign.txt -out test_unsign.txt -inkey rsakeypari.pub -pubin -verify
    复制代码

    4.证书管理

    • 生成X509格式的自签名证书
    openssl req -x509 -new -days 365 -key rsakey.pem -out cert0.crt

    会要求输入区别名DN的各项信息(国家,城市,组织,姓名,email等)。

    根证书是认证中心机构(Certificate Authority)给自己签发的证书,签发者就是自身,是信任链的起点。里面包含了CA信息、CA公钥、用自身的私钥对这些信息的签名。下载并使用根证书就表示你信任它的来源机构,自然也信任证书以下签发的所有证书。某个证书可以用签发他的证书中的公钥验证,签发他的证书又需要上一层签发证书来验证,直到通过根证书中的公钥验证,那么这个证书就是可信任的。

    • 生成要求根证书签发子证书的请求文件
    openssl req -new -key rsakey1.pem -out subcertreq.csr

    会要求输入区别名DN的各项信息(国家,城市,组织,姓名,email等),还需要额外属性:密码 和 可选公司名。

    • 使用根证书签发子证书
    openssl x509 -req -in subcertreq.csr -CA cert0.crt -CAkey rsakey0.pem -CAcreateserial -days 365 -out subcert.crt

    也可创建一个ca的配置文件,通过ca管理子命令来签发子证书(未试验)

     openssl ca -config ca.config -out user.crt -infiles user.csr
    • 将证书和密钥打包为pkcs12格式的库中
    openssl pkcs12 -export -in subcert.crt -inkey rsakey1.pem -out subcert.p12

    需要输入pkcs12文件密码。

    • 查看证书内容
    openssl x509 -noout -text -in rootca.crt 
    • 验证证书
     openssl verify -CAfile rootca.crt subcert.crt

    用rootca.crt的公钥验证subcert.crt中的签名

    从证书中提取公钥

    openssl x509 -in cert.pem  -noout -pubkey > pubkey.pem

    提取密钥对

    openssl pkcs12 -in cert.pfx  -nocerts -nodes -out keypari.pem

    从PKCS#8提取公钥

    openssl req -in public.pem -noout -pubkey

    查看pkcs7签名内容的证书信息

     openssl pkcs7 -in  <pkcs7singedFile>  -inform DER  -print_certs

    三、Keytool工具管理证书

    keytool是Java提供的密钥、证书和证书库管理工具。可以完成生成密钥,生成证书等各种操作。

    keytool的子命令如下:

    -certreq       生成证书请求
    -changealias    更改条目的别名
    -delete      删除条目
    -exportcert          导出证书
    -genkeypair        生成密钥对
    -genseckey         生成密钥
    -gencert              根据证书请求生成证书
    -importcert          导入证书或证书链
    -importkeystore  从其他密钥库导入一个或所有条目
    -keypasswd        更改条目的密钥口令
    -list                    列出密钥库中的条目
    -printcert           打印证书内容
    -printcertreq      打印证书请求的内容
    -printcrl             打印 CRL 文件的内容
    -storepasswd    更改密钥库的存储口令

    还可以使用 keytool -command_name -help 查看各个子命令的帮助信息

    • pkcs12库中证书导入jks证书库(java keystore格式)
    keytool -importkeystore -srckeystore subcert.p12 -destkeystore subcert.jks -srcstoretype pkcs12

    需要输入目标库的密码和源库的密码,如果jks库文件不存在的话会自动生成。

     

    • 导入证书到jks库
    keytool -importcert -keystore subcert.jks -alias rootca -file rootcert.crt

    需要输入目标库密码和是否信任添加的证书。-alias可以省略,如果jks库文件不存在的话会自动生成。

    证书库或者说密钥库中即可以存放密钥也可存放证书,如果只包含证书(证书中有公钥)而不包含私钥,这样生成的库就是trust库。

    查看证书指纹

    keytool -list -keystore <keystoreFile>  -alias  <aliasName>

    等待补充......

    四、GPG

    先整理下三个概念:

    • OpenPGP 是一种加密标准和协议(RFC4880)。
    • PGP(Pretty Good Privacy)是这个标准的闭源商业实现。
    • GPG(GnuPG)是这个标准的开源实现。

    可见PGP和GPG是基于同一个标准的两套独立的工具,都能处理加解密、签名等功能,GPG是开源免费的。

    官方文档:https://www.gnupg.org/documentation/manuals/gnupg/

    GPG使用~/.gnupg目录。GPG除了基本的GnuPG核心命令功能外,GPG提供了一个名为Kleopatra的GUI密钥和证书管理工具,使用起来非常方便。Kleopatra的基本用法

    GPG命令详解

    -a       以ASCII输出

    功能选择

    --sign | -s     可以结合--encrypt或--symmetric或两者同时使用。使用默认的密钥。选择密钥使用--local-user和--default-key选项。

    --clearsign    签名,内容可读。选择密钥使用--local-user和--default-key选项。

    --detach-sign | -b    创建独立的签名

    --encrypt | -e    非对称加密,可以结合--sign,--symmetric或两者同时使用

    -c | --symmetric    对称加密。默认输出扩展名为.gpg,可以用-o指定输出文件,默认加密算法为CAST5,可以结合--cipher-algo指定算法。也可以配合--sign或--encrypt或两者同时使用。

    等待补充......

    示例:(http://blog.chinaunix.net/uid-9525959-id-2001824.html)

    复制代码
    gpg -c myfile [-o  myfile.gpg]               #对称加密
    gpg -d myfile.gpg -o myfile.decrypt          #对称解密
    gpg --genkey                                 #交互式创建密钥
    gpg --list-keys                              #查看已有的密钥
    gpg -e -a -r privkey   file [-o descfile]    #加密(需要公钥)。 -e | --encryt,  -a  ASCII输出, -r 指定加密的用户ID。
    gpg -o descfile --decrypt  file.asc          #解密(需要私钥),会提示输入密钥密码。
    gpg -o pubkeyfile  --export KeyID  [-a]      #导出公钥(证书),如果未指定KeyID,则备份所有公钥, -a ASCII输出否则为二进制格式。
    gpg -o subkeyfile  --export-secret-keys KeyID  [-a]  #导出私钥
    gpg --import subkeyfile                      #导入私钥
    gpg -o signedfile   -s  file                 #签名(需要私钥)
    gpg -o txtsignedfile  --clearsign  file      #保护原文的签名
    gpg --verify signedfile                      #验证签名(需要公钥)
    gpg -o encryptsignedfile  -ser prikey  file  #签名并加密(恢复时验证,不能通过--verify直接验证)
    gpg -o file --decrypt encryptsignedfile      #恢复加密的签名文件并验证
    gpg -o filesign -b -a  file                  #-b分离的签名,生成文件只包含签名信息
    gpg --verify filesign file                   #分离的签名验证
    gpg --edit-key  userID                       #编辑公钥,进入自命令环境:fpr  查看指纹, sign 签署公钥(加密是不再产生警告),check 检查已有的钥匙的签名, quit 退出 
    复制代码

    五、PGP

    PGP是OpenPGP标准的闭源商业版本。pgp提供了图形化工具和命令行工具,命令行工作主要有以下几个:

    • pgpk.exe    密钥生成和管理
    • pgpe.exe   加密
    • pgps.exe   签名
    • pgpv.exe   解密和校验
    • pgpo.exe   模拟2.6.3老版本命令行方式

    示例(http://blog.chinaunix.net/uid-7673620-id-2598657.html)

    复制代码
    pgpk -g                                                      #交互式生产密钥
    pgpk -x  keyname [-o pubkeyfile]                             #导出公钥
    pgpk -a  pubkeyfile                                          #将密钥加入密钥环(pubring.pkr文件)
    pgpk -r  keyname                                             #从密钥环删除公钥
    pgpe -r  keyname originfile [-o encryedfile] [-a]            #加密,-a表示生成ASCII文档而不是二进制
    pgpv encrypedfile -o decryedfile                             #解密(需要密钥密码)
    pgps -u keyname originfile [-o signedfile] [-a]              #签名(需要密钥密码),-a表示生成ASCII文档而不是二进制
    pgpv signedfile                                              #签名验证并恢复原始文件
    
    
    pgp -ka KEYS       #导入密钥
    pgp file.asc       #验证签名
    复制代码

    六、PuTTY工具

    Putty是一个免费小巧(主程序只有300多K)的Window/Unix平台的ssh,telnet客户端,附带xterm终端模拟器。功能丝毫不逊于商业的SecureCrt。官方网站:http://www.chiark.greenend.org.uk/~sgtatham/putty/

    PuTTY包含多个工具。

    • PuTTY         telnet和SSH客户端
    • PSCP           SCP客户端
    • PSFTP          SFTP客户端
    • PuTTYtel      telnet客户端
    • Plink            PuTTY后端的命令行接口
    • Pageant        SSH认证代理,(PuTTY、PSCP、PSFTP、Plink都会用到)
    • PuTTYgen     RSA和DSA密钥生成转换工具

     

    PuTTYgen

    本文主要内容是密钥的管理,所有只说明PuTTYgen的使用。

    PuTTYgen使用的密钥存储格式类似于OpenSSL(密钥文件扩展名.ppk,其中同时包含公钥和私钥)。

    公钥格式

    复制代码
    ---- BEGIN SSH2 PUBLIC KEY ----
    Comment: "imported-openssh-key"
    AAAAB3NzaC1yc2EAAAABIwAAAQEA5of83WbXgRVTUFsOI49wacuEp253YuzZW1Lk
    ......
    vw7Oc6o357ipDPgWk9c82s+7Asov4OgX5o6hg3R7418Gc0lkqw==
    ---- END SSH2 PUBLIC KEY ----
    复制代码

    私钥格式(.ppk)

    复制代码
    PuTTY-User-Key-File-2: ssh-rsa
    Encryption: aes256-cbc
    Comment: imported-openssh-key
    Public-Lines: 6
    AAAAB3NzaC1yc2EAAAABIwAAAQEA5of83WbXgRVTUFsOI49wacuEp253YuzZW1Lk
    ...4行...
    ...... vw7Oc6o357ipDPgWk9c82s+7Asov4OgX5o6hg3R7418Gc0lkqw== Private-Lines: 14 xc2m3BR30d7GZG/QVatu8Xm5PfYYMXRfPobGtbqLsWWI9Wzfjs/InEVFPcG8kJ6v ...12行... GANvUGQcgCyQTKVnqXmSMwPNZkqkJYZmRA43PBfiufVLV4JItNxY8ol+enUfWwde Private-MAC: 647a57a82038c05113fbd6a1758871b138a7a001
    复制代码

    可以导入和导出OpenSSH和ssh.com格式的私钥(Conversions菜单下)。程序主界面中也会显示OpenSSH格式的公钥。

     -----------------------------未整理----------------------------------

     其他

    OpenSSL生成的密钥文件(.pem),签发请求文件(.csr)和证书文件(.cet)都是用纯文本格式保存了Base64编码后的信息(PEM格式)。可以用文本编辑器打开,内容如下:

    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEArlUX2v998Y+Ek/AzoDdsbW7ILyRpwXVBMDqmOf3ZZpbP/4vo
    .....省略若干行......
    buL0a0BOFi7dyJjWgtEyYTFQgYSeezHl/+XyOhuJlTyvZWUpm5w=
    -----END RSA PRIVATE KEY-----

    首行和末尾行会被忽略,首行中显示了文件中存储的信息类型。

    查看签名信息

    jarsigner -verify -verbose -certs <jksSignedFile>  

    PEM格式 (PKCS#8)

    pem是最常用的私钥和证书存储格式。其中通常会包含 ‘—–BEGIN XXXX—–” and “—–END XXXX—–” 字符串,中间存放了Base64编码过的二进制数据。多个PEM证书或私钥可以包含在一个文件中,但最好还是将各个证书和私钥分开存放。扩展名可能为.pem, .crt, .cer, .key。

    ASN格式 

    DER格式

    主要用在Java,所有类型的证书和私钥都能用DER格式存放。文件中直接存储二进制数据,未进行Base64编码,无可读性的描述文字。扩展名可能为.cer, .der。

    PVK格式(微软)

    NET格式

    P7B/PKCS#7文件(PEM)

    包含 “—–BEGIN PKCS—–” & “—–END PKCS7—–” 字符串,只能存储证书和链证书,不能存放私钥。内容经过Base64编码,扩展名可能为.p7b,.p7c

    PFX/PKCS#12文件(PEM)

    可以加密的文件,可在一个文件中存放多个证书或密钥,主要用于证书和私钥的导入导出。扩展名一般为.pfx, .p12

    PEM转DER

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

    PEM格式证书转P7B

     openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfileCAcert.cer

    PEM格式转PFX

     openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt-certfile CAcert.crt

    DER转PEM

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

    P7B转PEM

    openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

    P7B转PFX(先转成PEM)

    $ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
    $ openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -outcertificate.pfx -certfile CAcert.cer

    PFX转PEM(PFX中所有内容被存放到一个pem格式文件中)

    openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

     PKCS#8定义了私钥信息语法和加密私钥语法,X509定义证书规范,密钥通常使用DER和PEM进行编码存储,Java中JCE使用的是DER。openssl主要用的是PEM编码。PEM相对DER可读性更强,以BASE64编码,外围包上类似----BEGIN RSA PRIVATE KEY----。 JCE没有对PEM直接支持,但是第三方那个包如bouncycastle可以解析。

     很多SSH公钥使用openssh格式。其内容为ssh-rsa打头,RSA-1024结尾,中间是Base64编码:

    ssh-rsa  AAAAB3Nza.........................cySYqQ==  RSA-1024

     参考资料:

    OppenSSL文档: https://www.openssl.org/docs/apps/openssl.html

    Keytool文档:http://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

    http://zhtx168.blog.163.com/blog/static/41601548200812503248/

    http://blog.csdn.net/kimylrong/article/details/43525333

    http://blog.csdn.net/jiftlixu/article/details/19836405

    http://blog.csdn.net/zhymax/article/details/7683925

    http://www.360doc.com/content/13/1203/17/14797374_334193770.shtml

  • 相关阅读:
    无法访问计算机XXXX。错误是:库没有注册。
    Unix网卡重启命令
    教你如何进入有密码的 XP 系统
    巧妙恢复被破坏的Windows XP系统文件
    认识容灾备份 构筑一个避风港
    双机热备的实现模式 - 基于共享存储与纯软件方式
    玩大型游戏死机解决方法
    让windows xp开机跳过登陆界面
    在IE7中无法正常访问FTP的解决办法
    STL使用心得
  • 原文地址:https://www.cnblogs.com/fengaix6/p/8947025.html
Copyright © 2011-2022 走看看