OpenSSL
引言
使用HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的。也就是说,任何人都可以通过适当的工具拦截或者监听到在网络上传输的数据流。但是有时候,我们需要在网络上传输一些安全性或者私秘性的数据,譬如:包含信用卡及商品信息的电子订单。这个时候,如果仍然使用HTTP协议,势必会面临非常大的风险!相信没有人能接受自己的信用卡号在互联网上裸奔。
HTTPS(超文本传输安全)
协议无疑可以有效的解决这一问题。所谓HTTPS,其实就是HTTP和SSL/TLS的组合,用以提供加密通讯及对网络服务器的身份鉴定。HTTPS的主要思想是在不安全的网络上创建一安全信道,防止黑客的窃听和攻击。
SSL(安全套接层)
可以用来对Web服务器和客户端之间的数据流进行加密。
SSL利用非对称密码技术进行数据加密。加密过程中使用到两个秘钥。
服务器证书(CA证书)
网站向CA机构申请的证书,保存在服务器中,当浏览器发起请求时,会把发送服务器证书给浏览器
服务器证书包含以下信息:持有者姓名、发证机关(Issuer)、有效日期、证书持有人的公钥、扩展信息、数字签名(用发证机关的私钥对前五点信息签名)
服务器证书中的公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密
CA根证书
浏览器中内置了主流CA机构的根证书,根证书中包含CA机构的公钥,此公钥和服务器证书中数字签名用到的私钥是一对
它的作用是验证服务器中的数字签名,防止证书内容篡改
X.509?
X.509证书包含三个文件:key,csr,crt。
key
key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
csr
是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
crt
是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。
流程图
另一个图:申请证书
SSL常用于身份验证、数据加密等应用中,要使用SSL,我们密码有自己的证书。数字证书一般要向专业的认证公司(如VeriSign)申请,并且都是收费的,某些情况下,我们只是想使用加密的数据通信,而不在乎认证,这时就可以自己制作一个证书,自己制作一个证书,有两种方式,一种是Self Signed,另一种是自己制作一个CA,然后由这个CA,来发布我们需要的证书。下面分别介绍这两个方法。
创建自签名证书(Self Signed)
自签名证书仅用于配置内部使用或测试需要的SSL证书。
首先生成自己的CA,CA是证书的发布者,CA可以发布其他人的证书,把CA的证书加入系统信任的根证书后,由CA发布的证书也被系统所信任,所以,CA的key是必须小心保护的,一般都要加密保护,并且限制为root权限读写。
1、生成CA的key(RSA私钥)
openssl genrsa -des3 -out ca.key 4096
说明:生成rsa私钥,des3算法,4096位强度,server.key是秘钥文件名。
注意:生成私钥,需要提供一个至少4位的密码。
2、生成CA的证书
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
3、生成我们的key
openssl genrsa -des3 -out myserver.key 4096
4、生成csr文件
生成私钥之后,便可以创建csr文件了。csr文件用于证书签名请求
openssl req -new -key myserver.key -out myserver.csr
说明:需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:joyios
Organizational Unit Name (eg, section) []:info technology
Common Name (e.g. server FQDN or YOUR name) []:demo.joyios.com
Email Address []:liufan@joyios.com
5、使用ca的证书和key、csr,生成我们的证书
这里的set_serial指明了证书的序号,如果证书过期了(365天后),或者证书key泄漏了,需要重新发证的时候,就要加1
openssl x509 -req -days 365 -in myserver.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out myserver.crt
crt上有证书持有人的信息,持有人的公钥,以及签署者的签名等信息。当用户安装了证书之后,便意味着信任了这份证书,同时拥有了其中的公钥。证书上会说明用途,例如服务器认证,客户端认证,或者签署其他证书。当系统收到一份新的证书的时候,证书会说明,是由谁签署的。如果这个签署者确实可以签署其他证书,并且收到证书上的签名和签署者的公钥可以对上的时候,系统就自动信任新的证书。
需要注意的是,在使用自签名的临时证书时,浏览器会提示证书的颁发机构是未知的。
6、自签名证书与私匙合并成一个文件
openssl pkcs12 -export -in myserver.crt -inkey myserver.key -out myserver.pfx
查看证书
查看KEY信息
openssl rsa -noout -text -in myserver.key
查看CSR信息
openssl req -noout -text -in myserver.csr
查看证书信息
openssl x509 -noout -text -in ca.crt
验证证书
会提示self signed
openssl verify selfsign.crt
因为myserver.crt 是幅ca.crt发布的,所以会验证成功
openssl verify -CAfile ca.crt myserver.crt
OpenSSL命令
将.key和.crt证书合成.pfx证书
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
.pfx证书格式转转.key和.crt文件
(1)将.pfx格式的证书转换为.pem文件格式:
openssl pkcs12 -in xxx.pfx -nodes -out server.pem
(2)从.pem文件中导出私钥server.key:
openssl rsa -in server.pem -out server.key
(3)从.pem文件中导出证书server.crt
openssl x509 -in server.pem -out server.crt
其他格式转换
OpenSSL转换PEM
将PEM转换为DER
openssl x509 -outform der -in certificate.pem -out certificate.der
将PEM转换为P7B
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
将PEM转换为PFX
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
OpenSSL转换DER
将DER转换为PEM
openssl x509 -inform der -in certificate.cer -out certificate.pem
OpenSSL转换P7B
将P7B转换为PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
将P7B转换为PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
OpenSSL转换PFX
将PFX转换为PEM
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
PFX文件提取公钥私钥
openssl pkcs12 -in fulusso.pfx -nocerts -nodes -out private.key
输入密码
openssl rsa -in private.key -out pfx_pri.pem
openssl rsa -in private.key -pubout -out pfx_pub.pem
RSA加解密案例
1、创建私钥
openssl genrsa -out private.pem 2048
2、使用私钥创建公钥
openssl rsa -in ./private.pem -pubout -out public.pem
3、创建待加密文件
echo 'abcd哈哈'>1.txt
4、使用公钥加密文件,生成加密文件crypt
openssl rsautl -encrypt -in 1.txt -inkey public.pem -pubin -out crypt
5、使用私钥解密文件
openssl rsautl -decrypt -in crypt -inkey private.pem -out 2.txt
6、查看2.txt
cat 2.txt
输出abcd哈哈
RSA签名与验签
还是使用上面生成的私钥公钥
1、对文件签名,生成签名文件sign
openssl dgst -sign private.pem -md5 -out sign 1.txt
2、验签
openssl dgst -verify public.pem -md5 -signature sign 1.txt
输出:Verified OK