论Java加密技术与Windows的结合 (4)
· 服务器接收来自所有客户端的TCP连接,有些客户端可能是恶意的。服务器可以要求客户端用一个数字证书向服务器证明身份。那样的话,客户端的身份就可以被确认,而且多种信任级别也可以实现了。如果服务器不要求客户端证明身份,服务器应该假设所有的客户端都是恶意的。
你可以在checkServerTrusted()中看到,实现客户端安全策略是很容易的。CheckServerTrusted()检查签名、信任链中证书的有效日期和CRLs。(我在后面会探讨证书撤消处理。)checkClientTrusted()方法与checkServerTrusted()是一样的。一般来说,这个安全策略对服务器来说并不够。一种增强服务器安全状态的方法就是要求客户端用数字证书来证明身份,只接受由一个特定的CA(如VeriSign CA)发布的证书,并且检验证书的Subject Distinguished Name中的特殊字段(如0=sun.com)。只需要几行Java代码就可以把这个过程添加到checkClientTrusted()中了。你需要定制checkClientTrusted()来实现你的安全策略(见列表2)。
checkClientTrusted()方法检查签名、信任链中证书的有效日期和CRLs。但是,对服务器来说,这个安全函数并不够。你可以通过定制checkClientTrusted()来增强安全策略。
public void checkClientTrusted(
X509Certificate chain[]) {
// DontKnowFlag indicates what to do if we're
// not sure if the certificate is revoked
// int DontKnowFlag=0; // reject the cert
// int DontKnowFlag=1; // accept the cert
int DontKnowFlag=2; // ask the user
// check for revoked certs in the cert chain
if (com.boyter.mscrypto.MSValidCertificate.
isCertChainValid(chain, DontKnowFlag))
return;
// client cert is not trusted
System.out.println("Client Certificate is not Trusted - aborting");
System.exit(2);
}
Java提供了几个与证书链处理相关的类,在Java Certification Path API Programmer's Guide中有进一步说明。我对它们做过实验,最后决定不用它们,因为我认为它们太复杂了。
TrustManager有第三个方法getAcceptedIssuers()。该方法为Microsoft证书库中所有CAs返回一组证书。Microsoft将这些证书存储在Registry中;你可以通过启动REGEDIT程序并查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\Root\Certificates找到它们。GetAcceptedIssuers()方法执行了Microsoft的本地函数Cert


您的位置:
