SSL(Secure Socket Layer,安全套接字层)是为网络通信提供安全保障和数据完整性的一种安全协议,由Netscape公司研发。SSL协议位于网络的应用层和传输层之间,它接受来自上层网络应用层协议(如http、ftp)的数据报文,并将其再一次进行封装、加密,再传递给下层网络传输层协议(如tcp、udp)。该协议提供的服务主要有:
a、数据来源可靠性:一次网络连接中的客户端和服务器都会被验证是否是对方所期望连接的主机。确保数据将被正确地发送至客户端和服务器。
b、数据机密性:数据在发送之前被加密,保证其在网络传输过程中,不会被窃取。
c、数据完整性:数据在接收之后,接收端主机会根据数据的特征码以验证数据的完整性,保证其在网络传输过程中,不会被篡改。
就SSL提供的以上服务中,以数据来源可靠性最为重要。SSL采用非对称加密算法(如RSA)来保证网络中互联双方的真实性。互联双方各拥有一对密钥,公私钥。其中公钥是公开的,网络中的任何人都可以得到任何主机或用户的公钥,而唯独私钥是保密的。且公钥是从其对应私钥中提取出来的。对于公钥加密的文件,仅能通过其对应的私钥解密,由此便保证了数据的机密性。对于私钥加密的文件,仅能通过其对应的公钥解密,由此便保证了数据来源的可靠性。
openssl便是SSL的一个开源实现。本文后续内容将简要介绍如何用openssl进行加解密、提取数据特征码、生成密钥,以及生成数字证书请求、创建私有CA和签发数字证书。
1、利用openssl进行加解密
openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] ...
-ciphername指定加密算法,例如:-base64
-in filename指定要加密的文件,filename为该文件的文件名
-out filename指定将加密后的数据保存到filename指定的文件中
-e指定为加密过程,此为默认过程
-d指定为解密过程
示例:
# openssl enc -base64 -in plaintext.txt -out ciphertext.txt
采用base64加密算法将plaintext.txt文件中的数据加密,并保存到ciphertext.txt文件中。
# openssl enc -base64 -in ciphertext.txt -d
采用base64算法解密ciphertext.txt文件中的数据,并打印到显示屏幕。
2、利用openssl提取数据特征码
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [file...] ...
-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1指定提取数据特征码的单向加密算法
-c指定特征码输出格式,每两位跟上一个冒号
file指定要提取数据特征码的文件
示例:
# openssl dgst -md5 -c plaintext.txt
采用md5单项加密算法提取plaintext.txt文件的数据特征码。即使是当文件中的数据遭到微小的篡改,再次计算得出的数据特征码都会和原先的特征码大相径庭。
3、利用openssl生成密钥
openssl genrsa [-out filename] [numbits] ...
-out filename指定将生成的私钥保存到filename文件中
numbits指定私钥的长度(位数)
openssl rsa [-in filename] [-out filename] [-pubout] ...
-in filename指定私钥文件
-out filename指定将从私钥中提取出的公钥保存到filename文件中
-pubout指定从私钥中提取公钥
示例:
# (umask 077; openssl genrsa -out private.key 512)
括号中的命令将在子shell中运行。第一条命令改变子shell中的umask值,令生成的文件除属主外,其他人对他无任何权限,保证了私钥的机密性。采用RSA非对称加密算法生成512位的私钥,并将其保存到private.key文件中。
# openssl rsa -in private.key -pubout
从private.key中的私钥中提取出公钥,并打印到显示屏幕。
4、利用openssl生成数字证书请求
openssl req [-in filename] [-out filename] [-text] [-pubkey] [-new] [-newkey rss:bits] [-nodes] [-key filename] [-keyout filename] [-config filename] [-x509] [-days n] [-batch] ...
-in filename从指定文件中读取数字证书请求
-out filename将生成的数字证书请求、公钥等信息保存到指定文件中
-text以文本格式输出数字证书请求的内容
-pubkey输出公钥
-new新建数字证书请求
-newkey rsa:bits新建指定位数的RSA密钥,和-key选项互斥
-nodes配合-newkey选项,指定生成的密钥文件不加密
-key filename指定已有密钥的文件,和-newkey选项互斥
-keyout filename将生成的私钥保存到指定的文件中
-config filename指定参数文件,默认为/etc/pki/tls/openssl.cnf
-x509指定生成自签署证书
-days n配合-x509选项,指定数字证书有效期限
-batch非交互式模式
a、使用已有私钥生成证书请求
# openssl req -new -key private.key -out client.csr
使用已有RSA私钥、输入主体相关信息,生成证书请求文件,并将其保存至client.csr文件。
# openssl req -new -key private.key -out client.csr -batch -pubkey
使用已有RSA私钥生成证书请求文件,指定-batch选项,主体相关信息从配置文件中读取。并将证书请求和公钥数据保存至client.csr文件。
b、自动生成密钥和证书请求
# openssl req -new -newkey rsa:512 -out client.csr -keyout private.key -batch -pubkey
从配置文件中读取主体相关信息,自动生成512位RSA密钥和证书请求。将私钥保存至private.key文件中;将公钥和证书请求保存至client.csr文件中。
# openssl rsa -in private.key
输入保存密钥时设置的密码,解密private.key中的密钥。
# openssl req -new -newkey rsa:512 -out client.csr -keyout private.key -batch -pubkey -nodes
从配置文件中读取主体相关信息,自动生成512位RSA密钥和证书请求。将私钥保存至private.key文件中;将公钥和证书请求保存至client.csr文件中。指定-nodes选项,密钥文件不加密。
c、生成自签证书
# openssl req -new -x509 -newkey rsa:512 -out client2.crt -keyout private2.key -batch -pubkey -nodes
在自动生成证书请求命令中添加-x509选项即可。
d、查看证书请求和证书内容
# openssl req -in client.csr -text | less
查看证书请求文件的内容。
# openssl x509 -in client2.crt -text | less
查看自签证书文件的内容。
5、利用openssl创建私有CA并签发数字证书
a、根据/etc/pki/tls/openssl.cnf文件的参数配置,在/etc/pki/CA/private/目录下生成私钥,并保存为cakey.pem。
# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
b、根据/etc/pki/tls/openssl.cnf文件的参数配置,在/etc/pki/CA/目录下生成自签证书,并保存为cacert.pem。
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
c、根据/etc/pki/tls/openssl.cnf文件的参数配置,在/etc/pki/CA/目录下生成index.txt(此文件保存已签署的证书信息),serial,并向serial文件中覆盖重定向01数字(此为签署证书的编号)。
# touch /etc/pki/CA/index.txt && touch /etc/pki/CA/serial && echo 01 > /etc/pki/CA/serial
d、签署证书请求。
# openssl ca -in client.csr -out client.crt
通过查看/etc/pki/CA/index.txt文件,可发现自建的私有CA已成功签署了一份证书。
参考文献
[1] Linux.cn. (2016).openssl 证书请求和自签名命令 req 详解-技术 ◆ 学习|Linux.中国-开源社区. [online] Available at: https://linux.cn/article-7248-1.html [Accessed 10 May 2016].
[2] Wikipedia. (2016).Transport Layer Security. [online] Available at: https://en.wikipedia.org/wiki/Transport_Layer_Security [Accessed 10 May 2016].