一文带你了解OpenSSL


前言

OpenSSL初接触的人恐怕最难的在于先理解各种概念

对称加密

我们一般的加密是用一个密码加密文件,然后解密也用同样的密码。这很好理解,这个是对称加密。

非对称加密

加密用的一个密码,而解密用另外一组密码,这个叫非对称加密

公钥/私钥/签名/验证签名

一组密钥中的一个来加密数据,可以用另一个解开。是的没错,公钥和私钥都可以用来加密数据,相反用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为签名和验证签名

因为公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给人和人,让他加密他想要传送给你的数据,这个数据只有到了有私钥的你这里,才可以解开成有用的数据,其他人就是得到了,也看懂内容。同理,如果你用你的私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的,相反,则不是。这个被称为签名。

实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密,他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性。

RSA/DSA/SHA/MD5

非对称加密的算法有很多,比较著名的有RSA/DSA ,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名。至于SHA则是一种和md5相同的算法,它不是用于加密解密或者签名的,它被称为摘要算法。就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的
嗯。。。。,正常情况下是这样的,这个算法起的作用就是,如果你把原数据修改一点点,那么生成的摘要都会不同,传输过程中把原数据给你再给你一个摘要,你把得到的原数据同样做一次摘要算法,与给你的摘要相比较就可以知道这个数据有没有在传输过程中被修改了。

实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的摘要值一起传给你。这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了,而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开。

CA/PEM/DER/X509/PKCS

一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密,但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗,为了解决这个问题,需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的。这就是CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名。然后这个包含了你的公钥和你的信息的文件就可以称为证书文件了。这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊。这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了。

实际应用中,一般人都不会找CA去签名,因为那是收钱的,所以可以自己做一个自签名的证书文件,就是自己生成一对密钥,然后再用自己生成的另外一对密钥对这对密钥进行签名,这个只用于真正需要签名证书的人,普通的加密解密数据,直接用公钥和私钥来做就可以了。

密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式,PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母,DER格式是二进制的密钥文件,直接打开,你可以看到。。。。。。。。你什么也看不懂!。X509是通用的证书文件格式定义。pkcs的一系列标准是指定的存放密钥的文件标准,你只要知道PEM DER X509 PKCS这几种格式是可以互相转化的。

OpenSSL

简介

openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。

官网: https://www.openssl.org/source/

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

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

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

其中 passout 代替shell 进行密码输入,否则会提示输入密码;
生成加密后的内容如:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,5584D000DDDD53DD5B12AE935F05A007
Base64 Encoded
Data-----END RSA PRIVATE KEY-----

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

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

  • 私钥转非加密

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

  • 私钥PEM转DER

openssl rsa -in rsa_private.key -outform der -out rsa_aes_private.der

  • 查看私钥明细

openssl rsa -in rsa_private.key -noout -text

使用-pubin参数可查看公钥明细

  • 私钥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自签名证书和RSA私钥

  • 生成 RSA 私钥和自签名证书

openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt

req是证书请求的子命令,

-newkey rsa:2048 

-keyout private_key.pem 表示生成私钥(PKCS8格式),

-nodes 表示私钥不加密,若不带参数将提示输入密码;

-x509表示输出证书,

-days36500 为有效期,

此后根据提示输入证书拥有者信息;
生成服务器签名请求文件及CA 签名颁发服务器证书

server.key建议不要加密码,如果加密码,重启nginx的时候每次都需要密码才可以启动nginx影响效率。

nginx配置只需要server.keyserver.crt两个文件。

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

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

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

openssl x509 -req -days 365000 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt

证书查看及转换

  • 查看证书细节
    openssl x509 -in cert.crt -noout -text

  • 将 pem 证书和私钥转 pkcs#12 证书
    openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 -out server.p12

其中-export指导出pkcs#12 证书,-inkey 指定了私钥文件,-passin 为私钥(文件)密码(nodes为无加密),-password 指定 p12文件的密码(导入导出)

  • 将 pem 证书和私钥/CA 证书 合成pkcs#12 证书
    openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -chain -CAfile cert.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 server.p12.pem

  • 仅提取私钥
    openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out server.p12.key.pem

  • 仅提取证书(所有证书)
    openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out server.p12.key1.pem

  • 仅提取ca证书
    openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out cacert.pem

  • 仅提取server证书
    openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out cert.pem

  • PEM–DER/CER(BASE64–DER编码的转换)
    openssl x509 -outform der -in cert.pem -out cert.der


文章作者: 江湖义气
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 江湖义气 !
  目录