SSL和数字证书的概念及Web应用_第1页
SSL和数字证书的概念及Web应用_第2页
SSL和数字证书的概念及Web应用_第3页
SSL和数字证书的概念及Web应用_第4页
SSL和数字证书的概念及Web应用_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SSL和数字证书的概念及Web应用

陕西省数字证书认证中心

SSL和数字证书的概念及Web应用

安全对于WEB的应用非常重要。无论是应用于金融、商业还是个人信息的交流,人们都

希望能够知道他们是在和谁交流,这就是所谓的验证,人们也希望别人所收到的就是他们所

寄出的,这就是所谓的完整性,另外他们还希望这样的信息即使被别人截获,也无法被破译,

这就是所谓的机密。SecureSocketsLayer协议(即SSL)就提供了满足这些要求的一个解

决方案。在这个附录中,我们将重点讨论SSL的概念、数字证书的内容以及通过SSL实现

SSL的方案,而至于涉及到SSL实现的加密技术、邮件文摘等概念,在前面的正文中已经介

绍过了,在这里就不多说了。

一、简介

因为在这里主要介绍SSL技术在Web的应用,我们假设读者都是熟悉Web,HTTP以及

Web服务器技术的人员。而我们在后面的介绍中主要应用的是Apache服务器系统的SSL实

现。

SSL技术涉及到加密技术、邮件文摘和数字签名的技术,这三个技术分别可以用于实现

机密性、完整性以及认证的功能。

1.数字证书

我们在前面讲过,数字证书是用于在INTERNET上标识个人或者机构身份的一种技术手

段,它通过由一些公认的权威机构所认证,从而可以保证其安全地被应用在各种场合。

一份数字证书包括了公钥、个人、服务器或者其它机构的身份信息(称之为主题,如下

格式所示):

Subject:DistinguishedName,PublicKey

Issuer:DistinguishedName,Signature

PeriodofValidity:NotBeforeDate,NotAfterDate

AdministrativeInformation:Version,SerialNumber

ExtendedInformation:BasicContraints,NetscapeFlags,etc.

主题的内容包括标识信息(唯一名称)、公匙,当然也包括签发该证书的证书认证机构

以及证书有效时间,同时也包括另外一些信息,如序列号等。

唯一名称用特定的格式标识•个身份,此特定的格式由X.509

(ftp://ftp.bull,com/pub/0SIdirectory/ITUnov96/X.509/97x509final.doc)标准所确

定,它由几个字段组成,其格式如下所示:

字段名:CommonName

缩写:CN

内容:需要认证的名称

示例:CN=JoeAverage

字段名:OrganizationorCompany

缩写:0

内容:该名称所属的机构

示例:0二SnakeOil,Ltd.

字段名:OrganizationalUnit

缩写:OU

内容:机构的单元

示例:0U二ResearchInstitute

字段名:City/Locality

缩写:L

内容:所居住的城市

示例:L=SnakeCity

字段名:State/Province

缩写:ST

内容:省份或者州

示例:ST=Desert

字段名:Country

缩写:C

内容:国家名(ISO号)

示例:c=xz

证书权威机构可以定义这些字段中哪些是必需的,哪些是可选的。证书的二进制格式

使用ASN.1(X.208标准:/pub/itu/x.series/x208.ps)格式。该格式

定义了如何定义信息、编码规则,证书的二进制的编码使用基于BasicEncodingRules(BER)

基础上的DistinguishedEncoding(DER),对于某些不能传送二进制编码的系统,则使用

base64编码,其版本为PEM编码。一个用PEM编码方式的证书如下:

-----BEGINCERTIFICATE-----

MIIC7jCCAlegAwlBAgIBATANBgkqhkiG9wOBAQQFADCBqTELMAkGAWEBhMCWFkx

FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGAlUEBxMKU25ha2UgVG93bjEXMBUG

AlUEChM0U25ha2UgT21sLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEFldGhv

cm1OeTEVMBMGA1UEAxMMU25ha2UgT21sIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBz

bmFrZW9pbC5kb20wHhcN0TgxMDIxMDgl0DM2WhcN0TkxMDIxMDgl0DM2WjCBpzEL

MAkGAlUEBhMCWFkxFTATBgNVBAgTDFNuWtlIERlc2VydDETMBEGAlUEBxMKU25h

a2UgVG93bjEXMBUGAlUEChM0U25ha2UgT21sLCBMdGQxFzAVBgNVBAsTDldlYnNl

cnZlciBUZWFtMRkwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcN

AQkBFhB3d3dAc25ha2VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB

gQDH9Ge/s2zcH+da+rPTx/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8b

vKR+yy5DGQiijsHlD/j8HlGE+q4TZ80Fk7BNBFazHxFbYI40KMiCxdKzdiflyfaa

!WoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNV

HRMECDAGAQH/AgEAMBEGCWCGSAGG+ElBAQQEAwIAQDANBgkqhkiG9wOBAQQFAAOB

gQAZUIHAL4D09oE6Lv2k56Gp380BDuILvwLglvlKL8mQR+KFjghCrtpqaztZqcDt

2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7

dUHzICxBVC11nHyYGjDuAMhe3961YAn8bC1d1/L4NMGBCQ==

-----ENDCERTIFICATE-----

数字认证机构用于确认一个密钥对的私钥的拥有者。数字认证机构也可以为另外一个数

字认证机构颁发证书,这就形成了证书链。当然,或许这个时候你会问,是否可以不需要别

人认证而建立自己的证书认证机构呢?可以,这就是建立一个拥有“根”级别的证书认证机

构。当然,我们在这里首先假设你所拥有的机构具有现实社会的权威性,否则别人是不会相

信你的。这样的数字签证就是“自签”,证书的主题内容和签发者一致。

2.SSL简介

SSL是一个可以在连接性的协议(例如TCP/IP)以及应用层协议(如HTTP)之间的协

议。SSL可以通过双方进行认证、数字签名的使用以及加密来保障安全通信。SSL有以下几

个版本:

SSLv2.0VendorStandard(NetscapeCorp.)

(/eng/security/SSL_2.html):适用于NSNavigator1.x/2.x,

MSIE3.x和Lynx/2.8+0penSSLo

SSLv3.0ExpiredInternetDraft(NetscapeCorp.)

改进版本,防止了一些安全漏洞,加上了一些非RSA的加密手段,并支持证书链,支持

NSNavigator2.x/3.x/4.x,MSIE3.x/4.x和Lynx/2.8+0penSSL。

TLSvl.0ProposedInternetStandard(IETF)

(/internet-drafts/draft-ietf-t1s-protocol-06.txt)SSL3.0的

改进版本,将MAC协议升级为HMAC,支持Lynx/2.8+0penSSL

SSL连接可以通过在客户端和服务器端之间交流一些步骤建立起来,如图F1-1所示。

ClientHelloEstablishprotocolversion,sessionid,

ciphersuite,compressionmethod

SeiverHelloExchangerandomvalues

Certificate

Optionallysendservercertificate

CertificateRequestandrequestclientcertificate

SeiverHeltoDone

Certificate

Sendclientcertificateresponseif

CertificateVerifyrequested

ChangeCipheiSpec

Finished

ChangeCiphersuiteandFinish

_ChangeCipherSpecHandshake

—Finished

ClientServer

图Fl-l建立SSL连接的步骤

在建立SSL连接的时候主要需要以下几个步骤:

(1)确认在数据传输过程中的加密手段。

(2)建立并共享在客户端和服务器端的密匙。

(3)验证服务器(可选)。

(4)验证客户端(可选)。

其中第一步加密手段确认,允许客户端和服务器端选择一种双方都支持的加密包,

SSL3.0协议定义了31种加密包。一个加密包由以下几个部分组成:

(1)密匙交换方法,如RSA密匙交换,Diffie-Hellman密匙交换等。

(2)数据传送的加密手段,如流加密,RC4with40-bitkeys.RC4with128-bitkeys,

CBCBlockCiphers,RC2with40bitkeysrDES40,DES,3DES_EDE,Idea和Fortezza等。

(3)建立邮件认证码(MessageAuthenticationCode,MAC)的邮件文摘,可以使用MD5

(128位哈希),SecureHashAlgorithm(SHA)等。

其中具体的方法可以参考有关的协议。

SSL协议的具体架构如图F1-2所示。

SSLRecordProtocol用于控制在客户端和服务器端之间的数据传送。具体的传送如图

F1-3所不。

当我们了解了SSL概念之后,我们就可以在HTTP通信中,即在浏览器和服务器之间建立SSL

连接,在这个时候,我们使用https而不是http,并且使用一个另外的端口(默认为443),

浏览器将维护客户端的私匙,并且在连接建立的时候显示其标识。

SSL

SSLChangeSSLAlert

HandshakeHTTPTelnet

CipherSpecProtocol

Protocol

SSLRecordProtocol

TCP

IP

图2SSL协议堆栈

图F1-3数据控制

二、应用SSL

在网络的实际应用中使用SSL的手段很多,我们甚至可以根据一些现有的库编写自己的

SSL一贯用程序,但是在实际应用中我们通常使用现有的商业软件或者是一些自由软件。在

这里,有RSA公匙软件包可用。

(1)RSARef(RSAReference)(/RSAREF/rsaref_toc.html),

主要被用于自由软件和非商业软件领域。

(2)BSAFE3.0(/rsa/prodspec/bsafe/bsafe_3_0_f.html):RSARef

的商业应用。

而我们所要介绍的SSLeay就是SSL应用的一个优秀的自由软件包,它提供了一种廉价的应

用SSL的手段。

1.安装SSLeay软件包

SSLeay由EricYoung(eay@)和TimHudson(tjh@)开发,

在INTERNET上可以获得的最新版本:

ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/SSLeay-x.x.x.tar.gz,在

http:〃www.psy.uq.oz.au/^ftp/Crypto可以获取相关的文档。

当下载了文档之后,首先当然是解开该软件包,形成一个安装目录。安装的步骤如下:

(1)如果运行在WindowsNT系统之下,运行shutil/fixNT.sh»

(2)如果你的系统有Perl,但是不在/usr/local/bin,你可以运行

perlutil/perlpath.pl/new/path。

(3)编辑crypto/cryptlib.h,tools/crehash以及Makefile.ssL设定你所想安装的目

录,默认的目录为/usr/local/ssl,运行perlutil/ssldir.pl/new/ssl/home

(4)./Configure'systemtype",设定系统类型。

(5)运行makedepend(可选)。

(6)运行make完成编译。

(7)运行makeinstal10

总的来说,安装SSLeay和Unix环境下其它的应用程序的安装类似。当安装完毕之后,

系统就有了•系列可用的库,如libssl.a,libcrypto.a(SSL所需要的加密用的库及实现

X.509等),另外,还有一系列的指令,如:

enc:通用加密程序,可以使用不同的加密组合完成加密,输入及输出可以通过Base64编码

转换。

dgst:通用邮件文摘,使用fmd2,md5,sha(sha-0orshaT)或者mdc2等算法。

asnlparse:分解并显示asnl编码的二进制文件。

rsa:操纵RSA私钥。

dsa:操纵DSA私钥。

dh:操纵Diffie-Hellman参数文件。

dsaparam:操纵并产生DSA参数文件。

crt2pkcs7:产生包括了一个crl和证书的pkcs7对象。

x509:操纵x509证书,“自签”证书。

req:操纵PKCS#1O证书需求,并且产生证书请求。

genrsa:产生一个任意大小的RSA私钥。

gendh:产生了一1组Diffie-Hellman参数。

ca:从PKCS#1O证书请求产生一个证书,该程序同时维护着所颁发的证书的数据库。

verify:检测x509证书的签名。

另外,除了SSLeay之外,另外还有•套基于SSLeay的软件包OpenSSL,其最新的版本可以

从http:〃/source/获得。其安装的方法也类似,但是根据我们的实际使

用感觉,这套软件的接口更加友好些,而且我们在后面介绍的应用于Apache服务器的模

块mod_ssl就需要这套软件的支持。这套软件的命令行和SSLeay类似,只不过用“openssl

命令”的格式,还可以使用交互模式,如。pensslca之类的命令来实现ca的功能。

2.如何应用SSLeay?

配置SSLeay的参数:

在应用SSLeay之前必须对该系统进行一定的配置。首先用以下的•系列的命令:

mkdir${SSLDIR}/certs

mkdir${SSLDIR}/crl

mkdir${SSLDIR}/newcerts

mkdir${SSLDIR}/private

echo"01'>${SSLDIR}/serial

touch${SSLDIR}/index.txt

创建一系列的目录和文件,这些主要用于管理私匙以及管理证书使用。然后需要在实际

使用之前配置好SSLeay的配置文件f,该配置文件由若干个部分组成,而在这些

配置中,恐怕最重要的就是目录配置了。以下是配置的部分文档:

####################################################################

[ca]

default_ca=CA_default#Thedefaultcasection

####################################################################

[CA_default]

dir=/usr/local/ssl#Whereeverythingiskept

certs=$dir/certs#Wheretheissuedcertsarekept

crldir=$dir/crl#Wheretheissuedcrlarekept

database=$dir/index.txt#databaseindexfile.

new_certs_dir=$dir/newcerts#defaultplacefornewcerts.

certificate=$dir/private/CAcert.pem#TheCAcertificate

serial=$dir/serial#Thecurrentserialnumber

crl=$dir/clr/crl.pem#ThecurrentCRL

private_key=$dir/private/CAkey.pem#Theprivatekey

RANDFILE=$dir/private/.rand#privaterandomnumberfile

x509_extensions=x509v3_extensions#Theextentionstoaddtothecert

defaultdays=365#howlongtocertifyfor

defaultcrldays=30#howlongbeforenextCRL

default_md=md5#whichmdtouse.

preserve=no#keeppassedDNordering

#Afewdifferencewayofspecifyinghowsimilartherequestshouldlook

#FortypeCA,thelistedattributesmustbethesame,andtheoptional

#andsuppliedfieldsarejustthat:-)

policy=policy_match

req部分被用于创建证书请求,也提供了对各个字段部分默认的长度限制和一些默认值,其

配置示例如下:

defaultbits=512

default_keyfile=privkey.pem

distinguishedname=req_distinguished_name

attributes=req_attributes

[req_distinguished_name]

countryName=CountryName(2lettercode)

countryName_default=US

countryName_min=2

countryNamemax=2

stateOrProvinceName=StateorProvinceName(fullname)

stateOrProvinceNamedefau11=MA

localityName=LocalityName(eg,city)

1oca1ityName_defau11=Cambridge

organizationName=OrganizationName(eg,company)

organizationNamedefault=TheOpenGroup

organizationalUnitName=OrganizationalUnitName(eg,section)

organizationalUnitNamedefault=ResearchInstitute

commonName=CommonName(eg,YOURname)

commonNamedefault=example,

commonName_max=64

emailAddress=EmailAddress

emai1Address_max=40

[req_attributes]

challengePassword=Achallengepassword

challengePassword_min=4

challengePasswordmax=20

policy部分定义了签发证书的策略,这个定义确定了证书必须或者可选哪些项目,以

下是一个示例,其中第一个策略非常严格,而另外一个策略则非常宽松。在这一部分中,

optional意味着可选,match意味着匹配。

[policy_match]

countryName=match

stateOrProvinceName=match

organizationName=match

organizationalUnitName=match

commonName=supplied

emailAddress=optional

#Forthe'anything'policy

#Atthispointintime,youmustlistallacceptable'object'

#types.

[policy_anything]

countryName=optional

stateOrProvinceName=optional

localityName=optional

organizationName=optional

organizationalUnitName=optional

commonName=supplied

emailAddress=optional

3.创建自签的证书

为了成为一个证书权威机构的第一步就是要创建一个“自签”的证书,这可以通过运行

req命令来实现。详细的SHELL实现请看下面的示例:

#SSLDIR/bin/ssleayreq-new-x509-keyout${SSLDIR}/private/CAkey.pem\

-out${SSLDIR)/private/CAcert.pem-config/opt/www/lib/f

Usingconfigurationfrom/opt/www/lib/fGeneratinga512bitprivatekey

writingnewprivatekeyto’../private/CAkey.pem,EnterPEMpassphrase:

Verifyingpassword-EnterPEMpassphrase:

Youareabouttobeaskedtoenterinformationthatwillbeincorperated

intoyourcertificaterequest.

WhatyouareabouttoenteriswhatiscalledaDistinguishedNameoraDN.

Therearequiteafewfieldsbutyoucanleavesomeblank

Forsomefieldstherewillbeadefaultvalue,

Ifyouenterz,thefieldwillbeleftblank.

CountryName(2lettercode)[US]:StateorProvinceName(fullname)[MA]:

LocalityName(eg,city)[Cambridge]:

OrganizationName(eg,company)[TheOpenGroup]:

OrganizationalUnitName(eg,section)[ResearchInstitute]:

CommonName(eg,YOURname)[example,]:ExampleCA

EmailAddress[]:f.hirschS

其中,认证机构的根证书(称为CA)通过SSLeay的配置文件所配置,如:

#TheCAcertificate

certificate=$dir/private/CAcert.pem

#Theprivatekey

privatekey=$dir/private/CAkey.pem

该证书就成为了签发其它证书的依据。在浏览器中安装根证书之后,浏览器就将认可由

该证书认证机构签发的证书。所以,在一个浏览器中安装这么一个证书实际上是比较危险的,

除非你的确信任这个证书认证机构。

为了再安装CA,用HTTPContent-Typeapplication/x-x509-ca-cert方式加载。我们

可以用一个cgi脚本来实现,如下面的示例,首先是一个HTML文档:

<HTMLXHEADXTITLE>LoadCACertificate</TITLEX/HEADXBODY>

<Hl>LoadCertificateAuthorityCertificate</Hl>

〈FORMACTION=,,http://example,/cgi-bin/loadCAcert.pl〃METHOD二postXTABLE>

<TRXTD>NetscapeBrowser(PEMFormat):</TD>

<TDXINPUTTYPE二〃RADIO"NAME二〃FORMAT"VALUE二〃PEM〃CHECKEDX/TDX/TR>

<TRXTD>MicrosoftBrowser(DERFormat):</TD>

<TDXINPUTTYPE二〃RADIO"NAME=〃FORMA厂VALUE=,/DER,,X/TD></TRX/TABLE>

<INPUTTYPEiSUBMIT"VALUEiLoadCertificate,z></FORM></BODY></HTML>

然后是用PERL写的loadCAcert.pl的一个脚本。

#!/usr/local/bin/perl-T

require5.003;

usestrict;

useCGI;

my$cert_dir=〃/opt/www/lib/certs〃;

my$cert_file="CAcert.pem〃;

my$query=newCGI;

my$kind=$query->param(/FORMAT');

if($kindeq'DER'){$cert_file="CAcert.der〃;}

my$cert_path=,z$cert_dir/$cert_filez,;

open(CERT,,z<$certpath");

my$data=join'',;

close(CERT);

print“Content-Type:application/x-x509-ca-cert\n〃;

print〃Content-Length:",length($data),〃\n\n$data〃;1;

也可以用一个文件保存该证书,该文件的后缀名通过服务器配置文件中相应的

app1ication/x-x509~ca-certMIME所规定确定,对于Apache服务器来说,在httpd.conf

或者srm.conf中添加一行:

AddTypeapplication/x-x509-ca-certcacert

4.创建服务器所需要的证书

该步骤由两个部分完成,首先使用req命令创建一个新的证书请求,如下面的示例:

#cd$SSLDIR/bin

#./ssleayreq-new-keyoutnewkey.pern-outnewreq.pem-days360\

-config/opt/ww/lib/f

Usingconfigurationfrom/opt/ww/lib/f

Generatinga512bitprivatekey

writingnewprivatekeyto'newkey.pem'

EnterPEMpassphrase:

Verifyingpassword-EnterPEMpassphrase:

Youareabouttobeaskedtoenterinformationthatwillbeincorperated

intoyourcertificaterequest.

WhatyouareabouttoenteriswhatiscalledaDistinguishedNameoraDN.

Therearequiteafewfieldsbutyoucanleavesomeblank

Forsomefieldstherewillbeadefaultvalue,

Ifyouenter'.’,thefieldwillbeleftblank.

CountryName(2lettercode)[US]:

StateorProvinceName(fullname)[MA]:

LocalityName(eg,city)[Cambridge]:

OrganizationName(eg,company)[TheOpenGroup]:

OrganizationalUnitName(eg,section)[ResearchInstitute]:

CommonName(eg,YOURname)[example,]:

EmailAddress[]:f.hirschS

Pleaseenterthefollowing'extrazattributes

tobesentwithyourcertificaterequest

Achallengepassword口:

Anoptionalcompanyname[]:

这个命令创建了证书请求文件以及私钥文件,然后用ca命令签发该证书,这将创建一

个包括了证书的文件。如下面的示例:

#catnewreq.pemnewkey.pem>new.pem

./ssleayca-policypolicy_anything-outnewcert.pem\

-config/opt/ww/lib/f-infilesnew.pem

Usingconfigurationfrom/opt/uw/lib/f

EnterPEMpassphrase:

Checkthattherequestmatchesthesignature

Signatureok

TheSubjectsDistinguishedNameisasfollows

countryName:PRINTABLE:rUS'

stateOrProvinceName:PRINTABLE:'MA'

localityName:PRINTABLE:rCambridgez

organizationName:PRINTABLE:'TheOpenGroupz

organizationalUnitName:PRINTABLE:fResearchInstitute7

commonName:PRINTABLE:'example,'

emailAddress:IA5STRING:rf.hirschS7

CertificateistobecertifieduntilMay1215:39:331998GMT(365days)

Signthecertificate?[y/n]:y

1outof1certificaterequestscertified,commit?1y/n]y

Writeoutdatabasewith1newentries

DataBaseUpdated

将证书和密钥文件拷贝到服务器的证书目录:

cpnewcert.pem$certdir/sitecert.pem

cpnewkey.pemScertdir/sitekey.pem

创建服务器目录的证书的哈希表

cd$certdir

In-ssitecert,pem$SSLDIR/bin/x509-noout-hash<sitecert,pem

创建DER格式的服务器证书文件

SSLDIR/bin/x509-inCAcert.pem-outCAcert.der-outformDER

然后更新服务器的配置文件以指出服务器所使用的证书。为了比较容易地寻找证书,

SSLeay使用了证书主题名哈希表,这样,当寻找证书的时候,它会寻找具有特定的哈希值

的文件名。这将避免反复地匹配。SSLeay的X509命令可以被用于操纵证书,其中一个命令

就用于创建相应的哈希表。

5.创建客户端的证书

客户端的证书用于向服务器证明其身份,而创建一个客户端的证书的难度要稍微大一

些。这是因为一个客户必须产生一个密钥对,保持其中的私钥,而将公钥发往证书权威机构

以处理证书请求。而不同的客户端,如NetscapeNavigator3.01Gold和MicrosoftInternet

Explorer3.02使用不同的方法产生客户端证书,在这个部分,我们将分两种情况来进行讨

论。一般来说,创建一个客户端证书需要相应的HTML表格和CGI脚本进行处理。如果证书

权威机构并不考察申请人的真实身份的话,这几乎是马上可以完成的。但是在实际工作中,

我们需要手工地进行一些其它的确认。一般说来,包含以下几个步骤:

第一,使用•个包含提交表格的HTML页面。

第二,输入相应的信息。

第三,提交表格,这将激发以下的动作:

浏览器产生一个密匙对(公匙和私匙);

私匙被保存在浏览器;

公匙以及身份信息被送往服务器;

服务器脚本创建证书并加载到客户端。

在NetscapeNavigator中,表格包括额外的FORM标志,<KEYGEN>标志,该标志创建一个

密匙对,并将使公匙作为表格参数被提交,如下面的示例:

<HTMLXHEADXTITLE>CreateClientCertificate</TITLEX/HEADXBODY>

<CENTERXHl>CreateClientCertificate</Hl></CENTER>

<FORMNAME="GenerateForm"ACTION=z/http://example,/cgi-bin/ns_key.pl”>

<TABLEXTRXTD>CommonName:</TDXTD>

<INPUTTYPE="TEXT"NAME="commonName"VALUE=wClientCertificate"SIZE=64>

</TDX/TRXTRXTD>emai1:</TDXTD>

<INPUTTYPE="TEXT"NAME="emailAddress"VALUE=z,f.hirsch@,zSIZE=40>

</TD></TR><TR><TD>Organization:</TDXTD>

<INPUTTYPE=//TEXT,/NAME="organizationName"VALUE="TheOpenGroup”>〈/TDX/TR>

<TRXTD>OrganizationalUnit:</TDXTD>

<INPUTTYPE="TEXT"NAME="organizationalUnitName"VALUE=/ZResearchInstitute”>

</TDX/TRXTRXTD>Locality(City):</TDXTD>

<INPUTTYPE="TEXT"NAME="localityName"VALUE=/,Cambridge,,X/TDX/TR>

<TRXTD>State:</TDXTDXINPUTTYPE="TEXT"NAME="stateOrProvinceName"VALUE="MA”>

</TDX/TRXTRXTD>Country:</TDXTD>

<INPUTTYPE=/ZTEXTZZNAME="countryName"VALUE="US"SIZE="2"></TDX/TRX/TABLE><!—

'keygenisNetscapespecificandwillbeignoredin'internetexplorer->

<KEYGENNAME="SPKAC"CHALLENGE="challengePassword”>

<INPUTTYPE=Z/SUBMIT"NAME=/,SUBMIT,/></FORM><P><HR></BODYX/HTML>

该代码产生的页面如图E1-4所示。

而MicrosoftInternetExplorer的HTML页面则更加复杂一些,因为这需要用一个

JavaScript(或者VisualBasic)程序应用ActiveX控件以产生一个密钥对,JavaScript

和HTML页面一起下载,并在提交表格的时候被调用。程序调用certenr3的ActiveX控件

的GenReqForm方法,并且从表格数据中传递给它参数,然后由控件产生的数据通过表格的

隐藏的域被提交。以下是这个页面的图片及其代码,如图F1-5所示。

代码如下:

<HTMLXHEADXTITLE>C1lentCertificateRequest</TITLEX/HEADXBODY>

<!一UsetheMicrosoftActiveXcontroltogeneratethecertificate一>

<OBJECTCLASSID=,,clsid:33BEC9E0-F78F-llcf-B782-00C04FD7BF43,/

CODEBASE=certenr3.dll

ID=certHelper>

</OBJECT>

启Netscape-[CreateClientCertificate]

FileEditViewGoBookmarksOptionsDkectoryWindowHelp

Back|Forward|Home|Edit|Reload|刃,.|Open|Print|Find|

CreateClientCertificate

CommonIClientCertificate

Name:

email:|f.hirsch@.

Organization:|TheOpenGroup

Orgamzahonal际断诉----

Loc^ity[Cambridge

(City):1y

State:[MA-

Country:|US

11024(HighGrade)SubmitQuety|।

HaDocument:DoneS'?%

图Fl-4NETSCAPE创建客户证书的页面

图Fl-5MSExplorer创建客户证书的页面

<!-JavaScriptorVisualBasicwillwork.—>

<SCRIPTLANGUAGE—JavaScript”>

<!——

//thisisfromJavaScript:TheDefinitiveGuide,since

//MicrosoftimplementationofMath,random()isbroken

//

functionrandom(){

random,seed=(random.seed*random.a+random,c)%random,m;

returnrandom,seed/random,m;

)

random,m=714025;random,a=4096;random,c=150889;

random,seed=(newDateO).getTime()%random.m;

functionGenReq()

I

varsessionld=〃a_unique_session_id〃;

varreqHardware=0;

varszName="〃;

varszPurpose="ClientAuth”;

vardoAcceptanceUINow=0;

vardoAcceptanceUILater=0;

vardoOnline=1;

varkeySpec=1;

szName=

if(document.GenReqFmonName.value==〃〃)

(

alert(^NoCommonName");

returnfalse;

)

else

szName=〃CN=〃+document.GenReqFmonName.value;

if(document.GenReqForm.countryName.value==〃〃)

(

alert(z,NoCountry");

returnfalse;

)

else

szName=szName+〃;+document.GenReqForm.countryName.value;

if(document.GenReqForm.stateOrProvinceName.value==〃〃)

!

alert(,zNoStateorProvince");

returnfalse;

)

else

szName=szName+〃;S=〃+document.GenReqForm.stateOrProvinceName.value;

if(document.GenReqForm.localityName.value==〃〃)

(

alert("NoCity");

returnfalse;

)

else

szName=szName+〃;L=〃+document.GenReqForm.localityName.value;

if(document.GenReqFanizationName.value==〃〃)

(

alert(z,NoOrganizationZ7);

returnfalse;

)

else

szName=szName+〃;0=〃+document.GenReqFanizationName.value;

if(document.GenReqFanizationalUnitName.value==〃")

!

alert(z,NoOrganizationalUnit");

returnfalse;

)

else

szName=szName+〃;OU="+document.GenReqFanizationalUnitName.value;

/*makesessionidunique*/

sessionld="xx'+Math,round(random()*1000);

szlO=certHelper.GenerateKeyPair(sessionld,reqHardware,szName,

0,szPurpose,doAcceptanceUINow,

doOnline,keySpec,〃〃,1);

/*

*TheconditionszlObeingemptyoccursonanyconditioninwhichthe

*credentialwasnotsuccessfullygenerated.Inparticular,itoccurs

*whentheoperationwascancelledbytheuser,aswellasadditional

*errors.Acancelisdistinguishedfromotherunsuccessful

*generationsbyanemptyszlOandanerrorvalueofzero.

*

*/

if(szlO!:〃〃)

document.GenReqForm.reqEntry.value=szlO;

document.GenReqForm.sessionld.value=sessionld;

}else{

alert(,/KeyPairGenerationfailed");

returnfalse;

)

)

//——>

</SCRIPT>

<CENTERXH3>Generatekeypairandclientcertificaterequest</H3X/CENTER>

=,,

<FORMMETHOD二POSTACTIONhttp://example,/cgi-bin/mskey.pl〃

NAME="GenReqForm"onSubmit=,/GenReq()〃>

<TABLE>

<TRXTD>CommonName:</TDXTD>

<INPUTTYPE二TEXTNAME二〃commonName"VALUE="ClientCertificate"SIZE=64>

</TDX/TRXTRXTD>Country:</TDXTD>

<INPUTTYPE二TEXTNAME二〃countryName〃VALUE二〃US〃SIZE=2>

</TDX/TRXTRXTD>StateorProvince:</TDXTD>

,z,z

<INPUTTYPE二TEXTNAME=stateOrProvinceNameVALUE=〃MA〃>

</TDX/TRXTRXTD>City:</TDXTD>

<INPUTTYPE=TEXTNAME二〃localityName"VALUE=,,Cambridge,z>

</TD></TR><TRXTD>Organization:</TDXTD>

<INPUTTYPE=TEXTNAME=〃organizationName〃VALUE二〃TheOpenGroupz/>

</TDX/TRXTRXTD>OrganizationalUnit:</TDXTD>

<INPUTTYPE=TEXTNAME=",organizationalUnitName,/VALUE="ResearchInstitute”)

</TDX/TRX/TABLE>

<INPUTTYPE=HIDDENNAME=〃sessionld〃>

<INPUTTYPE=HIDDENNAME二〃reqEntry〃>

<INPUTTYPEiSUBMIT'name=,,SUBMIT,,>

</FORM>

</BODYX/HTML>

而无论是使用NetscapeNavigator还是MicrosoftInternetExplorer都可以使得服务器

的CGI脚本处理其申请证书请求。但是在这两种情况卜处理的脚本却有差别。

为NetscapeNavigator进行处理的脚本如下:

#!/usr/local/bin/perl

require5.003;

usestrict;

useCGI;

useFile::CounterFile;#moduletomaintaincertificaterequestcounter

my$docdir=$ENV{JDOCUMENTROOT'};#apachespecificlocationforstorage

unless($doc_dir){

print,,<HTMLXHEAD><TITLE>Failure</TITLEX/HEAD>//;

print〃<BODY>DOCUMENT_ROOTnotdefined</BODYX/HTML>";

exit(0);

)

my$base_dir=$doc_dir;

$base_dirs/\/htdocs//;

my$SSLDIR='/opt/dev/sslr;#definewhereSSLeayfilesarelocated

my$CA=〃$SSLDIR/bin/ca〃;

my$CONFIG=z,/opt/www/lib/f,z;

my$CAPASS=〃caKEY〃;

my$query=newCGI;#getahandleontheformdata

my$key=$query->param(,SPKAC,);#thiswillfailifnotNetscapebrowser

unless($key){fail(〃NoKeyprovided$key.Netscaperequired");}

my$counter=newFile::CounterFile(〃$base_dir/・counter”,1);

unless($counter){fail("Couldnotcreatecounter:$!〃);)

my$count=$counter->inc();

my$certs_dir=〃$basedir/certs,";

my$req_file=,,$certs_dir/cert$count.reqzz;#certificaterequestfilename

my$result_file=z,$certsdir/cert$count.result/7;#certificatefilename

#Explicitlylistformfieldswemusthaveforcertificatecreationtowork.

my@req_names=('commonName',1emailAddressz,'organizationNamer,

'organizationa1UnitNamer,'localityName7,'stateOrProvinceNamef,

1countryNamez,'SPKACr);

#buildtherequestfile

open(REQ,〃〉$req_file〃)orfail(^Couldnotcreaterequest$req_file:$!〃);

my$name;

foreach$name(@req_names){

my$value=$query->param(,,$name,z);

$value=~tr/\n//d;

printREQ"$name=$value\n〃;

}

close(REQ);

#makesureweactuallycreatedarequestfile

unless(-f$req_file){fail("requestmissing:$req_file,/);}

unless(~e$CA){fail(",commandmissing");}#ensurethatcacommandwillrun

#commandforprocessingcertificaterequest,withoutpassword

my$cmd="$CA-config$CONFIG-spkac$req_file-out$resultfile-days360〃;

my$rc=system(,z$cmd-key$CAPASS2>errsz,);

if($rc!=0){fail(z/$cmd<P>rc=$rc〃,"errs");}

open(CERT,,z<$result_file,z)orfail(,zCouldnotopen$result_file<P>$!,z);

#sendtheclientcertificatetothebrowser

print“Content-Type:application/x-x509-user-cert\n,z;

my$result=join,1,<CERT>;

closeCERT;

my$len=length($result);

print"Content-Length:$len\n\n〃;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论