6825352: support self-issued certificate in keytool
Reviewed-by: xuelei
This commit is contained in:
parent
1870624c08
commit
b01525e89b
@ -2545,7 +2545,19 @@ public final class KeyTool {
|
|||||||
* Returns true if the certificate is self-signed, false otherwise.
|
* Returns true if the certificate is self-signed, false otherwise.
|
||||||
*/
|
*/
|
||||||
private boolean isSelfSigned(X509Certificate cert) {
|
private boolean isSelfSigned(X509Certificate cert) {
|
||||||
return cert.getSubjectDN().equals(cert.getIssuerDN());
|
return signedBy(cert, cert);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean signedBy(X509Certificate end, X509Certificate ca) {
|
||||||
|
if (!ca.getSubjectDN().equals(end.getIssuerDN())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
end.verify(ca.getPublicKey());
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2869,20 +2881,18 @@ public final class KeyTool {
|
|||||||
Certificate tmpCert = replyCerts[0];
|
Certificate tmpCert = replyCerts[0];
|
||||||
replyCerts[0] = replyCerts[i];
|
replyCerts[0] = replyCerts[i];
|
||||||
replyCerts[i] = tmpCert;
|
replyCerts[i] = tmpCert;
|
||||||
Principal issuer = ((X509Certificate)replyCerts[0]).getIssuerDN();
|
|
||||||
|
X509Certificate thisCert = (X509Certificate)replyCerts[0];
|
||||||
|
|
||||||
for (i=1; i < replyCerts.length-1; i++) {
|
for (i=1; i < replyCerts.length-1; i++) {
|
||||||
// find a cert in the reply whose "subject" is the same as the
|
// find a cert in the reply who signs thisCert
|
||||||
// given "issuer"
|
|
||||||
int j;
|
int j;
|
||||||
for (j=i; j<replyCerts.length; j++) {
|
for (j=i; j<replyCerts.length; j++) {
|
||||||
Principal subject;
|
if (signedBy(thisCert, (X509Certificate)replyCerts[j])) {
|
||||||
subject = ((X509Certificate)replyCerts[j]).getSubjectDN();
|
|
||||||
if (subject.equals(issuer)) {
|
|
||||||
tmpCert = replyCerts[i];
|
tmpCert = replyCerts[i];
|
||||||
replyCerts[i] = replyCerts[j];
|
replyCerts[i] = replyCerts[j];
|
||||||
replyCerts[j] = tmpCert;
|
replyCerts[j] = tmpCert;
|
||||||
issuer = ((X509Certificate)replyCerts[i]).getIssuerDN();
|
thisCert = (X509Certificate)replyCerts[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2892,18 +2902,6 @@ public final class KeyTool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now verify each cert in the ordered chain
|
|
||||||
for (i=0; i<replyCerts.length-1; i++) {
|
|
||||||
PublicKey pubKey = replyCerts[i+1].getPublicKey();
|
|
||||||
try {
|
|
||||||
replyCerts[i].verify(pubKey);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new Exception(rb.getString
|
|
||||||
("Certificate chain in reply does not verify: ") +
|
|
||||||
e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (noprompt) {
|
if (noprompt) {
|
||||||
return replyCerts;
|
return replyCerts;
|
||||||
}
|
}
|
||||||
@ -3035,9 +3033,8 @@ public final class KeyTool {
|
|||||||
private boolean buildChain(X509Certificate certToVerify,
|
private boolean buildChain(X509Certificate certToVerify,
|
||||||
Vector<Certificate> chain,
|
Vector<Certificate> chain,
|
||||||
Hashtable<Principal, Vector<Certificate>> certs) {
|
Hashtable<Principal, Vector<Certificate>> certs) {
|
||||||
Principal subject = certToVerify.getSubjectDN();
|
|
||||||
Principal issuer = certToVerify.getIssuerDN();
|
Principal issuer = certToVerify.getIssuerDN();
|
||||||
if (subject.equals(issuer)) {
|
if (isSelfSigned(certToVerify)) {
|
||||||
// reached self-signed root cert;
|
// reached self-signed root cert;
|
||||||
// no verification needed because it's trusted.
|
// no verification needed because it's trusted.
|
||||||
chain.addElement(certToVerify);
|
chain.addElement(certToVerify);
|
||||||
|
69
jdk/test/sun/security/tools/keytool/selfissued.sh
Normal file
69
jdk/test/sun/security/tools/keytool/selfissued.sh
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
#
|
||||||
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License version 2 only, as
|
||||||
|
# published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
# version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
# accompanied this code).
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License version
|
||||||
|
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
#
|
||||||
|
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
# have any questions.
|
||||||
|
#
|
||||||
|
|
||||||
|
# @test
|
||||||
|
# @bug 6825352
|
||||||
|
# @summary support self-issued certificate in keytool
|
||||||
|
#
|
||||||
|
# @run shell selfissued.sh
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ "${TESTJAVA}" = "" ] ; then
|
||||||
|
JAVAC_CMD=`which javac`
|
||||||
|
TESTJAVA=`dirname $JAVAC_CMD`/..
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set platform-dependent variables
|
||||||
|
OS=`uname -s`
|
||||||
|
case "$OS" in
|
||||||
|
Windows_* )
|
||||||
|
FS="\\"
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
FS="/"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
KS=selfsigned.jks
|
||||||
|
KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS"
|
||||||
|
|
||||||
|
rm $KS
|
||||||
|
|
||||||
|
$KT -alias ca -dname CN=CA -genkeypair
|
||||||
|
$KT -alias me -dname CN=CA -genkeypair
|
||||||
|
$KT -alias e1 -dname CN=E1 -genkeypair
|
||||||
|
$KT -alias e2 -dname CN=E2 -genkeypair
|
||||||
|
|
||||||
|
# me signed by ca, self-issued
|
||||||
|
$KT -alias me -certreq | $KT -alias ca -gencert | $KT -alias me -importcert
|
||||||
|
|
||||||
|
# Import e1 signed by me, should add me and ca
|
||||||
|
$KT -alias e1 -certreq | $KT -alias me -gencert | $KT -alias e1 -importcert
|
||||||
|
$KT -alias e1 -list -v | grep '\[3\]' || { echo Bad E1; exit 1; }
|
||||||
|
|
||||||
|
# Import (e2 signed by me,ca,me), should reorder to (e2,me,ca)
|
||||||
|
( $KT -alias e2 -certreq | $KT -alias me -gencert; $KT -exportcert -alias ca; $KT -exportcert -alias me ) | $KT -alias e2 -importcert
|
||||||
|
$KT -alias e2 -list -v | grep '\[3\]' || { echo Bad E2; exit 1; }
|
||||||
|
|
||||||
|
echo Good
|
||||||
|
|
Loading…
Reference in New Issue
Block a user