应用数字证书 保证交易安全
应用数字证书 保证交易安全2007-01-02 10:48:18网络的安全问题得到人们的日益重视。网络面临的威胁五花八门:内部窃密和破坏、截收、非法访问、破坏信息的完整性、冒充和破坏系统的可用性、重演
应用数字证书 保证交易安全
2007-01-02 10:48:18
网络的安全问题得到人们的日益重视。网络面临的威胁五花八门:内部窃密和破坏、截收、非法访问、破坏信息的完整性、冒充和破坏系统的可用性、重演及抵赖等。于是公钥基础设施(Public Key Infrastructure,PKI )应运而生。PKI 是电子商务和其它信息系统的安全基础,用来建立不同实体间的“信任”关系。它的基础是加密技术,核心是证书服务。用户使用由证书授权认证中心(Certificate Authority,CA )签发的数字证书,结合加密技术,可以保证通信内容的保密性、完整性、可靠性及交易的不可抵赖性,并可以进行用户身份的识别。 本文分析公钥基础设施涉及的5个主要算法和应用:数字签名、数字信封、数字证书、私钥管理和密钥协定,描述目前电子政务CA 建设中双证书体系的概念,接着讲述如何用Openssl 作认证中心、申请证书和使用证书,最后讲述SSL 协议如何使用证书和加密技术建立安全通信通道。
数字证书算法
数字签名
数字签名算法包括签名过程和识别过程两部分(见图1)。签名过程是签名者使用自己的私钥对消息的摘要进行加密的过程,被加密的摘要就是签名。为什么只对消息的摘要进行加密呢?因为所有的公钥加密算法在加密速度上比较慢(相对对称加密算法),同时消息摘要算法具有单一性,即不可能具有两个消息在同一摘要算法的运算下产生相同的摘要,算法产生的消息摘要具有固定长度(比如128位),所以利用公钥加密算法才比较合适。签名和原消息一起形成了签名消息。签名消息经过信息传递渠道可以发送到多个接收者手中,后者利用消息发送者的证书对签名进行解密,得到摘要2,签名消息中的原文被同样的摘要算法进行运算得到消息摘要1,两个摘要进行对比,接收者就可以判断消息的完整性。同样发送者也不能对消息的发送进行抵赖。值得注意的是,整个过程中,接收者不需要任何自己的东西,任何人只要具有发送者的证书,不会涉及一丝的保密信息就可以验证消息。
数字签名中的证书在双证书机制中也被称为签名证书,签名证书的私钥被消息的发送者唯一保存。
,图1 数字签名过程图
数字信封
数字信封就是消息加密,具体操作见图2。利用对称加密算法(比如DES) 对比较长的消息(相对密钥) 进行加密,再利用接收者的证书对密钥进行加密,加密消息和加密密钥一起发送给消息接收者。后者利用自己的私钥对加密密钥解密得到密钥,接着用密钥对加密消息进行解密得到消息原文。与数字签名一样,消息的发送者不会涉及任何保密内容,只要知道接收者证书的人都可以向他发送数据信封封装消息。
数字信封应用不仅在商业中很受关注,在国家安全和商业损失上都很受重视,相应的私钥托管就出现了。私钥托管指证书的所有者除了自己拥有证书对应的私钥外,还必须把自己的私钥交给一个或多个国家指定的托管机构进行保管。为了加强安全和减少腐败,每个托管机构只保管私钥的一部分。私钥托管可以应付以下情况:当私钥的所有者丢失私钥,但手头已有大量的重要数字信封封装消息时,私钥的所有者可以申请获得私钥。当国家机关获得授权要对某个可疑人士进行信息跟踪时,可以申请获得私钥。数字信封应用中的证书在双证书体系中又叫加密证书。注意数字信封应用中加密消息的不是证书本身,而是公钥加密的密钥。
,图二 数字信封
数字证书
证书的申请者利用对称钥算法产生一对公钥和私钥,接着使用证书申请算法把自己的标识和公钥变成证书签名申请文件。CA 证书认证中心用自己的私钥对证书信息进行签名形成申请者的证书。
CA 也可以用数字签名发放证书收回列表(见图3)。在证书信息中可以有证书拥有者的名字、电子邮件、授权信息等其它消息。
,图三 数字证书
私钥管理
私钥在PKI 系统中非常重要,私钥的泄密会给所有者造成不可预估的损失。在个人的私钥管理中,一般通过口令对私钥进行加密保存,另用“所有和所知”双重防护进行保护。这种方法适用于签名证书私钥的管理,见图4。
为了监视和防止计算机犯罪活动,人们提出了密钥托管(Key Escrow ,KE )的概念,指国家强制规定进行的私钥托管。为防止用户逃避托管,密钥托管技术的实施需要通过政府的强制措施进行。用户必须先委托密钥托管机构(KEA )进行密钥托管,取得托管证书,才能向CA 申请加密证书。CA 必须在收到加密公钥对应的私钥托管证书后,再签发相应的公钥证书。为了防止KEA 滥用权限及托管密要的泄漏,用户的私钥被分成若干部分,由不同的密钥托管机构负责保存。只有将所有的私钥分量合在一起,才能恢复用户私钥的有效性。用户选择若干个KEA ,分给每一个代理一部分私钥和一部分公钥。代理根据所得的密钥分量产生相应的托管证书。证书中包括该用户的特定表示符(Unique Identify,UID )、被托管的那部分公钥和私钥、托管证书的编号。KEA 还要用自己的签名私钥对托管证书进行加密,产生数字签名,并将其附在托管证书上。用户收到所有的托管证书后,将证书和完整的公钥递交给CA ,然后申请证书。这种机制适用于加密证书私钥的管理。这样签名证书的私钥世界上只有一份,而加密证书私钥就可能有若干份了。
,图四 私钥管理
密钥协定
密钥算法在加密大规模内容时更加有效(见图5) 。使得通信双方对加密密钥达成共识的应用叫密钥协定。内容传输之前双方经过密钥协定算法得到共同的密钥,之后大家就可以利用非对称加密算法对通信信道进行加密。典型的密钥协定有PKCS #3,即Diffie-Hellman 协定标准。 PKCS #3算法由两个阶段组成,而且通信双方都是互相独立运算。第二阶段互用对方第一阶段的公有输出值作为输入的一部分,最后得到一致的密钥。密钥不必在通信信道上传输。其实在数字信封中也有密钥交换的过程,只是密钥由发送方计算,用接受方公钥加密,接着传输给接受方。因为密钥被接受方的公钥加密,所以只有接受方能解密得到密钥。
,图五 密钥协定
使用Openssl 管理证书
服务方制作CA
1.为CA 生成一个私钥
$ openssl genrsa -des3 -out ca.key 1024
用以上命令将生成一个RSA 私钥,利用Triple-DES 加密,输出格式为PEM 。备份上面生成的私钥ca.key 很重要。在指令执行期间,需要输入访问私钥的口令。这个口令需要好好保存。
$ openssl rsa -noout -text -in ca.key
上面的指令可以显示私钥的内容,指令处理私钥之前会向你询问访问私钥的口令。用下面的指令可以生成一个不需要口令保护的私钥,但不建议这样做:
$ openssl rsa -in ca.key -out ca.key.unsecure
上面的三个指令用的都是RSA 体系,OPENSSL 还提供DSA 体系指令。
2.用私钥创建一个自签名X509 证书
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
以上指令用刚才生成的私钥制作了一个自签名的证书,虽然req 命令主要用于生成和处理证书请求,生成自签名证书是一个额外的功能。你可以用下面的指令查看证书的内容:
,$ openssl x509 -noout -text -in ca.crt
服务方制作证书管理环境
证书的管理有证书系列号的分配、证书的保存、证书的状态,Openssl 提供的CA 程序就是这样一个命令,证书管理比较复杂,在没有很好的GUI 界面程序出现之前最好用如下的脚本来颁发证书。这个脚本首先会在当前目录下生成一个目录ca.db.certs 。这个目录用来保存发放的证书,文件名的形式为“系列号.pem”。脚本还会生成一个ca.db.series 的文件,保存当前颁发证书的系列号。生成的另外一个文件是ca.db.index ,这是一个索引文件,保存了系列号和证书的DN 名的映射。脚本接着生成一个配置文件,之后以配置文件、申请证书的请求为材料调用CA 程序生成用户的证书。Openssl 提供的CA 程序为把原来的ca.db.index 和ca.db.series 保存为相应的.old 文件并生成新的文件,而且在ca.db.certs 目录下保存了用户证书的一个副本。最后脚本清除现场退出。 #!/bin/sh
##
## sign.sh -- Sign a SSL Certificate Request (CSR)
## Copyright (c) 1998-2001 Ralf S. Engelschall, All Rights Reserved.
##
# argument line handling
CSR=$1
if [ $# -ne 1 ]; then
echo "Usage: sign.sh
fi
if [ ! -f $CSR ]; then
echo "CSR not found: $CSR"; exit 1
fi
case $CSR in
*.csr ) CERT="`echo $CSR | sed -e ''s/.csr/.crt/''`" ;;
* ) CERT="$CSR.crt" ;;
esac
# make sure environment exists
if [ ! -d ca.db.certs ]; then
mkdir ca.db.certs
fi
if [ ! -f ca.db.serial ]; then
echo ''01'' >ca.db.serial
fi
if [ ! -f ca.db.index ]; then
cp /dev/null ca.db.index
fi
,# create an own SSLeay config
cat >ca.config <
[ ca ]
default_ca = CA_own
[ CA_own ]
dir = .
certs = $dir
new_certs_dir = $dir/ca.db.certs database = $dir/ca.db.index serial = $dir/ca.db.serial RANDFILE = $dir/ca.db.rand certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 365
default_crl_days = 30
default_md = md5
preserve = no
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied emailAddress = optional
EOT
# sign the certificate
echo "CA signing: $CSR -> $CERT:"
openssl ca -config ca.config -out $CERT -infiles $CSR echo "CA verifying: $CERT <-> CA cert"
openssl verify -CAfile ca.crt $CERT
# cleanup after SSLeay
rm -f ca.config
rm -f ca.db.serial.old
rm -f ca.db.index.old
# die gracefully
exit 0
,用户申请证书
1.先生成私钥
使用下面的命令用户可生成一个RSA 私钥,用Triple-DES 加密, 密钥的输出格式为PEM ,指令执行时会询问日后访问私钥的口令。注意妥善保管好私钥和访问私钥的口令:
$ openssl genrsa -des3 -out tom.key 1024
用下面的指令可以查看私钥内容(需要提供私钥访问口令):
$ openssl rsa -noout -text -in tom.key
你也可以生成一个不需要口令访问的私钥:
$ openssl rsa -in tom.key -out tom.key.unsecure
2.用如上的私钥生成一个证书签名申请(CSR) :
$ openssl req -new -key tom.key -out tom.csr
你需要提供识别全限定域名(FQDN ),比如:
有些内容可以填写,有些内容可以不填,全限定名非常重要。人家信不信任你基本就靠它了。另外注意填写E-mail 或电话之类的,证书颁发机构便于与你联系。当然你也可以用下面的指令查看请求内容:
$ openssl req -noout -text -in tom.csr
证书签名申请,也可以使用其它的程序。一些需要使用证书的程序都有这个功能,比如微软的IIS 服务器。
服务方颁发证书
当服务方接到用户的CSR 文件之后(CSR 文件的传递方式可以是E-mail 或网上提
,交),可以用CSR 里的E-mail 或电话等联系方式和用户确认信息。在决定颁发证书之后,执行下面指令生成用户证书:
$ sign.sh tom.csr
生成的tom.crt 就是用户证书。
用户获得证书
用户获得证书后,可以用内容文字编辑器打开证书。Openssl 程序输出的证书缺省为PEM 格式,证书的全部内容在“-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----”之间。注意不要修改“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”之间的任何部分,其它的内容可以去掉。
对于那些不能识别PEM 格式证书的程序,可以用下面的指令生成DER 格式的证书:
$ openssl x509 -in tom.crt -out cert.der -outform DER
用户使用证书
1.数字签名
smime 指令的-sign 参数用于对邮件进行签名:
$openssl smime -sign -in my.txt -out my.sign -inkey tom.key -singer tom.crt
2.验证签名
smime 指令的-verify 参数用于对邮件签名进行验证:
$openssl smime -verify -in my.sign -out my.txt -ceritfile tom.crt -CAfile ca.crt
3.数字信封(加密)
smime 指令的- encrypt参数用于对邮件进行加密:
$openssl smime -encrypt -in my.txt -out my.enc tom.crt
4.数字信封(解密)
smime 指令的- encrypt参数用于对邮件进行解密:
$openssl smime -decrypt -in my.enc -out my.txt1 -inkey tom.key -recip tom.crt
5.签名后加密
smime 指令的-sign 参数用于对邮件进行签名,接着smime 指令的- encrypt 参数用