通常用于验证证书的标准在RFC 5280:Internet X.509 公钥基础设施证书和证书撤销列表 (CRL) 配置文件中。证书可以(至少)有两个关于其使用的扩展:Key Usage和Extended Key Usage。
Key Usage 扩展没有专门讨论客户端证书。但是,如果存在此扩展,则digitalSignature
必须设置标志,因为在 SSL/TLS 握手期间,CertificateVerify
TLS 消息使用此证书的私钥进行签名。根据 RFC 5280 的这一部分,这是必需的:
当主题公钥用于验证数字签名时,digitalSignature 位被断言,而不是证书上的签名(第 5 位)和 CRL(第 6 位),例如在实体身份验证服务、数据源身份验证服务和/ 或诚信服务。
(大多数密码套件也需要keyAgreement
。)
如果更具体地了解客户端证书(如果存在扩展名,这是推荐的,但并非总是如此):
id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 }
-- TLS WWW client authentication
-- Key usage bits that may be consistent: digitalSignature
-- and/or keyAgreement
您可以在此 NSS 技术说明中找到有关此的更多详细信息(这应该适用于其他产品)。
当您获得“安全性:KeyUsage 不允许数字签名”时,它似乎表明(非扩展)密钥用法存在于您尝试用作客户端证书的证书中,但未digitalSignature
启用. (这是颁发这些证书的 CA 应该做的事情。)
这与小程序无关。但是,applet 本身的 URL 可能受到客户端证书身份验证的保护,这会因为这些扩展而失败。
在服务器端,由于您在 IIS 后面运行它,因此处理 TLS/SSL 证书验证的是 IIS。Apache Tomcat 不应该真正关心它从哪里获得证书。(在 Java 中,您可以通过配置自定义TrustManager
s 来调整验证证书的方式,但这仅适用于 Java (JSSE) 本身处理 SSL/TLS 连接;它不适用于 Tomcat 落后IIS、Apache Httpd 甚至当它使用 APR 时。)我不确定如何使用 IIS 进行配置,但是netsh http add sslcert called中有一个选项[ usagecheck= ] enable | disable
,听起来它可能会有所帮助。不过,这可能太宽容了。(谨慎使用。)
话虽如此,您似乎在发送证书之前就在客户端收到了错误。我必须承认我没有尝试过,但是您可能可以使用KeyManager
会强制使用该证书的特定内容。我不完全确定这是否可行。
顺便说一句,签署小程序是另一回事。要签署小程序,证书需要具有用于anyExtendedKeyUsage或id-kp-codeSigning的扩展密钥用法。(否则签名会起作用,但运行小程序不会。)您可以在此处找到更多信息:http: //bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5056088