Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java Security  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Re:[转载]论Java加密技术与Windows的结合(2) [Re:samuel]
samuel





发贴: 50
积分: 10
于 2003-08-22 11:24 user profilesend a private message to usersend email to samuelsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
证书撤消

  有两种撤消证书的方法:Online Certificate Status Protocol(OCSP)和CRL。OCSP(见RFC2560)并没有得到广泛的支持,所以我只探讨用来确认一个证书的撤消状况的CRLs。CAs定期公布一个CRL(见RFC2459)。CRL是一列证书序号,由CA签署。如果一个证书的序号列在CRL中,那个证书就被撤消了,不再有效了。大多数证书在发布时,都有一个称为CRL Distribution Point(CDP)的扩展名。CDP通常是一个HTTP或Lightweight Directory Access Protocol(LDAP)URL,它指明该CRL存储在哪里。我的VeriSign证书的CDP是http://crl.verisign.com/class1.crl。该CRL有500多K,所以需要花些时间来下载。

  Java的确提供了类java.security.cert.LDAPCertStoreParameters,它可以用来从一个LDAP目录获取一个CRL,但这并不适用于VeriSign CRL(因为那个CRL存在一个Web服务器上,而不是一个LDAP服务器上)。Microsoft有一个比Java更丰富的API用来管理证书撤消。如果你浏览一个安全的网站(HTTPS),IE将会检验服务器的证书是否已被撤消(假设服务器的证书有一个CDP)。IE将从证书链中的CAs获取CRLs并把它们缓存到IE的Temporary Internet Files(临时Internet文件)目录中。在下一次需要来自那个CA的CRL时,IE将首先检查缓存。如果它在缓存中找到该CRL,IE会检查该CRL是否过期。(CRLs也有有效的from/to期限。VeriSign运用一个10天的有效期限。)如果CRL已经过期,IE将获取一个新的CRL。

  我考虑开发一个只用于Java的CRL获取、缓存和撤消确认过程——但是那样会需要大量的Java代码,需要支持几个URL协议(HTTP、LDAP、FTP、文件),需要用一个文件来存储CRL缓存,而且需要复制Microsoft提供的底层框架。目的是运用IE的证书撤消底层框架。

  Microsoft提供了一个函数CertVerifyRevocation(),它与IE缓存结合起来了并按需要下载和处理CRLs。我琢磨了好几周撤消过程,最后得到了一个可靠的算法。当CertVerifyRecocation()下载一个CRL时,下载有时会中断。这就使CertVerifyRevocation()返回假的、很难恢复的错误状况。我实现的过程显示在图1中。

图1. 证书撤消流程表

  其诀窍就是调用函数CryptRetrieveObjectByUrl()来从LDAP、HTTP或FTP服务器预取CRL到IE缓存中,然后调用CertVerifyRevocation()来检查这个证书是否已被撤消。虽然CryptRetrieveObjectByUrl()下载仍然要受到网络的影响,造成连接中断,但运用CryptRetrieveObjectByUrl()的好处就是你可以识别问题,报告一个有意义的错误信息,并且(如果你需要)可以提示用户接受或拒绝该证书。不幸的是,只有Windows 2000或更高版本中有CryptRetrieveObjectByUrl()。如果程序要在Windows 98或Windows NT4上运行,你就不能预取CRL。

  我也尝试运用Microsoft函数来下载CRLs,然后在Java中处理CRL。对于一个大的CRL(比如VeriSign CRL),这种方式很慢。

  列表3显示关于isCertRevoked()方法的Java代码片段。IsCertRevoked()方法调用了两个本地函数,MSgetCRL()和MSVerifyCertRevocation()。MSgetCRL()调用Microsoft函数CryptRetrieveObjectByURL(),如果CRL不在缓存中,它可以使CRL被下载。你不需要把CRL传递到Java中,因为它从来不用在Java中。函数MSCertVerifyRevocation()调用Microsoft函数CertVerifyRevocatoin()来确定一个证书是否被撤消了。列表4显示关于MSgetCRL()和MSVerifyCertRevocation()的代码片段。警告:当我第一次在Windows 2000 Server PC上测试CertVerifyRevocation()时,它没有运行。在我将PC升级到Service Pack 2后,重新测试就很成功。

我们的确认程序中的isCertRevoked()方法调用了两个本地函数:MSgetCRL()和MSVerifyCertRevocation() (如列表4所示)。
boolean isCertRevoked(X509Certificate cert,
int DontKnowFlag) {
byte[] certblob = cert.getEncoded();
// Does the cert have a CDP (
// CRL distribution point)???
byte[] CDPblob = cert.getExtensionValue(
"2.5.29.31");

// yes there is a CDP - ASN parse the CDP
String[] URLarray = MSF.MSparseCDP(CDPblob);
for (int i=0; i<URLARRAY.LENGTH; i++) String URL = URLarray[i];
// go fetch that CRL
if (MSF.MSgetCRL(URL)) {
// url was fetched correctly
break;
}

// is the cert revoked???
int revocationStatus =
MSF.MSVerifyCertRevocation(certblob);
switch (revocationStatus) {
case 0: // cert is revoked
return AskUserWhatHeWantsToDo(DontKnowFlag);
case 1: // cert is not revoked
return false;
default:
}

// processing error - cannot determine
// if cert is revoked
return AskUserWhatHeWantsToDo(DontKnowFlag);
}


函数MSgetCRL()和MSVerifyCertRevocation()由方法isCertRevoked()调用(如列表3所示)。MSgetCRL()调用Microsoft函数CryptRetrieveObjectByURL(),如果在缓存中没有CRL,可以用该函数来下载它。函数MSVerifyCertRevocation()调用Microsoft函数CertVerifyRevocation()来查看一个证书是否已被撤消。
MSgetCRL(jstring jurl)
{
if (!CryptRetrieveObjectByUrl(
url, CONTEXT_OID_CRL, 0, timeout*1000,
(LPVOID)&crl, NULL, NULL, NULL, NULL)) {
printf("CryptRetrieveObjectByUrl failed\n");
// cached url is corrupted
DeleteUrlCacheEntry(url);
return JNI_FALSE;
}
return JNI_TRUE;
}

MSVerifyCertRevocation (jbyteArray jCert)
{
rgpvContext[0] = (PVOID)pCertContext;
if (CertVerifyRevocation(X509_ASN_ENCODING,
CERT_CONTEXT_REVOCATION_TYPE, 1, rgpvContext,
0, NULL, &status)) {
return 1; // cert is not revoked
}

if (status.dwError == CRYPT_E_REVOKED)
return 0; // cert is revoked

return -2; // processing error
}


samuel edited on 2003-08-22 11:29


话题树型展开
人气 标题 作者 字数 发贴时间
9333 [转载]论Java加密技术与Windows的结合(2) samuel 4830 2003-08-22 11:19
7297 Re:[转载]论Java加密技术与Windows的结合(2) samuel 3768 2003-08-22 11:24
7095 Re:[转载]论Java加密技术与Windows的结合(2) samuel 4534 2003-08-22 11:30
7942 Re:[转载]论Java加密技术与Windows的结合(2) samuel 3685 2003-08-22 11:33

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923