Posted on 2008-05-27 17:11 
kooyee 阅读(854) 
评论(0)  编辑  收藏  所属分类: 
SSL  
			 
			
		 
		这里抄录
LDAP+OpenSSL集中认证配置一文的一部分:
公私钥:公钥可以唯一解密私钥加密过的数据,反之亦然。
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的对称加密算法来保证。
这里(P1,V1)就是certificate authority (CA)用来给客户签名用的公私钥。
(P2,V2)是客户自己的公私钥,提交给CA,CA所做的事情就是用(P1,V1)来给客户的(P2,V2)签名,简单吧?
下面我们OpenSSL来做这一整件事情。
先生成CA的公私钥(Root Certificate )
准备工作
 mkdir CA
mkdir CA 
 cd CA
cd CA 
 mkdir newcerts private
mkdir newcerts private 
 echo '01' > serial
echo '01' > serial 
 touch index.txt
touch index.txt 
生成配置文件。由于openssl命令行参数太多,所以就用文件来组织各种选项。
其中,req_distinguished_name 节表示需要提示用户输入的信息。
v3_ca是有关CA公私钥生成的,v3_req是有关用户证书生成的。
ca_default是用CA公私钥签名的时候,用户证书的默认信息。
vi ./openssl.cnf
 dir = .
dir = .

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

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

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

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

 [ v3_req ]
[ v3_req ] 
 basicConstraints = CA:FALSE
basicConstraints = CA:FALSE 
 subjectKeyIdentifier = hash
subjectKeyIdentifier = hash 


 [ ca ]
[ ca ] 
 default_ca = CA_default
default_ca = CA_default 

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

 [ policy_match ]
[ policy_match ] 
 countryName = match
countryName = match 
 stateOrProvinceName = match
stateOrProvinceName = match 
 organizationName = match
organizationName = match 
 organizationalUnitName = optional
organizationalUnitName = optional 
 commonName = supplied
commonName = supplied 
 emailAddress = optional
emailAddress = optional 
生成CA公私钥:
 openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf
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通信示例