Ich versuche, eine HTTPS-Anforderung von meinem Java EE-Programm an den Host zu senden, für den eine Zertifikatauthentifizierung erforderlich ist. Ich habe eine richtige Keystore-Datei, Truststore mit importierter CA, die Auflistung beider zeigt, dass Zertifikate drin sind.KeyUsage lässt keine digitalen Signaturen zu
Aber ich die folgende Fehlermeldung:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: KeyUsage does not allow digital signatures
at ...
...
Caused by: sun.security.validator.ValidatorException: KeyUsage does not allow digital signatures
at sun.security.validator.EndEntityChecker.checkTLSServer(EndEntityChecker.java:270)
at sun.security.validator.EndEntityChecker.check(EndEntityChecker.java:141)
at sun.security.validator.Validator.validate(Validator.java:264)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319)
... 29 more
Anzeigen der Zertifikatinhalte in dem Teil der Erweiterungen Ich sehe die folgenden:
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 33 87 72 1D 09 2F DF FF 1A A7 D1 C0 E1 CF C5 FA 3.r../..........
0010: A4 19 54 2E ..T.
]
]
#2: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
NetscapeCertType [
SSL client
]
#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 74 9F 43 07 CC 75 FA D3 D0 13 0F 65 36 CC 4A 9A t.C..u.....e6.J.
0010: E0 8E 9C 52 ...R
]
]
#4: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://test.az:7447/Test%20CA.crl]
]]
#5: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
]
So hat mein Zertifikat zu enthalten KeyUsage [Digitalsignatur]
Das Code-Snippet des Ortes, an dem die Ausnahme ausgelöst wird, sieht wie folgt aus:
private final static int KU_SIGNATURE = 0;
...
private void checkTLSServer(X509Certificate cert, String parameter)
throws CertificateException {
Set<String> exts = getCriticalExtensions(cert);
...
} else if (KU_SERVER_SIGNATURE.contains(parameter)) {
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
ValidatorException.T_EE_EXTENSIONS, cert);
}
}
...
}
und checkKeyUsage Funktion:
private boolean checkKeyUsage(X509Certificate cert, int bit)
throws CertificateException {
boolean[] keyUsage = cert.getKeyUsage();
if (keyUsage == null) {
return true;
}
return (keyUsage.length > bit) && keyUsage[bit];
}
es scheitert in return (keyUsage.length> bit) & & keyUsage [bit];
Die Frage ist, warum das Ergebnis von oben Ausdruck = falsch? Wenn Bit = 0 und cert.getKeyUsage() muss ein Array von Boolean [true, false, false, false, false, false, false, false] zurückgeben
Haben Sie alle Zertifikate in der Kette (insbesondere die CA-Zertifikate) überprüft? – Bruno
Ja, in der Tat verwende ich Keystore und Truststore von meinem alten Server, der JRE6 ausführt, und es gibt kein Problem, aber das neue mit JRE7 löst obige Ausnahme aus. – chaplean
Erhalten Sie etwas genaueres mit '-Djavax.net.debug = all'? – Bruno