当了解了常用的加密类型和PKI是什么之后,接下来学习OpenSSL就会很容易理解。OpenSSL正式Linux下提供的开源CA服务器,用以签名、颁发证书,管理已签名证书和已吊销证书等。另外当你想使用公网证书时,需要到互联网上专业的CA机构申请,大概一个证书的费用几千块一年,另外如果是泛域名解析应该会更贵一点。如果是企业内部使用的话就可以使用Openssl搭建一个私有CA,也可以把自己的私有CA经过互联网上的CA服务器认证之后也接入到公网,看需求。
一、OpenSSL介绍
OpenSSL是SSL的开源实现,是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。由两个年轻人开发,现在只有一个人在维护另外一个人去了RSA公司并为RSA公司实现了一种更为强大的商业版加密算法。
什么是SSL?
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
SSL在应用层和传输层之间加了一个半层,基于套接字传输时专用的,所以不是对所有的数据进行加密。Apache使用它加密HTTPS(HTTP (80/tcp)->TLS->HTTPS(443/tcp)),但HTTP跟HTTPS是两个完全不同的协议。另外连接工具OpenSSH使用它加密SSH。
OpenSSL不止是一个加密库,而且还是一个多用途、跨平台的密码加密工具。整个软件包有三部份构成:
Libcrypto:通用加密库提供了各种加密函数。
Libssl:是实现了身份验证,数据机密性和会话完整性的ssl或tls库。
openSSL:提供了多用途的命令行工具可以实现了各种加密和私有证书颁发机构。
密钥和证书管理?
密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。首先,OpenSSL实现了ASN.1 的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL 等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL 提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL 在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。在此基础上,OpenSSL 实现了对证书的X.509 标准编解码、PKCS#12 格式的编解码以及PKCS#7 的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。事实上,OpenSSL 提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
PS:OpenSSL由于很多软件需要依赖,所以一般默认都已经安装了。
二、OpenSSL配置文件
安装完OpenSSL后,默认配置文件在/etc/pki/tls/openssl.cnf中,信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[ CA_default ] dir # Openssl家目录 certs = $dir/certs # 客户端证书保存在什么地方 crl_dir = $dir/crl # 证书吊销列表 database = $dir/index.txt # 保存给哪些人发过证 new_certs_dir = $dir/newcerts # 存放刚生出的证书 certificate = $dir/cacert.pem # 存放ca自己的证书 serial = $dir/serial # 存放已颁发证书的序列号 crlnumber = $dir/crlnumber # 证书吊销列表中已经工作到那个号了 crl = $dir/crl.pem # 当前证书吊销列表的文件是什么 private_key = $dir/private/cakey.pem # 存放ca自己的私钥 RANDFILE = $dir/private/.rand default_days = 365 # 默认证书颁发时间 default_crl_days = 30 # 默认在证书吊销列表中放多久 default_md = sha1 # 单项加密算法默认使用sha1 |
还可以通过主配置文件添加一些默认值,那么就不用在签发证书时提供这些信息,就会直接使用提供的默认值。
三、OpenSSL命令使用
查看OpenSSL帮助信息,就可以看到OpenSSL支持的命令。
standard commands
支持的所有可使用命令,常用命令包含如下。
crl:吊销证书相关操作。
ca:CA证书相关子命令。
enc:加密解密命令。
dgst:提取特征码命令。
passwd:用户密码加密。
rand:字符串随机生成。
genrsa:生成私钥。
rsa:提取公钥。
speed:测试算法的加解密性能。
rsautl:RSA公钥加密解密。
X509:PKI相关标准X.509标准的实现源码。包括了X.509的编解码功能,证书管理功能等。
Smime:提取证书公钥。
version:查看openssl版本。
Message digest command
支持的信息摘要算法,OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA 算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
Cipher commands
支持的加密算法,OpenSSL一共提供了8 种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES 使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名。当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
OpenSSL语法
1 |
$ openssl command [ command_opts ] [ command_args ] |
command
命令的支持就包括上面介绍的:standard commands、Message digest command、以及Cipher commands。
[ command_opts ]
1 2 3 4 5 6 7 8 9 |
-e #表示加密 -d #表示解密 -a/-base64 #base64编码 -in <file> #表示进文件 -out <file> #表示输出文件 -pass <arg> #pass phrase source -k #passphrase is the next argument -kfile #passphrase is the first line of the file argument -md #the next argument is the md to use to create a key |
四、OpenSSL使用示例
1. 对称加密算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 使用DES3算法的CBC模式加密文件/etc/passwd $ openssl enc -des3 -e -in /etc/passwd -out /root/passwd # 使用AES算法的CBC模式加密文件/etc/passwd $ openssl enc -aes-128-cbc -e -in /etc/passwd -out /root/passwd # 使用DES3或AES对文件解密 $ openssl enc -des3 -d -in /root/passwd -out /root/passwd-new $ openssl enc -aes-128-cbc -d -in /root/passwd -out /root/passwd # 对字符串进行base64编码 $ echo -n "redis" | openssl base64 # 获取一段24位的随机加密字符 $ openssl rand -base64 24 |
2. 单项散列算法
1 2 3 4 5 6 |
# 使用sha1提取文件特征码 $ openssl dest -sha1 /etc/passwd # 使用md5提取文件特征码 $ openssl dest -md5 /etc/passwd $ md5sum /etc/passwd |
3. RSA算法
A. 公钥私钥生成
1 2 3 4 5 |
# 产生1024位的rsa私钥 $ openssl genrsa 1024 > private.key # 使用rsa根据私钥提取公钥 $ openssl rsa -in private.key -pubout > public.key |
B. 加密解密
1 2 3 4 5 |
# 使用rsa公钥加密 $ echo -n "123" | openssl rsautl -encrypt -inkey public.key -pubin > rsa.key # 使用rsa私钥解密 $ cat rsa.key | openssl rsautl -decrypt -inkey private.key |
C. 数字签名
1 2 3 4 5 |
# 用私钥匙private.key给文件plain.txt签名,输出到rsa.sign文件中 $ openssl rsautl -sign -inkey private.key -in plain.txt -out rsa.sign # 用公钥匙public.key验证签名rsa.sign,输出到plain.t文件中 $ openssl rsautl -verify -pubin -inkey public.key -in rsa.sign -out plain.t |
D. 签名校验
1 2 3 4 5 6 |
# 用SHA1算法加RSA私钥为文件plain.txt签名,输出到文件rsa.sign $ openssl sha1 -sign private.key -out rsa.sign plain.txt # 用SHA1算法加RSA公钥验证plain.txt文件的数字签名rsa.sign $ openssl sha1 -verify public.key -signature rsa.sign plain.txt Verified OK |
4. DSA算法
A. 公钥私钥
1 2 3 4 5 6 7 8 |
# 生成1024位dsa参数集,并输出到文件dsaparam.pem $ openssl dsaparam -out dsaparam.pem 1024 # 使用参数文件dsaparam.pem生成dsa私钥匙 $ openssl gendsa -out private.key dsaparam.pem # 使用私钥匙private.key生成公钥匙 $ openssl dsa -in private.key -out public.key -pubout |
B. 签名校验
1 2 3 4 5 6 |
# 使用私钥签名 $ echo -n "123" | openssl dgst -dss1 -sign private.key > dsa.sign # 使用公钥验证 $ echo -n "123" | openssl dgst -dss1 -verify public.key -signature dsa.sign Verified OK |
5. DH算法
1 2 3 4 5 6 7 8 9 10 11 |
# 使用生成因子2和随机的1024位的素数产生DH参数,输出保存到文件dhparam.pem $ openssl dhparam -out dhparam.pem -2 1024 # 从dhparam.pem中读取DH参数,以C代码的形式输出 $ openssl dhparam -in dhparam.pem -noout -C # 模拟passwd命令给用户添加密码 $ openssl passwd -1 # 测试本系统上对这种加密算法的速度 $ openssl speed aes |
五、OpenSSL实现私有CA并颁发证书
什么是x509证书链?
x509证书一般会用到三类文件,分别是:key,csr,crt。其中Key是私用密钥,openssl格式,通常是rsa算法实现。csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。crt是CA认证后的证书文件,签署人用自己的key给你签署的凭证。
关于证书使用的基本概念?
首先要有一个CA根证书,然后用CA根证书来签发用户证书。
用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。
特别说明:
1)自签名证书(一般用于顶级证书、根证书):证书的名称和认证机构的名称相同。
2)根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。任何安装CA根证书的服务器都意味着对这个CA认证中心是信任的。
数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的)。因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。
那么自行实现一套证书颁发流程如:CA服务器生成CA私钥(.key)–> CA服务器生成CA自签证书(.csr)–> 自签名得到根证书(.crt)(CA给自已颁发的证书)–> 客户端生成私钥 –> 客户端生成证书签名请求(.crt) –> CA服务器使用自己的证书给客户端签发证书(.pem)。
生成crt证书
1. CA生成证书
1 2 3 4 5 6 |
# Generate CA private key (no password) openssl genrsa -out ca.key 2048 # Generate CSR openssl req -new -key ca.key -out ca.csr # Generate Self Signed certificate openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt |
2. 客户端生成证书
1 2 3 4 5 6 |
# private key $openssl genrsa -des3 -out server.key 1024 # generate csr $openssl req -new -key server.key -out server.csr # generate certificate $openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key |
.key格式:私有的密钥。
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写。
.crt格式:证书文件,certificate的缩写。
生成pem证书
1. CA服务器生成一对秘钥
创建私钥,(umask 077)改变umask并只对此子shell有效,括号内的命令执行结束后即失效。另外 cakey.pem 名称是固定的。
1 2 |
$ cd /etc/pki/CA/private $ (umask 077;openssl genrsa 1024 > cakey.pem) |
2. CA服务器生成自签证书
1 2 3 4 5 6 7 8 9 |
$ cd /etc/pki/CA $ openssl req -new -x509 -key ./private/cakey.pem -out ./cacert.pem -days 365 输入国家名称(2位的代码):CN 输入所在省份的名称:Shanghai 输入所在城市的名称:Shanghai 输入公司的名称:ywnds 输入所在的部门:Tech 输入主机的名称:ca.ywnds.com 输入E-mail:admin@ywnds.com |
这里 ca.ywnds.com 主机名要跟服务器的主机名保持一致,客户端访问主机时必须要通过这个主机名才能建立连接否则会报证书不可信。另外,CA的家目录没做更改的情况下,自签证书必须存放在/etc/pki/CA家目录下,且证书名称必须为cacert.pem。
-new:为生成新的证书会要求用户填写相关的信息。
-x509:通常用于自签证书、生成测试证书或用于CA自签署。
-key /path/to/keyfile:指定私钥文件。
-out /path/to/somefile:指定生成证书位置。
-days:证书申请有效期。
查看证书内容命令:
1 |
$ openssl x509 -text -in cacert.pem |
3. 为CA创建一些目录和文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 签发的证书存放的地方 $ mkdir /etc/pki/CA/certs # 签发新证书存放的地方 $ mkdir /etc/pki/CA/newcerts # 吊销的证书存放的地方 $ mkdir /etc/pki/CA/crl # 数据库的索引文件 $ touch /etc/pki/CA/index.txt # 签发证书的序列号 $ touch /etc/pki/CA/serial # 指定serial起始序列号01 $ echo 01 > /etc/pki/CA/serial |
4. 客户端生成私钥
1 |
$ (umask 077; openssl genrsa -out /tmp/serverKey.pem 2048) |
5. 客户端生成证书签名请求
证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写。
1 2 3 4 5 6 7 8 |
$ openssl req -new -key /tmp/serverKey.pem -out /tmp/serverCsr.pem 输入国家名称2位的代码:CN 输入所在省份的名称:Shanghai 输入所在城市的名称:Shanghai 输入公司的名称:ywnds 输入所在的部门:Tech 输入主机的名称:www.test.com 输入E-mail:admin@test.com |
这里 http://www.test.com 主机名要跟服务器的主机名保持一致,客户端访问主机时必须要通过这个主机名才能建立连接否则会报证书不可信。在生成证书签名请求时,除了主机名和邮件地址自定义外,其余信息要与CA服务器自签证书时使用的信息一致。
6. CA服务器对请求节点证书进行签名
1 |
$ openssl ca -in /tmp/serverCsr.pem -out /tmp/server.pem -days 365 -cert ./cacert.pem |
openssl会利用自签证书/etc/pki/CA/cacert.pem对serverCsr.pem进行签名,并生成server.pem证书,经过CA签名之后就可以部署给 http://www.test.com 主机使用。
签发证书时可能会出现:failed to update database,将 common name 设置成不同的就可以了。
这里注意,我的证书申请节点跟CA都在同一台服务器上,希望你不要搞蒙了。其实在实现环境中大概也是这样完成的,你提供域名跟邮件地址给CA提供商,然后CA提供商就会在CA服务器上完成以上操作然后把签名后的证书发送给你使用。
六、证书管理
1. 查看CA信息
1 2 3 4 5 |
$ cat /etc/pki/CA/serial 02 $ cat /etc/pki/CA/index.txt V 160330175207Z 01 unknown ……. |
每签发一个证书,签发证书的序列号就会加1。另外证书数据库中此证书为“V”,表示正在使用。
2. CA管理证书
查看证书信息。
1 2 3 |
$ openssl x509 -in /tmp/cakey.crt -noout -serial -subject serial=01 subject=/C=cn/ST=shanghai/O=ywnds/OU=tech/CN=www.test.com/emailAddress=admin@test.com |
如果需要吊销证书,要将此信息发送给CA服务管理员,管理员在核对信息无误后对证书进项吊销操作,随后你需要重新申请证书。
1 |
$ openssl ca -revoke /etc/pki/CA/newcerts/01.pem |
更新证书吊销列表。
1 |
$ openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl |
查看吊销信息V变成R。
1 |
$ cat /etc/pki/CA/index.txt |
3. 从证书中提取公钥(RSA)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ openssl x509 -outform PEM -in /etc/pki/CA/cacert.pem -pubkey -----BEGIN PUBLIC KEY---- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVWYObdmwky3SdlvOCXsLuc4Nh VLkC/mqYXfmbI/u75hsOr2x7k2kF+A8fYTmkmgWKTbEJMycaBfeQ0wD359N3KfAD FcHHGeRpyRi+NrumPADHEzFX5G0WhI2g13qPC6vm0AmLjmx4cHxaXSqrp7CHIObQ eNKdVF44SCE41D+J9QIDAQAB -----END PUBLIC KEY----- -----BEGIN CERTIFICATE----- MIIC3DCCAkWgAwIBAgIJAKsIIb1YtAOeMA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD VQQGEwJjbjERMA8GA1UECAwIc2hhbmdoYWkxETAPBgNVBAcMCHNoYW5naGFpMQ4w DAYDVQQKDAV5d25kczENMAsGA1UECwwEdGVjaDEVMBMGA1UEAwwMY2FAeXduZHMu Y29tMRswGQYJKoZIhvcNAQkBFgxjYUB5d25kcy5jb20wHhcNMTUwMzMxMTc1MDM1 WhcNMTYwMzMwMTc1MDM1WjCBhjELMAkGA1UEBhMCY24xETAPBgNVBAgMCHNoYW5n aGFpMREwDwYDVQQHDAhzaGFuZ2hhaTEOMAwGA1UECgwFeXduZHMxDTALBgNVBAsM BHRlY2gxFTATBgNVBAMMDGNhQHl3bmRzLmNvbTEbMBkGCSqGSIb3DQEJARYMY2FA eXduZHMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVWYObdmwky3Sd lvOCXsLuc4NhVLkC/mqYXfmbI/u75hsOr2x7k2kF+A8fYTmkmgWKTbEJMycaBfeQ 0wD359N3KfADFcHHGeRpyRi+NrumPADHEzFX5G0WhI2g13qPC6vm0AmLjmx4cHxa XSqrp7CHIObQeNKdVF44SCE41D+J9QIDAQABo1AwTjAdBgNVHQ4EFgQUPbLDOYi8 uSO6pzqmc7xB7HR2m+owHwYDVR0jBBgwFoAUPbLDOYi8uSO6pzqmc7xB7HR2m+ow DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBon7J73we4ZmUmj483F/HZ s4rhdItjkfiSPpNHrw82NiQjWLPCH4iBKQkhrBLJJEkkKllYjFMYYW4+xU7adIfS hLK1+OKxVcXi9YuHoWIawakttWN2YVzz3xn2Z4Eb4JgB/y1DbBYCO46w86lKH01c U6KYnf2K10v0hBOmrI8UtA== -----END CERTIFICATE----- |