这里抄录
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通信示例
公私钥:公钥可以唯一解密私钥加密过的数据,反之亦然。以下用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 )
准备工作





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



































































生成CA公私钥:

会提示输入密码,当用它给用户证书签名时需要输入,以避免其它人用它随意产生用户证书。
-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通信示例