提交 a275ce91 编写于 作者: M mbalao

8227758: More valid PKIX processing

Reviewed-by: andrew
上级 ce00db43
/* /*
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -209,6 +209,7 @@ public final class PKIXValidator extends Validator { ...@@ -209,6 +209,7 @@ public final class PKIXValidator extends Validator {
("null or zero-length certificate chain"); ("null or zero-length certificate chain");
} }
// Use PKIXExtendedParameters for timestamp and variant additions // Use PKIXExtendedParameters for timestamp and variant additions
PKIXBuilderParameters pkixParameters = null; PKIXBuilderParameters pkixParameters = null;
try { try {
...@@ -234,30 +235,31 @@ public final class PKIXValidator extends Validator { ...@@ -234,30 +235,31 @@ public final class PKIXValidator extends Validator {
for (int i = 0; i < chain.length; i++) { for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i]; X509Certificate cert = chain[i];
X500Principal dn = cert.getSubjectX500Principal(); X500Principal dn = cert.getSubjectX500Principal();
if (i != 0 &&
!dn.equals(prevIssuer)) { if (i == 0) {
if (trustedCerts.contains(cert)) {
return new X509Certificate[] {chain[0]};
}
} else {
if (!dn.equals(prevIssuer)) {
// chain is not ordered correctly, call builder instead // chain is not ordered correctly, call builder instead
return doBuild(chain, otherCerts, pkixParameters); return doBuild(chain, otherCerts, pkixParameters);
} }
// Check if chain[i] is already trusted. It may be inside // Check if chain[i] is already trusted. It may be inside
// trustedCerts, or has the same dn and public key as a cert // trustedCerts, or has the same dn and public key as a cert
// inside trustedCerts. The latter happens when a CA has // inside trustedCerts. The latter happens when a CA has
// updated its cert with a stronger signature algorithm in JRE // updated its cert with a stronger signature algorithm in JRE
// but the weak one is still in circulation. // but the weak one is still in circulation.
if (trustedCerts.contains(cert) || // trusted cert if (trustedCerts.contains(cert) || // trusted cert
(trustedSubjects.containsKey(dn) && // replacing ... (trustedSubjects.containsKey(dn) && // replacing ...
trustedSubjects.get(dn).contains( // ... weak cert trustedSubjects.get(dn).contains( // ... weak cert
cert.getPublicKey()))) { cert.getPublicKey()))) {
if (i == 0) {
return new X509Certificate[] {chain[0]};
}
// Remove and call validator on partial chain [0 .. i-1] // Remove and call validator on partial chain [0 .. i-1]
X509Certificate[] newChain = new X509Certificate[i]; X509Certificate[] newChain = new X509Certificate[i];
System.arraycopy(chain, 0, newChain, 0, i); System.arraycopy(chain, 0, newChain, 0, i);
return doValidate(newChain, pkixParameters); return doValidate(newChain, pkixParameters);
} }
}
prevIssuer = cert.getIssuerX500Principal(); prevIssuer = cert.getIssuerX500Principal();
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
# #
# @test # @test
# @bug 6802846 8172529 # @bug 6802846 8172529 8227758
# @summary jarsigner needs enhanced cert validation(options) # @summary jarsigner needs enhanced cert validation(options)
# #
# @run shell/timeout=240 concise_jarsigner.sh # @run shell/timeout=240 concise_jarsigner.sh
...@@ -207,15 +207,11 @@ $JARSIGNER -strict -keystore $KS -storepass changeit a.jar altchain ...@@ -207,15 +207,11 @@ $JARSIGNER -strict -keystore $KS -storepass changeit a.jar altchain
$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain $JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
[ $? = 0 ] || exit $LINENO [ $? = 0 ] || exit $LINENO
# if ca2 is removed, -certchain still work because altchain is a self-signed entry and # if ca2 is removed and cert is imported, -certchain won't work because this certificate
# it is trusted by jarsigner # entry is not trusted
# save ca2.cert for easy replay # save ca2.cert for easy replay
$KT -exportcert -file ca2.cert -alias ca2 $KT -exportcert -file ca2.cert -alias ca2
$KT -delete -alias ca2 $KT -delete -alias ca2
$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
[ $? = 0 ] || exit $LINENO
# if cert is imported, -certchain won't work because this certificate entry is not trusted
$KT -importcert -file certchain -alias altchain -noprompt $KT -importcert -file certchain -alias altchain -noprompt
$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain $JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
[ $? = 4 ] || exit $LINENO [ $? = 4 ] || exit $LINENO
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册