這里抄錄
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通信示例
posted on 2006-12-01 15:20
我愛佳娃 閱讀(15060)
評論(14) 編輯 收藏 所屬分類:
SSL