Microsoft Word 文档Word下载.docx
《Microsoft Word 文档Word下载.docx》由会员分享,可在线阅读,更多相关《Microsoft Word 文档Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
用户的登录认证可以保留日志用于以后追溯,即可防伪造又可防抵赖。
2身份认证原理
2.1数字签名
数字签名的产生和验证过程:
Alice产生文件的单向散列值。
Alice用她的私人密钥对散列加密,以此表示对文件的签名。
Alice将文件和散列签名送给Bob。
Bob用Alice发送的文件产生文件的单向散列值,同时用Alice的公钥对签名的散列解密。
如果签名的散列值与自己产生的散列值匹配,签名是有效的。
数字签名具有以下特性:
完整性。
因为它提供了一项用以确认电子文件完整性的技术和方法,可认定文件为未经更改的原件。
可验证性。
可以确认电子文件之来源.由于发件人以私钥产生的电子签章惟有与发件人的私钥对应的公钥方能解密,故可确认文件之来源。
不可否认性。
由于只有发文者拥有私钥,所以其无法否认该电子文件非由其所发送。
2.2身份认证
流程如下:
在实际的部署中,认证服务器的功能可以在应用服务器实现。
步骤说明:
浏览器打开应用登录页面,里面包含一个被签名的随机数,随机数在应用服务器端产生,记作RS
浏览器调用Ekey对RS进行签名
Ekey返回对RS的签名,记作SS2_C(RS)
浏览器提交表单,里面包含用户证书SCertC和签名SS2_C(RS),并用PKCS#7的SignedData封装
应用服务器把RS和SignedData交给认证服务器验证
6.
认证服务器解开SignedData里面的签名内容、用户证书和数据签名,比较签名内容是否和RS相同,证书是否有效,签名是否有效,若都有效,再查询该证书对应的用户ID。
返回验证成功消息及用户账号
7.
应用服务器返回登录成功页面,给以该用户账号使用应用服务
该流程的优点是:
l
挑战-响应机制:
客户端在发起认证请求时,服务器端首先产生并返回一个随机数(挑战);
客户端在提交认证请求时,将数字签名后的随机数发送到服务器端(响应),由服务器端比较本地的随机数和收到的随机数,以校验认证请求的有效性,从而有效防止截获和重放攻击。
数字签名机制:
客户端提交的认证请求,均由客户端认证组件调用eKey进行签名处理。
eKey随身携带,其中的私钥不可复制,保证了私钥的唯一性,由于数字签名不可伪造和篡改,服务器端通过校验客户端用户证书和数字签名的有效性,并结合认证数据库鉴别用户身份。
3数字证书登录认证的实现
以下讨论如何实现数字证书在Web应用中作登录认证。
3.1SSL方式
SSL在握手过程中,服务端接受客户端证书
SSL的用户端认证:
CertificateRequest消息指示客户端要进行客户端认证,并就服务器愿意接受的认证类型提供指导:
struct{
ClientCertificateTypecertificate_types<
1..2^8-1>
;
DistinguishedNamecertificate_authorities<
3..2^16-1>
}CertificateRequest;
enmu{
rsa_sign
(1),dss_sign
(2),rsa_fixed_db(3),dss_fixed_dh(4),
(255)
}ClientCertificateType;
opaqueDistinguishedName<
1..2^16-1>
certificate_types指示支持哪种类型的客户端证书。
certificate_authorities指示服务器愿意接受哪些CA签发的客户端证书。
Certificate消息是客户端向服务端提交的表明身份的数字证书链,证书链的第一个证书就是表明用户身份的数字证书。
ASN.1Certcertificate_list<
1..2^4-1>
}Certificate;
opaqueASN.1Cert<
2^24-1>
CertificateVerify消息用于真正的客户端认证。
它包含由客户端私钥签名的消息,签名内容为自ClientHello到本消息(不包含本消息)所收发的所有握手消息。
且由于这些握手消息带有导出主密钥(master_secret)的随机数,所以本消息可以防止被重放。
struct{
Signaturesignature;
}CertificateVerify;
select(SignatureAlgorithm)
{
caseanonymous:
struct{};
casersa:
digitally-signedstruct{
opaquemd5_hash[16];
opaquesha_hash[20];
};
casedsa:
}Signature;
CertificateVerify.signature.md5_hash=MD5(handshake_messages);
CertificateVerify.signature.sha_hash=SHA(handshake_messages);
3.1.1WEB服务器设置
WEB服务器设置成需要客户端认证。
iis
需要首先在服务端和客户端都安装CA证书链,可以通过MMC控制台对计算机帐户受信任根证书进行添加
tomcat
需要首先在服务端和客户端都安装CA证书链,可以在JDK目录下的cacerts进行添加
修改c:
/tomcat/conf/server.xml,添加如下内容:
<
Connectorport="
8443"
maxThreads="
150"
minSpareThreads="
25"
maxSpareThreads="
75"
enableLookups="
false"
disableUploadTimeout="
true"
acceptCount="
100"
debug="
0"
scheme="
https"
secure="
clientAuth="
sslProtocol="
TLS"
keystoreFile="
c:
/server_keystore"
keystorePass="
changeit"
truststoreFile="
/trustcacerts_keystore"
truststorePass="
/>
3.1.2得到客户端证书
当WEB服务器设置成需要客户端认证时,客户端在建立SSL链接时会提交用户证书链,证书链的第一个即是表明用户身份的个人证书。
j2ee
%@pageimport="
java.security.cert.X509Certificate"
%>
%
if(request.isSecure())
//判断是否采用SSL
finalStringattname="
javax.servlet.request.X509Certificate"
X509Certificate[]chain=(X509Certificate[])request.getAttribute(attname);
//客户证书链
if(chain==null)
{
out.println("
没有客户端证书链"
);
return;
}
X509CertificateuserCert=chain[0];
//客户证书
……
}
%>
.netc#
%@PageLanguage="
C#"
%@ImportNamespace="
System.Security.Cryptography.X509Certificates"
if(Request.IsSecureConnection)
HttpClientCertificatehCert=Request.ClientCertificate;
if(hCert==null)
Response.Write("
没有客户端证书"
X509Certificate2cert=newX509Certificate2();
try
cert.Import(hCert.Certificate);
catch(Exceptione)
Response.Write(e.Message);
......
3.2表单方式
表单方式的原理是:
服务器产生一个随机数;
客户端用数字证书对应的私钥随机数签名,把随机数、用户证书、数字签名以PKCS#7格式打包发送到服务器;
服务器再分析此PKCS#7数据包,得到签名随机数、用户证书和数字签名,再验证这3个元素是否有效。
3.2.1客户端
调用CAPICOM的JS脚本(capicom.js)
varCAPICOM_CURRENT_USER_STORE=2;
varCAPICOM_STORE_OPEN_READ_ONLY=0;
varCAPICOM_ENCODE_BASE64=0;
varCAPICOM_ENCODE_BINARY=1;
varCAPICOM_INFO_SUBJECT_SIMPLE_NAME=0;
varCAPICOM_INFO_ISSUER_SIMPLE_NAME=1;
varCAPICOM_INFO_SUBJECT_EMAIL_NAME=2;
varCAPICOM_INFO_ISSUER_EMAIL_NAME=3;
functionSelectMySignCert()
//certstore
varmystore=newActiveXObject("
CAPICOM.Store"
mystore.Open(CAPICOM_CURRENT_USER_STORE,"
My"
CAPICOM_STORE_OPEN_READ_ONLY);
varcerts=mystore.Certificates;
//mycasigncerts
//
varmycacerts=certs;
varmycacerts=newActiveXObject("
CAPICOM.Certificates"
for(i=1;
i<
=certs.Count;
i++)
//checkissuer
varissuer=certs.Item(i).IssuerName;
if(issuer.indexOf("
CN=MYCA"
)<
0)
//notmyca
continue;
//checkkeyusage
varku=certs.Item(i).KeyUsage();
if(!
ku.IsDigitalSignatureEnabled)
//notsigncert
//add
mycerts.Add(certs.Item(i));
if(mycerts.Count==0)
if(window.confirm("
没有找到MYCA签发的证书,/r/n请插入相应的Ekey再按确定"
)==true)
returnSelectMySignCert();
else
returnnull;
//selectcert
varcertsel=mycerts.Select("
选择证书"
"
请选择证书:
"
false);
if(certsel==null)returnnull;
varcert=certsel.Item
(1);
cert.Display();
returncert;
functionSignText(strtext)
varmysigncert=SelectMySignCert();
if(mysigncert==null)returnnull;
//signeddata
varsigner=newActiveXObject("
CAPICOM.Signer"
signer.Certificate=mysigncert;
varsigneddata=newActiveXObject("
CAPICOM.SignedData"
varutils=newActiveXObject("
CAPICOM.Utilities"
signeddata.Content=utils.BinaryStringToByteArray(strtext);
returnsigneddata.Sign(signer,false,CAPICOM_ENCODE_BASE64);
/*
varsignature=SignText("
hello"
WScript.Echo(signature);
*/
登录页面(login.aspx)
Randomrnd=newRandom();
byte[]buff=newbyte[18];
rnd.NextBytes(buff);
stringchallenge=Convert.ToBase64String(buff);
Session["
challenge"
]=challenge;
html>
head>
title>
登录页面<
/title>
metahttp-equiv="
Content-Type"
content="
text/html;
charset=GBK"
>
scriptsrc="
./capicom.js"
/script>
scriptlanguage="
javascript"
functionsubmitform()
varsignature=SignText("
%=challenge%>
if(signature==null)return;
form1.passport.value=signature;
form1.submit();
/head>
body>
objectid="
oCAPICOM"
codeBase="
#version=2,0,0,3"
classid="
clsid:
A996E48C-D3DC-4244-89F7-AFA33EC60679"
/object>
formname="
form1"
action="
verify.aspx"
method="
POST"
<
inputtype="
hidden"
name="
passport"
value="
br/>
button"
点击提交登录证书."
onclick="
submitform()"
/form>
/body>
/html>
3.2.2服务端
JDK1.5中自带的JCE并不支持PKCS#7,.netframework是支持的。
登录判断逻辑(verify.aspx)
System.Security.Cryptography.Pkcs"
stringchallenge=(string)Session["
];
]=null;
if(challenge==null){
没有随机数"
stringp=Request.Form["
byte[]cmsDer=Convert.FromBase64String(p);
SignedCmscms=newSignedCms();
try{
cms.Decode(cmsDer);
cms.CheckSignature(true);
}catch(Exceptione){
stringchallenge2=Encoding.Default.GetString(cms.ContentInfo.Content);
if(challenge.Equals(challenge2))
随机数不匹配<
br/>
Response.Write(challenge+"
:
+challenge2);
登录成功"
3数字证书与现有用户帐户的绑定
用户用数字证书登录后。
WEB应用提供一个帐户绑定页面,页面提示用户输入原用户名和口令。
后台再验证用户提交的用户名和口令,通过验证后,把该用户/口令对应的用户ID和用户的登录证书摘