随笔-122  评论-194  文章-0  trackbacks-0
这里抄录LDAP+OpenSSL集中认证配置一文的一部分:
公私钥:公钥可以唯一解密私钥加密过的数据,反之亦然。以下用P指代公钥,V指代私钥。
SSL过程:需要两对公私钥(P1,V1),(P2,V2),假设通信双方是A和B,B是服务器,A要确认和它通信的是B:
A->B: hello
B->A: 用V2加密过的P1(即用户证书,A就用P2解密出P1)
A->B: ok
B->A: 用V1加密的一段信息
A->B: 用P1加密一个自动生成的K(用之前的P1解密成功这段信息则认为B是可信的了)
B->A: 用K加密的数据(之后两对密钥功能结束,由K来加解密数据)
这里,P2就是第3方的CA证书,由于非对称加密很慢,所以公私钥只是用来保证K的传送安全,之后通信是用K的对称加密算法来保证。

为什么通过以上过程A就能够确定肯定是B,而不是某个C在假装B了呢?因为这个过程中,B用V1加密过一段信息发给A,A也成功解开了。我们开头谈到公钥(P1)只可以唯一解密私钥(V1)加密过的信息,这样A就可以完全相信B是拥有V1的,而V1是严格保密,只被服务提供公司拥有,所以保证了通信的服务方正确性。

这里(P2,V2)就是certificate authority (CA)用来给客户签名用的公私钥。
(P1,V1)是客户自己的公私钥,提交给CA,CA所做的事情就是用(P2,V2)来给客户的(P1,V1)签名,简单吧?
V2是CA公司要保密的,而P2就是公用CA证书。用V2加密过(签名过)的P1,称为用户证书,一般被安装在服务器端。

下面我们OpenSSL来做这一整件事情。

先生成CA的公私钥(Root Certificate )
准备工作
mkdir CA 
cd CA 
mkdir newcerts private 
echo '
01' > serial 
touch index.txt 

生成配置文件。由于openssl命令行参数太多,所以就用文件来组织各种选项。
其中,req_distinguished_name 节表示需要提示用户输入的信息。
v3_ca是有关CA公私钥生成的,v3_req是有关用户证书生成的。
ca_default是用CA公私钥签名的时候,用户证书的默认信息。

vi ./openssl.cnf
dir = .

[ req ] 
default_bits 
= 1024 # Size of keys 
default_keyfile 
= key.pem # name of generated keys 
default_md 
= md5 # message digest algorithm 
string_mask 
= nombstr # permitted characters 
distinguished_name 
= req_distinguished_name 
req_extensions 
= v3_req 

[ req_distinguished_name ] 
# Variable name   Prompt string 
#----------------------   ---------------------------------- 
0.organizationName = Organization Name (company) 
organizationalUnitName 
= Organizational Unit Name (department, division) 
emailAddress 
= Email Address 
emailAddress_max 
= 40 
localityName 
= Locality Name (city, district) 
stateOrProvinceName 
= State or Province Name (full name) 
countryName 
= Country Name (2 letter code) 
countryName_min 
= 2 
countryName_max 
= 2 
commonName 
= Common Name (hostname, IP, or your name) 
commonName_max 
= 64 

# Default values for the above
, for consistency and less typing. 
# Variable name   Value 
#------------------------------   ------------------------------ 
0.organizationName_default = EB Company 
localityName_default 
= Shen Zhen 
stateOrProvinceName_default 
= Guan Dong
countryName_default 
= CN

[ v3_ca ] 
basicConstraints 
= CA:TRUE 
subjectKeyIdentifier 
= hash 
authorityKeyIdentifier 
= keyid:always,issuer:always 

[ v3_req ] 
basicConstraints 
= CA:FALSE 
subjectKeyIdentifier 
= hash 


[ ca ] 
default_ca 
= CA_default 

[ CA_default ] 
serial 
= $dir/serial 
database 
= $dir/index.txt 
new_certs_dir 
= $dir/newcerts 
certificate 
= $dir/cacert.pem 
private_key 
= $dir/private/cakey.pem 
default_days 
= 365 
default_md 
= md5 
preserve 
= no 
email_in_dn 
= no 
nameopt 
= default_ca 
certopt 
= default_ca 
policy 
= policy_match 

[ policy_match ] 
countryName 
= match 
stateOrProvinceName 
= match 
organizationName 
= match 
organizationalUnitName 
= optional 
commonName 
= supplied 
emailAddress 
= optional 


生成CA公私钥:
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf 

会提示输入密码,当用它给用户证书签名时需要输入,以避免其它人用它随意产生用户证书。
-days表示有效期,因为它是根证书,所以时间一定要很长,否则由它生成的用户证书容易过期。

这时就生成了:
P1
cacert.pem
V1
private/cakey.pem

查看信息用:
openssl x509 -in cacert.pem -noout -text


生成P2,V2,即Certificate Signing Request (CSR)
执行:
openssl req -new -nodes -out req.pem -config ./openssl.cnf
这样就生成了:
P2
req.pem
V2
key.pem

用此命令查看:
openssl req -in req.pem -text -verify -noout


用CA的私钥V1为P2签名,即生成用户证书
执行:
openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
生成用户证书:
cert.pem
此时,会拷贝一份到newcerts目录下。并会更新数据库文件:index.txt以及serail文件
用命令查看:
openssl x509 -in cert.pem -noout -text -purpose | more

如果要去除可读信息部分,执行:
mv cert.pem tmp.pem
openssl x509 -in tmp.pem -out cert.pem


安装证书
key.pem(V2)和cert.pem(用V1加密过的P2)安装到服务端
有的服务器需要把这两个文件连为一个,可以执行:
cat key.pem cert.pem >key-cert.pem

cacert.pem安装到客户端

Apache的配置:
File          Comment
/home/httpd/html Apache DocumentRoot
/home/httpd/ssl      SSL-related files
/home/httpd/ssl/cert.pem Site certificate
/home/httpd/ssl/key.pem Site private key

Stunnel的配置
stunnel -p /etc/ssl/certs/key-cert.pem 


编辑于08.4.26,另有两个例子:
用OpenSSL与JAVA(JSSE)通信
Perl与Java的SSL通信示例



有兴趣可以访问下我的生活博客:qqmovie.qzone.com
posted on 2006-12-01 15:20 我爱佳娃 阅读(13831) 评论(14)  编辑  收藏 所属分类: SSL

评论:
# re: 用OpenSSL做自签名的证书 2007-04-02 20:08 | 程徐彬
你好,能帮个忙吗,在LINUX中怎么安装OPENSSL。我是刚学的,请多多指教!那些网上的帮助文档,我用过了,可是不行,你能不能帮我整理一下,实在是太感谢了!我的QQ是214296442,请问你的是多少,以后向你请教一下!谢谢!  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2007-04-03 16:36 | 我爱佳娃
我是这样安装的:
# cd openssl-0.9.7e
# ./config shared --prefix=/usr # Build shared library
# make clean
# make
# make install
  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-01-14 17:04 | lgc
你好,请问一下上面的openssl。cnf文件指定了下面内容,
[ CA_default ]
serial = $dir/serial
database = $dir/index.txt

我做java与openssl通信的时,用ca证书对某个公钥进行签名时,提示找不到serial和index.txt。不知怎么解决,请指教,谢谢
  回复  更多评论
  
# re: 用OpenSSL做自签名的证书[未登录] 2008-01-14 22:13 | 我爱佳娃
$dir变量是在开始时候赋值的呀:
dir = .
就是当前目录,这两个文件都要自己创建的,我的文章里写得很清楚呀:
echo '01' > serial
touch index.txt
这两句就是创建文件的。

我自己用这个文档签名过很多次了,不出任何问题。  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-04-23 00:53 | cici
生成CA公私钥:
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf
为什么我只能生成 cacert.pem 而没有private/cakey.pem
谢谢!正在学习当中!!!谢谢  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-04-23 02:20 | cici
哦,生成了cakey.pem ,没注意,呵呵
还有个问题请教:
能解释下最后的服务器和客户端配置吗?
或者举个代码的例子实现?
谢谢!!!!!!!  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-04-26 09:21 | 我爱佳娃
嘿嘿,你没仔细看博,我举了代码例子的:http://www.blogjava.net/alwayscy/archive/2006/12/04/85368.html  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-04-26 09:21 | 我爱佳娃
# re: 用OpenSSL做自签名的证书 2008-10-20 14:37 | kudiejlq
对以下内容的疑问:

SSL过程:需要两对公私钥(P1,V1),(P2,V2),假设通信双方是A和B,B是服务器,A要确认和它通信的是B:
A->B: hello
B->A: 用V2加密过的P1(即用户证书,A就用P2解密出P1)
.......

第二步,即B->A这一步,感觉有些问题。v2是CA的私钥,如果p1是经由v2加过密的,那么考虑一种这样的情况:客户浏览器中没有此CA的根证书,即没有p2会怎么样,它根本就不能解密出p1, 也无从知道是哪个ca颁布的证书。即使有该CA的根证书,在不知道P1的内容前,它怎么知道用这个P2(而不是P3或者P4)去解密出P1?所以,我认为CA没有加密P1,只是用V2对P1进行的签名。

期待继续讨论:kudiejlq@126.com


  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-10-20 14:40 | kudiejlq
对以下内容的疑问:

SSL过程:需要两对公私钥(P1,V1),(P2,V2),假设通信双方是A和B,B是服务器,A要确认和它通信的是B:
A->B: hello
B->A: 用V2加密过的P1(即用户证书,A就用P2解密出P1)
.......

第二步,即B->A这一步,感觉这里有些问题。v2是CA的私钥,如果p1是经由v2加过密的,那么考虑一种这样的情况:客户浏览器中没有此CA的根证书,即没有p2会怎么样? 它根本就不能解密出p1, 也无从知道是哪个ca颁布的证书。即使有该CA的根证书,在不知道P1的内容前,它怎么知道用这个P2(而不是P3或者P4)去解密出P1?所以,我认为CA没有加密P1,只是用V2对P1进行了签名。

期待继续讨论:kudiejlq@126.com
  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2008-12-11 08:45 | xingpo
兄弟,我怎么感觉这文章看起来有些问题!不连惯!希望兄弟查看一下  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2010-08-19 09:59 | s
good  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2010-12-24 03:16 | mf
真的很不错,澄清了我的一些误解。  回复  更多评论
  
# re: 用OpenSSL做自签名的证书 2013-04-16 16:58 | 张飞
@mf
这也做的太简陋了吧 这个评论框  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: