OpenSSH是SSH协议的开源版本(SSH:SecureSHell)。使用SSH透过计算机网络实现加密通讯,可以进行远程控制,在计算机之间传送文件等等。SSH传输的数据都进行了加密,比telnet,rcp,ftp,rlogin,rsh等以明文传输密码的工具更安全。
OpenSSH提供了实现SSH协议的很多工具。其中ssh-keygen用于生成,管理和转换用于认证的密钥和证书。
ssh-keygen
OpenSSL是一个强大的安全套接字层密码库,包括了加密算法,常用密钥和证书管理,SSL协议等功能。OpenSSL提供的命令非常多,这里只简单列出OpenSSL生成密钥和证书的一些操作(Window需要以管理员身份运行cmd)。
v1.0.1+密钥默认采用PKCS#8格式(之前版本为PEM)。
查看openSSL版本
opensslversionopensslversion-aenc对称加密
(1)opensslgenrsa[options][bits_num]
默认生产的密钥格式为PEM。openssl默认只生成了私钥文件,当需要提取公钥时使用rsa命令。
示例
#生成RSA密钥对。位长度为2048,保持到rsakey0.pem文件中。opensslgenrsa-outrsakey0.pem2048#生成RSA密钥对。使用DES3加密,密钥使用密码保护,位长度为1024opensslgenrsa-des3-outrootca.key-passoutpass:1234561024
(2)opensslgenpkey[options]v1.0.1+
#生成RSA密钥,位长度为2048,格式为DERopensslgenpkey-algorithmRSA-outrsapriKey.pem-pkeyoptrsa_keygen_bits:2048-outformDER
(3)opensslreq请求时生成新的密钥对
opensslreq-x509-days365-newkeyrsa:2048-keyoutprivate.pem-outpublic.pem-nodes
(1)opensslrsa[options]
#提取密钥公钥到单独的文件opensslrsa-inrsakey0.pem-pubout-outrsakey0.pub#转换密钥格式(DER->PEM)opensslrsa-inrsakeypair.der-informDER-outrsakeypair.pem#改加密算法,移除密码保护opensslrsa-inrsakeypair.pem-passinpass:123456-des3-outrsakeypair1.pem
(2)opensslpkey[options]v1.0.1+
(3)将PEM格式密钥转换成JavaJCE能使用的DER格式密钥的另一种方式
opensslpkcs8-topk8-informPEM-outformDER-in
(4)OpenSSL公钥和OpenSSH公钥格式转换
OpenSSL生成的公钥格式和OpenSSH公钥格式不一致,把OpenSSL生成的公钥用于配置SSH连接,验证会失败。
OpenSSL公钥(PEM)格式为:
-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDwIDAQAB-----ENDPUBLICKEY-----OpenSSH公钥格式为:
ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAAAgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDw==
ssh-keygen-y-fpriKey.pem>sshPubkey.pub将OpenSSL格式公钥转换成OpenSSH格式ssh-keygen-i-mPKCS8-fsslPubKey.pub〉sshPubKey.pub#-m支持PEM,PKCS8,RFC4716将OpenSSH格式公钥转换成OpenSSL格式公钥ssh-keygen-e-mPEM-fsshPubKey.pub>sslPubKey.pub#-m支持PEM,PKCS8,RFC4716
opensslrsautl[options]
使用RSA加密时,要求被加密的数据长度与RSA密钥长度一致,数据过短时会补齐。过长时会分段加密。实际应用中很少会使用非对称加密算法对大的文件进行加密操作,而是使用对称加密算法加密文件,然后再使用<非对称加密算法>对<对称算法的密钥>进行加密。
示例:
#使用公钥加密opensslrsautl-intest.txt-outtest_enc.txt-inkeyrsakeypair.pub-pubin-encrypt#使用私钥解密opensslrsautl-intest_enc.txt-outtext_dec.txt-inkeyrsakeypair.pem-decrypt#使用私钥签名opensslrsautl-intest.txt-outtest_sign.txt-inkeyrsakeypair.pem-sign#使用公钥验证签名opensslrsautl-intest_sign.txt-outtest_unsign.txt-inkeyrsakeypari.pub-pubin-verify
opensslreq-x509-new-days365-keyrsakey.pem-outcert0.crt会要求输入区别名DN的各项信息(国家,城市,组织,姓名,email等)。
opensslreq-new-keyrsakey1.pem-outsubcertreq.csr会要求输入区别名DN的各项信息(国家,城市,组织,姓名,email等),还需要额外属性:密码和可选公司名。
opensslx509-req-insubcertreq.csr-CAcert0.crt-CAkeyrsakey0.pem-CAcreateserial-days365-outsubcert.crt
也可创建一个ca的配置文件,通过ca管理子命令来签发子证书(未试验)
opensslca-configca.config-outuser.crt-infilesuser.csr
opensslpkcs12-export-insubcert.crt-inkeyrsakey1.pem-outsubcert.p12需要输入pkcs12文件密码。
opensslx509-noout-text-inrootca.crt
opensslverify-CAfilerootca.crtsubcert.crt用rootca.crt的公钥验证subcert.crt中的签名
从证书中提取公钥
opensslx509-incert.pem-noout-pubkey>pubkey.pem提取密钥对
opensslpkcs12-incert.pfx-nocerts-nodes-outkeypari.pem从PKCS#8提取公钥
opensslreq-inpublic.pem-noout-pubkey
查看pkcs7签名内容的证书信息
opensslpkcs7-in
keytool是Java提供的密钥、证书和证书库管理工具。可以完成生成密钥,生成证书等各种操作。
keytool的子命令如下:
-certreq生成证书请求-changealias更改条目的别名-delete删除条目-exportcert导出证书-genkeypair生成密钥对-genseckey生成密钥-gencert根据证书请求生成证书-importcert导入证书或证书链-importkeystore从其他密钥库导入一个或所有条目-keypasswd更改条目的密钥口令-list列出密钥库中的条目-printcert打印证书内容-printcertreq打印证书请求的内容-printcrl打印CRL文件的内容-storepasswd更改密钥库的存储口令
还可以使用keytool-command_name-help查看各个子命令的帮助信息
keytool-importkeystore-srckeystoresubcert.p12-destkeystoresubcert.jks-srcstoretypepkcs12需要输入目标库的密码和源库的密码,如果jks库文件不存在的话会自动生成。
keytool-importcert-keystoresubcert.jks-aliasrootca-filerootcert.crt需要输入目标库密码和是否信任添加的证书。-alias可以省略,如果jks库文件不存在的话会自动生成。
证书库或者说密钥库中即可以存放密钥也可存放证书,如果只包含证书(证书中有公钥)而不包含私钥,这样生成的库就是trust库。
查看证书指纹
keytool-list-keystore
等待补充......
先整理下三个概念:
可见PGP和GPG是基于同一个标准的两套独立的工具,都能处理加解密、签名等功能,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或两者同时使用。
gpg-cmyfile[-omyfile.gpg]#对称加密gpg-dmyfile.gpg-omyfile.decrypt#对称解密gpg--genkey#交互式创建密钥gpg--list-keys#查看已有的密钥gpg-e-a-rprivkeyfile[-odescfile]#加密(需要公钥)。-e|--encryt,-aASCII输出,-r指定加密的用户ID。gpg-odescfile--decryptfile.asc#解密(需要私钥),会提示输入密钥密码。gpg-opubkeyfile--exportKeyID[-a]#导出公钥(证书),如果未指定KeyID,则备份所有公钥,-aASCII输出否则为二进制格式。gpg-osubkeyfile--export-secret-keysKeyID[-a]#导出私钥gpg--importsubkeyfile#导入私钥gpg-osignedfile-sfile#签名(需要私钥)gpg-otxtsignedfile--clearsignfile#保护原文的签名gpg--verifysignedfile#验证签名(需要公钥)gpg-oencryptsignedfile-serprikeyfile#签名并加密(恢复时验证,不能通过--verify直接验证)gpg-ofile--decryptencryptsignedfile#恢复加密的签名文件并验证gpg-ofilesign-b-afile#-b分离的签名,生成文件只包含签名信息gpg--verifyfilesignfile#分离的签名验证gpg--edit-keyuserID#编辑公钥,进入自命令环境:fpr查看指纹,sign签署公钥(加密是不再产生警告),check检查已有的钥匙的签名,quit退出
PGP是OpenPGP标准的闭源商业版本。pgp提供了图形化工具和命令行工具,命令行工作主要有以下几个:
pgpk-g#交互式生产密钥pgpk-xkeyname[-opubkeyfile]#导出公钥pgpk-apubkeyfile#将密钥加入密钥环(pubring.pkr文件)pgpk-rkeyname#从密钥环删除公钥pgpe-rkeynameoriginfile[-oencryedfile][-a]#加密,-a表示生成ASCII文档而不是二进制pgpvencrypedfile-odecryedfile#解密(需要密钥密码)pgps-ukeynameoriginfile[-osignedfile][-a]#签名(需要密钥密码),-a表示生成ASCII文档而不是二进制pgpvsignedfile#签名验证并恢复原始文件pgp-kaKEYS#导入密钥pgpfile.asc#验证签名
PuTTY包含多个工具。
本文主要内容是密钥的管理,所有只说明PuTTYgen的使用。
PuTTYgen使用的密钥存储格式类似于OpenSSL(密钥文件扩展名.ppk,其中同时包含公钥和私钥)。
公钥格式
----BEGINSSH2PUBLICKEY----Comment:"imported-openssh-key"AAAAB3NzaC1yc2EAAAABIwAAAQEA5of83WbXgRVTUFsOI49wacuEp253YuzZW1Lk......vw7Oc6o357ipDPgWk9c82s+7Asov4OgX5o6hg3R7418Gc0lkqw==----ENDSSH2PUBLICKEY----私钥格式(.ppk)
PuTTY-User-Key-File-2:ssh-rsaEncryption:aes256-cbcComment:imported-openssh-keyPublic-Lines:6AAAAB3NzaC1yc2EAAAABIwAAAQEA5of83WbXgRVTUFsOI49wacuEp253YuzZW1Lk...4行.........vw7Oc6o357ipDPgWk9c82s+7Asov4OgX5o6hg3R7418Gc0lkqw==Private-Lines:14xc2m3BR30d7GZG/QVatu8Xm5PfYYMXRfPobGtbqLsWWI9Wzfjs/InEVFPcG8kJ6v...12行...GANvUGQcgCyQTKVnqXmSMwPNZkqkJYZmRA43PBfiufVLV4JItNxY8ol+enUfWwdePrivate-MAC:647a57a82038c05113fbd6a1758871b138a7a001
可以导入和导出OpenSSH和ssh.com格式的私钥(Conversions菜单下)。程序主界面中也会显示OpenSSH格式的公钥。
-----------------------------未整理----------------------------------
OpenSSL生成的密钥文件(.pem),签发请求文件(.csr)和证书文件(.cet)都是用纯文本格式保存了Base64编码后的信息(PEM格式)。可以用文本编辑器打开,内容如下:
-----BEGINRSAPRIVATEKEY-----MIIEogIBAAKCAQEArlUX2v998Y+Ek/AzoDdsbW7ILyRpwXVBMDqmOf3ZZpbP/4vo.....省略若干行......buL0a0BOFi7dyJjWgtEyYTFQgYSeezHl/+XyOhuJlTyvZWUpm5w=-----ENDRSAPRIVATEKEY-----
首行和末尾行会被忽略,首行中显示了文件中存储的信息类型。
查看签名信息
jarsigner-verify-verbose-certs
pem是最常用的私钥和证书存储格式。其中通常会包含‘—–BEGINXXXX—–”and“—–ENDXXXX—–”字符串,中间存放了Base64编码过的二进制数据。多个PEM证书或私钥可以包含在一个文件中,但最好还是将各个证书和私钥分开存放。扩展名可能为.pem,.crt,.cer,.key。
主要用在Java,所有类型的证书和私钥都能用DER格式存放。文件中直接存储二进制数据,未进行Base64编码,无可读性的描述文字。扩展名可能为.cer,.der。
包含“—–BEGINPKCS—–”&“—–ENDPKCS7—–”字符串,只能存储证书和链证书,不能存放私钥。内容经过Base64编码,扩展名可能为.p7b,.p7c
可以加密的文件,可在一个文件中存放多个证书或密钥,主要用于证书和私钥的导入导出。扩展名一般为.pfx,.p12
PEM转DER
opensslx509-outformder-incertificate.pem-outcertificate.der
PEM格式证书转P7B
opensslcrl2pkcs7-nocrl-certfilecertificate.cer-outcertificate.p7b-certfileCAcert.cer
PEM格式转PFX
opensslpkcs12-export-outcertificate.pfx-inkeyprivateKey.key-incertificate.crt-certfileCAcert.crt
DER转PEM
opensslx509-informder-incertificate.cer-outcertificate.pem
P7B转PEM
opensslpkcs7-print_certs-incertificate.p7b-outcertificate.cer
P7B转PFX(先转成PEM)
$opensslpkcs7-print_certs-incertificate.p7b-outcertificate.cer$opensslpkcs12-export-incertificate.cer-inkeyprivateKey.key-outcertificate.pfx-certfileCAcert.cer
PFX转PEM(PFX中所有内容被存放到一个pem格式文件中)
opensslpkcs12-incertificate.pfx-outcertificate.cer-nodes
PKCS#8定义了私钥信息语法和加密私钥语法,X509定义证书规范,密钥通常使用DER和PEM进行编码存储,Java中JCE使用的是DER。openssl主要用的是PEM编码。PEM相对DER可读性更强,以BASE64编码,外围包上类似----BEGINRSAPRIVATEKEY----。JCE没有对PEM直接支持,但是第三方那个包如bouncycastle可以解析。
很多SSH公钥使用openssh格式。其内容为ssh-rsa打头,RSA-1024结尾,中间是Base64编码:
ssh-rsaAAAAB3Nza.........................cySYqQ==RSA-1024