目的:模拟两个人使用CA进行密文通讯(其实好像就是SSL干的事)
看了2个攻略后,我理解的步骤是
1,不管三七二十一先为甲(服务器server)和乙方(客户端client)分别生非对称密钥对(xxxx.key文件为私钥,xxxx.csr文件为公钥的前身)
2,CSR文件要成为公钥,必须获得CA的签名
3,所以我们需要一个CA
4,自建一个CA
5,用这个CA给我们两个证书请求签名
6,把证书和私钥封装后发给两位小盆友,需要转化成p12格式
过程
#openssl
RSA的非对称算法目前被量子计算机破解到786位,RSA推荐大家至少要用1024位的key
#openssl req -new -key server2011.key -out server2011.csr -config ./openssl.cnf
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]:JerryPeak
Organizational Unit Name (eg, section) []:JerryPeak
Common Name (eg, YOUR name) []:Jerry Fong
Email Address []:jerry4ng@aol.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:******
An optional company name []:JP
这些blabla的东西是你申请证书所需的信息,注意,如果使用 openssl.cnf中的 默认策在签名过程中ca的信息要和csr中一致,具体策略详见http://secyaher.blog.163.com/blog/static/389557720091029494100/
#openssl genrsa -des3 -out client2011.key 1024
#openssl req -new -key client2011.key -out client2011.csr -config ./openssl.cnf
这样我们就有了2套非对称密钥,当然还需一个ca来签名,下面开始建立ca
# openssl genrsa -des3 -out myrootca.key.pem 2048
# openssl req -new -key myrootca.key.pem -out myrootca.req.pem -config ./openssl.cnf
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]:Jerry CA
Organizational Unit Name (eg, section) []:Jerry CA
Common Name (eg, YOUR name) []:Jerry Peak
Email Address []:justinjia@foxmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:qwerty
An optional company name []:JC
# openssl x509 -req -days 7305 -sha1 -extfile ./openssl.cnf -extensions v3_ca -signkey myrootca.key.pem -in myrootca.req.pem -out myrootca.crt.pem
这是ca给自己签名,这样我们会有一张根证书
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=Jerry CA/OU=Jerry CA/CN=Jerry Peak/emailAddress=justinjia@foxmail.com
Getting Private key
Enter pass phrase for myrootca.key.pem:xxxxxx
#vi ./openssl.cnf
####################################################################
[ CA_default ]
dir = ./JerryCA # Where everything is kept
#mkdir ./JerryCA
#mkdir ./JerryCA/newcrts
#touch ./JerryCA/{serial,index.txt}
#echo "00" > ./JerryCA/serial
#
这是为ca建立工作目 录, 然后开始用ca的私钥给crs签名
# openssl ca -config ./openssl.cnf -extensions v3_ca -in server2011.csr -out server2011.crt -cert JerryCA/myrootca.crt.pem -keyfile JerryCA/private/myrootca.key.pem - policy policy_anything -verbose
得到了server2011.crt 同时newcrts目录下多了一个00.pem
# openssl ca -config ./openssl.cnf -extensions v3_ca -in client2011.csr -out client2011.crt -cert JerryCA/myrootca.crt.pem -keyfile JerryCA/private/myrootca.key.pem - policy policy_anything -verbose
就在执行这条命令的时候,我遇到了麻烦,报错ailed to update database TXT_DB error number 2后,我上网查了一下,似乎是我已经为client2011.csr生成过证书,我修改了openssl.cnf中unique_subject = no,发现还是不成,后来在index.txt同一目录下发现一个index.txt.attr文件,里面居然还有一个unique_subject = yes,改为no后终于ok,下面我要转换证书格式到pkcs#12
参考文献:
http://secyaher.blog.163.com/blog/static/38955772009102941017270/
http://fengzhilinux.blog.51cto.com/1343279/291727
http://rt.openssl.org/Ticket/Display.html?id=502&user=guest&pass=guest 解决TXT_DB的错误
http://blog.chinaunix.net/u2/70777/showart_1844426.html 描述了一般性步骤
----------------------------------------------------------------
http://blog.csdn.net/bell2008/archive/2007/08/02/1723640.aspx 描述了自建CA过程
自己签 Public Key 凭证在 myrootca.crt.pem
--------------------------------------------------------
http://www.weizhifeng.net/?p=854 对各个概念说的非常透彻
几个概念:
CA(Certification Authority,认证中心)
SSL (Secure Sockets Layer,安全套接层协议)
TLS(Transport Layer Security,传输层安全)
CSR (Certificate Signing Request,证书签名请求)
流程:需要启用SSL的服务器自己生成CSR,然后让权威的CA进行签名认证或者
自己创建一个CA证书,然后给自己的CSR签名,不过这样的证书不会被浏览器认可。
1. 创建一个自签名的CA证书:
openssl req -x509 -newkey rsa:1024 -keyout ca.key -out ca.crt
2. 生成服务器CSR:
openssl req -newkey rsa:1024 -keyout server.key -out server.csr
3. 签名:
如果不使需要CA证书签名的话,用如下方式生成:
openssl req -x509 -days 1024 -key server.key -in server.csr > server.crt
如果需要用CA证书签名:
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial
4. 查看证书:
openssl x509 -noout -text -in server.crt
5. 验证证书:
openssl verify -CAfile ca.crt server.crt
6. 生成客户端CSR:
openssl req -newkey rsa:1024 -keyout client.key -out client.csr
7. 用CA证书签名:
openssl x509 -req -in client.csr -out client.crt -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial
8. 转换,使证书可以安装到浏览器:
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx
9. 修改配置文件httpd-ssl.conf:
SSLCertificateFile conf/ssl.crt/server.crt #服务器证书
SSLCertificateKeyFile conf/ssl.key/server.key #服务器私钥
SSLCACertificateFile conf/ssl.crt/ca/ca.crt #CA证书
SSLVerifyClient require #强制浏览器必须安装了证书才能访问
10. 浏览器安装证书:client.pfx
update:
证书链介绍
1. 生成Root CA私钥与证书:
生成RootCA私钥 –> 使用私钥生成CSR –> 生成自签名根证书(用来给二级CA证书签名)。
2. 生成二级CA 私钥与证书:(假如有两个二级CA, 分别负责管理服务器端和客户端证书)
2.1 生成ServerCA私钥 –> 使用私钥生成CSR –> 使用根证书签名生成二级证书(ServerCA证书用来给服务器证书签名)。
2.2 先生成ClientCA私钥 –> 使用私钥生成 CSR–> 使用根证书签名生成二级证书(ClientCA证书用来给客户端证书签名)。
3. 生成服务器端与客户端的私钥与证书:
3.1 生成ServerA私钥 –> 使用私钥生成CSR –> 使用ServerCA证书签名生成三级证书(ServerA证书)。
3.2 生成ClientA私钥 –> 使用私钥生成 CSR–> 使用ClientCA证书签名生成三级证书(ClientA证书)。
3.3 先生成ClientB私钥 –> 使用私钥生成 CSR–> 使用ClientCA证书签名生成三级证书(ClientB证书)。
….可以生成N个客户端证书
1.首先要生成服务器端的私钥(key文件):
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key
2.openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可.
3.对客户端也作同样的命令生成key及csr文件:
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf
4.CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
5.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
现在我们所需的全部文件便生成了.
另:
client使用的文件有:ca.crt,client.crt,client.key
server使用的文件有:ca.crt,server.crt,server.key
.crt文件和.key可以合到一个文件里面,本人把2个文件合成了一个.pem文件(直接拷贝过去就行了)