应用数字证书 保证交易安全

应用数字证书 保证交易安全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 .csr"; exit 1

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 参数用

标签: