Сертификаты X.509 могут включать key usage fields (KU) и extended key usage fields (EKU's). Oracle tech note describing how to create sign your RIA's создает сертификат без каких-либо ключевых флагов использования, который работает очень хорошо (если вы можете получить доверенный ЦС для его подписания)
Но все больше сертификатов выпуска CA с этими ключевыми полями использования. Когда они присутствуют, эти поля ограничивают использование сертификатов. Проверки Java Plugin на наличие этих полей в EndEntityChecker:
/**
* Check whether this certificate can be used for code signing.
* @throws CertificateException if not.
*/
private void checkCodeSigning(X509Certificate cert)
throws CertificateException {
Set<String> exts = getCriticalExtensions(cert);
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
ValidatorException.T_EE_EXTENSIONS, cert);
}
if (checkEKU(cert, exts, OID_EKU_CODE_SIGNING) == false) {
throw new ValidatorException
("Extended key usage does not permit use for code signing",
ValidatorException.T_EE_EXTENSIONS, cert);
}
if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_SSL_CLIENT)) {
throw new ValidatorException
("Netscape cert type does not permit use for SSL client",
ValidatorException.T_EE_EXTENSIONS, cert);
}
// do not check Netscape cert type for JCE code signing checks
// (some certs were issued with incorrect extensions)
if (variant.equals(Validator.VAR_JCE_SIGNING) == false) {
if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_CODE_SIGNING)) {
throw new ValidatorException
("Netscape cert type does not permit use for code signing",
ValidatorException.T_EE_EXTENSIONS, cert);
}
exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
}
// remove extensions we checked
exts.remove(SimpleValidator.OID_KEY_USAGE);
exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);
checkRemainingExtensions(exts);
}
метода чеки выглядеть следующим образом:
/**
* Utility method checking if the extended key usage extension in
* certificate cert allows use for expectedEKU.
*/
private boolean checkEKU(X509Certificate cert, Set<String> exts,
String expectedEKU) throws CertificateException {
List<String> eku = cert.getExtendedKeyUsage();
if (eku == null) {
return true;
}
return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}
Так что, если нет KU или ЭК не указан, KU или ЭК проверки счастливо возвращает true.
Но
- если указаны KU-х, цифровая подпись KU должен быть один из них.
- если ЭКУ-х указаны, либо ЭКУ код подписания (идентифицированный OID 1.3.6.1.5.5.7.3.3) или EKU любое использование (идентифицируется OID 2.5.29.37.0) должны быть указаны также.
Наконец, метод checkRemainingExtensions
проверяет оставшиеся критические EKU. Единственный критический ЭКУ позволено присутствовать в
- основные ограничения (подъязычная "2.5.29.19") и
- имя субъекта альт (подъязычная 2.5.29.17)
Если он находит любой другой критический EKU, он возвращает false.
Darn ... и я уверен, они поставили эти флаги только для того, чтобы они могли сегментировать рынок и взимать больше – davr 2008-09-17 16:57:42
В некоторой степени. Однако это помогает в обеспечении безопасности. – 2008-09-18 01:07:24