Chứng chỉ X.509 có thể bao gồm key usage fields (KU) và extended key usage fields (EKU). Oracle tech note describing how to create sign your RIA's tạo chứng chỉ không có cờ sử dụng chính, chỉ hoạt động tốt (nếu bạn có thể nhận được CA tin cậy để ký)
Nhưng ngày càng nhiều, chứng chỉ phát hành của CA với các trường sử dụng chính này. Khi có mặt, các trường này hạn chế việc sử dụng chứng chỉ. Kiểm tra java plugin cho sự hiện diện của các trường này trong 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);
}
phương pháp Séc xem xét như sau:
/**
* 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);
}
Vì vậy, nếu không có KU hoặc EKU được chỉ định, KU hoặc EKU checker hạnh phúc trả về true.
Nhưng
- nếu KU của được quy định, các chữ ký số KU nên một trong số họ.
- nếu bất kỳ của EKU được quy định, hoặc mã EKU ký (được xác định bởi 1.3.6.1.5.5.7.3.3 oid) hoặc EKU bất kỳ việc sử dụng (được xác định bởi 2.5.29.37.0 oid) nên được chỉ định cũng.
Cuối cùng, phương pháp checkRemainingExtensions
kiểm tra EKU còn lại quan trọng. Các chỉ khác quan trọng EKU của phép có mặt là
- trở ngại cơ bản (oid "2.5.29.19") và
- đề alt tên (oid 2.5.29.17)
Nếu nó tìm thấy bất kỳ EKU quan trọng nào khác, nó trả về false.
Darn ... và tôi đặt cược họ đặt những lá cờ đó chỉ để họ có thể phân đoạn thị trường và tính phí nhiều hơn – davr
Ở một mức độ. Nó không giúp đỡ với an ninh mặc dù. –