数字证书

  网络的安全问题得到人们的日益重视。网络面临的威胁五花八门:内部窃密和破坏、截收、非法访问、破坏信息的完整性、冒充和破坏系统的可用性、重演及抵赖等。于是公钥基础设施(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  <whatever>.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 <<EOT
[ 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),比如:

Country Name(2 letter code) [GB]: CN
State or Province Name(full name) [beijing]: Beijing
Locality Name(eg, city) [beijing]:Beijing
Organization Name ( eg, company)[My Company]:legend
Organizational Unit Name ( eg, section): SDC
Common Name(eg, your name or your server name)[]: tom.legend.com
Email address []:tom@legend.com
...

  有些内容可以填写,有些内容可以不填,全限定名非常重要。人家信不信任你基本就靠它了。另外注意填写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参数用于对邮件进行加密:

  $openssl smime -sign -in my.txt -out my.sign -inkey tom.key -singer tom.crt

  $openssl smime -encrypt -in my.txt -out my.enc tom.crt

  6.生成一个包含私钥的数字证书

  包含私钥的数字证书用于证书导入、导出和保存,这样的证书标准为pcks12。Openssl的pkcs12处理命令为:

  $openssl pkcs12 -export -in tom.crt -out server.p12 -inkey tom.key -name "my key and certificate"

  用户提供证书和私钥以及一个用户好记忆的名字,上面的指令为我们生成一个pkcs12 标准的证书tom.p12。这个证书可用于浏览器导入。

  SSL使用证书和加密构筑安全通信

  SSL协议同时使用了公钥加密和对称加密。就像先前所述对称加密要比公钥加密快,但是在用户认证方面没有公钥方便。SSL会话是客户方和服务方的连接,一个SSL会话从SSL握手开始。握手允许服务方利用公钥技术向客户方认证自己,如果需要客户方向服务方认证自己,同时认证客户端,在互相认证自己的同时,建立了对称加密的密钥协定。下面大概描述一下SSL会话握手过程:

  ◆ 客户端向服务端发送数据,如SSL版本号、加密算法设置、任意数据等。

  ◆ 服务端向客户端发送数据,如SSL版本号、加密算法设置、任意数据、服务端的证书和要求客户端认证信息等。

  ◆ 客户端认证服务端,包括验证服务端证书CA的签名有效性、证书时间的有效性等。

  ◆ 客户端用收集到的资料生成一个初始密码,接着用服务端的证书加密这个初始密码。如果第二步中服务端要求客户端认证,客户端对双方都知道的数据进行签名,并把签名和客户端证书以及加密的初始密码一并发送给服务端。

  ◆ 如果第二步中服务端要求客户端认证,认证客户端包括验证客户端签名、证书CA的签名有效性、证书时间的有效性等。服务端接着用自己的私钥解密客户端发送过来的初始密码,执行一系列步骤生成主密码,同时客户端也执行同样步骤生成主密码。

  ◆ 客户端和服务端都用主密码生成会话密码,这个密码被双方选择的加密算法加密。

  ◆ 客户端向服务端发送数据表明自己将用会话密码发送数据,本方握手过程结束。

  ◆ 服务端向客户端发送数据表明自己将用会话密码发送数据,本方握手过程结束。

  用户在互联网网站上使用SSL表现为浏览器的地址栏中以https://开头。

  总结

  了解和使用数字证书已经成为信息社会公民使用信息技术必不可少的知识和体验,本文比较全面的叙述了数字证书的相关知识,希望对大家有所帮助。希望大家在使用HTTPS和数字证书进行电子商务的网上交易时一定要注意仔细查看服务方的证书,因为目前的HTTPS协议比较容易遭受DNS的攻击。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值