Openssl建立CA系统
关键词:SSL、RSA简单实例、matlab乘幂取余、OPENSSL应用、用户CA建立
1.SSL简介(百科)
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL的数字证书采用非对称加密算法确保安全性。
2.RSA简介(百科)
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:B=A^e1 mod n;A=B^e2 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
3.RSA简单应用例
取p=13,q=19,n=p*q=247=11110111b,(p-1)(q-1)=216=2*2*3*2*3*3,假设取e1=5,则e2=(216*x)/5 + 1/5其中x为任意整数进一步可取x为4得一个e2=173,则公钥(5,247),私钥(173,247);n长度为8,对明文按每4bit单元(为保证加密后数据不丢失,这里明文编码最大加密单元能表示的编码数要小于247)进行加密,加密后数据按8bit保存,如
原始明文=FEDCBA9876543210,用数组表示[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]
加密明文,加密后密文=[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]^5 mod 247=[97 105 52 103 7 212 16 164 11 119 161 36 243 32 1 0]
密文解密,解密后明文=[97 105 52 103 7 212 16 164 11 119 161 36 243 32 1 0]^173 mod 247=[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]=FEDCBA9876543210
针对a^b mod c的运算,当a,b值很大时不能直接计算,需要用到乘幂取余,利用a*b%c=((a%c)*(b%c))%c及幂的二进制展开方法,下面是matlab计算a^b mod c的方法:
%------------------------------------
function y=a_b_mod_c(a,b,c)
%a可以输入一维数组,a,b,c的值必须小于32位整型最大值
if a >= 4294967295 | b >= 4294967295 | c >= 4294967295
error('Input a_b_mod_c(a,b,c) a,b,c must less than 4294967295');
end
int32_b = uint32(b);
int32_c = uint32(c);
y = [];
for m=1:max(size(a))
fresult = a(m);
result = 1;
for n=1:32
if bitget(int32_b,n)==1
result = mod(result*fresult,int32_c);
end
fresult = mod(fresult*fresult,int32_c);
end
y =[y,double(result)];
end
4.安装openssl
安装openssl软件包,openssl version可以查看版本,本文档实验openssl版本0.9.8k 25 Mar 2009
5.生成RSA密钥
如果需要对RSA密钥进行密码保护,方法:
$openssl genrsa -des3 -out privkey.pem 2048
如果不需要对RSA密钥进行密码保护,方法:
$openssl genrsa -out privkey.pem 2048
生成2048位的密钥,des3为密钥加密方法
6.生成证书请求和自签名证书
生成证书请求文件cert.csr可以由其它CA机构进行签名,假设CA机构是直接顶层权威机构,它公之于众的证书就是rootca.pem。
$openssl req -new -key privkey.pem -out cert.csr
顶层权威机构会给cert.csr用它的密钥进行签名,最终给你一个文件cacert.pem,这个就是和privkey.pem配对的数字证书。有了privkey.pem和cacert.pem,就可以和其它信任rootca.pem的系统进行依赖于数字证书认证的SSL通信了。
如果自己就是CA顶层权威机构(比如自己做实验),那么先前生成的privkey.pem就是ROOT CA的密钥,这个密钥会用来签名用户数据证书。顶层CA机构需要一个公之于众的根证书,用privkey.pem给自己签名生成一个根证书,方法:
$openssl req -new -x509 -key privkey.pem -out rootca.pem -days 1095
生成根证书会提示输入很多相关信息。
7.建立自己的CA系统
建立自己的CA系统,上面6生成的自签名证书就可以做根证书,为方便可将privkey.pem改名为cakey.pem,rootca.pem改名为cacert.pem,然后配置openssl.cnf文件。
建立自己的CA根目录,如/home/thq/myca,由于是测试自己的CA系统,可以从/etc/ssh/openssl.cnf拷贝一份到/home/thq/myca目录:
配置自己的openssl.cnf文件,修改CA_default如MyCA,其它配置如下
图中可以看出需要在myca目录下创建一些目录和文件:
$cd /home/thq/myca
$mkdir certs crl newcerts private
$touch index.txt
$echo 01>serial
$echo 01>crlnumber
$chomd 777 -R .
拷贝前面生成的cakey.pem和cacert.pem到指定目录,降低CA policy
# For the CA policy
[ policy_match ]
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
生成用户密钥和证书请求
$openssl genrsa -out userkey.pem 2048
$openssl req -new -key privkey.pem -out usercert.csr
生成证书,证书生成目录/home/thq/newcerts:
$openssl ca -in usercert.csr -config /home/thq/myca/openssl.cnf
/home/thq/newcerts/01.pem即为usercert.pem,可以看到/home/thq/myca/serial和index有变化。
8.吊销证书并生成CRL列表
吊销证书
$cd /home/thq/myca/newcerts
$openssl ca -revoke usercert.pem -config /home/thq/myca/openssl.cnf
生成CRL列表
$cd /home/thq/myca/crl
$openssl ca -gencrl -out myca.crl -config /home/thq/myca/openssl.cnf
9.总结
至此生成的文件有:
CA密钥:cakey.pem
CA证书(根证书):cacert.pem
用户密钥:userkey.pem
用户证书:usercert.pem
CA证书吊销列表CRL:myca.crl
这样CA建立完毕,如果多个用户都到myca申请证书,由于所有用户都信任cacert.pem,也信任由myca签名的证书,所以用户间可以交换自己的usercert.pem进行安全认证,并建立安全通信。