keytool -import -alias ntt -file ntt.cer -keystore ntt.truststore
我用上面的命令导入一个证书的时候提示证书日期
是2007-2008,然后抛异常
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)我想是不是应为我导入的证书过期了?但是我现在又不知道怎么能导入不过期的证书?
   

解决方案 »

  1.   

    keytool -import -alias ntt -file ntt.cer -keystore ntt.truststore我用上面语句导出的时候提示下面的~有效期过期了。。不知道该怎么做了。55
    所有者:[email protected], CN=UBIservice-IS, OU=Service, O=UBI.service, L=Beijing, ST=Beijing, C=CN
    签发人:CN=CBO Networks Certification Authority, O=Cbo Networks, L=Ann CBO,ST=Michigan, C=US
    序列号:789
    有效期: Thu Jun 29 09:52:22 CST 2006 至Wed Mar 25 09:52:22 CST 2009
    证书指纹:
             MD5:81:2D:F9:66:39:97:1C:52:EC:3B:E5:E3:73:A1:FB:DE
             SHA1:0E:E1:E0:48:B3:15:95:99:69:FD:32:8F:B7:61:51:71:1F:4F:DA:69
             签名算法名称:MD5withRSA
             版本: 3扩展:
      

  2.   

    What happened was that the program opened a connection to the specified host and started an SSL handshake. It printed the exception stack trace of the error that occured and shows you the certificates used by the server. Now it prompts you for the certificate you want to add to your trusted KeyStore. You should only do this if you are sure that this is the certificate of the trusted host you want to connect to.  You may want to check the MD5 and SHA1 certificate fingerprints against a fingerprint generated on the server (e.g. using keytool) to make sure it is the correct certificate.If you've changed your mind, enter 'q'. If you really want to add the certificate, enter '1'. (You could also add a CA certificate by entering a different certificate, but you usually don't want to do that'). Once you have made your choice, the program will print the following:[
    [
      Version: V3
      Subject: CN=ecc.fedora.redhat.com, O=example.com, C=US
      Signature Algorithm: MD5withRSA, OID = 1.2.840.113549.1.1.4  Key:  SunPKCS11-Solaris RSA public key, 1024 bits (id 5158256, session object)
      modulus: 1402933022884660852748661816869706021655226675890
    635441166580364941191074987345500771612454338502131694873337
    233737712894815966313948609351561047977102880577818156814678
    041303637255354084762814638611185951230474669455913908815827
    173696651397340074281578017567044868711049821409365743953199
    69584127568303024757
      public exponent: 65537
      Validity: [From: Wed Jan 18 13:16:12 PST 2006,
                   To: Wed Apr 18 14:16:12 PDT 2007]
      Issuer: CN=Certificate Shack, O=example.com, C=US
      SerialNumber: [    0f]Certificate Extensions: 2
    [1]: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
    NetscapeCertType [
       SSL server
    ][2]: ObjectId: 2.5.29.15 Criticality=false
    KeyUsage [
      Key_Encipherment
    ]]
      Algorithm: [MD5withRSA]
      Signature:
    0000: 6D F4 2A 63 76 2A 05 70   A2 21 0E 1E 4A 31 BE 6B  m.*cv*.p.!..J1.k
    0010: 15 64 D8 BB 35 36 82 B0   0D 2A 96 FA 7A 9F A1 59  .d..56...*..z..Y
    0020: CA 90 C3 28 C5 A6 9B 59   05 3B EB B2 8D C9 5E 38  ...(...Y.;....^8
    0030: 62 ED 1A D7 93 DF 2A A5   D6 54 94 23 15 A2 0C E5  b.....*..T.#....
    0040: 13 40 2C 3E 59 E4 2A EB   51 AC 9E 28 44 23 87 B1  .@,>Y.*.Q..(D#..
    0050: 34 0B AC F3 E0 39 CA B8   35 B4 78 07 BF 28 4C C4  4....9..5.x..(L.
    0060: 9A 2B A3 E9 04 26 78 19   F0 62 EA 0A B5 BB DC 0B  .+...&x..b......
    0070: 90 59 E7 77 90 F8 BC 8A   1B 74 4B 4D C1 F8 3B 6C  .Y.w.....tKM..;l]Added certificate to keystore 'jssecacerts' using alias 'ecc.fedora.redhat.com-1'It displayed the complete certificate and then added it to a Java KeyStore 'jssecacerts' in the current directory. To use it in your program, either configure JSSE to use it as its trust store (as explained in the documentation) or copy it into your $JAVA_HOME/jre/lib/security directory. If you want all Java applications to recognize the certificate as trusted and not just JSSE, you could also overwrite the cacerts file in that directory.After all that, JSSE will be able to complete a handshake with the host, which you can verify by running the program again:% java InstallCert ecc.fedora.redhat.com
    Loading KeyStore jssecacerts...
    Opening connection to ecc.fedora.redhat.com:443...
    Starting SSL handshake...No errors, certificate is already trustedServer sent 2 certificate(s): 1 Subject CN=ecc.fedora.redhat.com, O=example.com, C=US
       Issuer  CN=Certificate Shack, O=example.com, C=US
       sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7 
       md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54  2 Subject CN=Certificate Shack, O=example.com, C=US
       Issuer  CN=Certificate Shack, O=example.com, C=US
       sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6 
       md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68 Enter certificate to add to trusted keystore or 'q' to quit: [1]
    q
    KeyStore not changedI hope that helps. For more information about the InstallCert program, have a look at the source code. I am sure you can figure out how it works. 
      

  3.   


    /*
     * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *   - Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   - Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     *   - Neither the name of Sun Microsystems nor the names of its
     *     contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */import java.io.*;
    import java.net.URL;import java.security.*;
    import java.security.cert.*;import javax.net.ssl.*;public class InstallCert {    public static void main(String[] args) throws Exception {
    String host;
    int port;
    char[] passphrase;
    if ((args.length == 1) || (args.length == 2)) {
        String[] c = args[0].split(":");
        host = c[0];
        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
        String p = (args.length == 1) ? "changeit" : args[1];
        passphrase = p.toCharArray();
    } else {
        System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
        return;
    } File file = new File("jssecacerts");
    if (file.isFile() == false) {
        char SEP = File.separatorChar;
        File dir = new File(System.getProperty("java.home") + SEP
        + "lib" + SEP + "security");
        file = new File(dir, "jssecacerts");
        if (file.isFile() == false) {
    file = new File(dir, "cacerts");
        }
    }
    System.out.println("Loading KeyStore " + file + "...");
    InputStream in = new FileInputStream(file);
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(in, passphrase);
    in.close(); SSLContext context = SSLContext.getInstance("TLS");
    TrustManagerFactory tmf =
        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ks);
    X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
    SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
    context.init(null, new TrustManager[] {tm}, null);
    SSLSocketFactory factory = context.getSocketFactory(); System.out.println("Opening connection to " + host + ":" + port + "...");
    SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
    socket.setSoTimeout(10000);
    try {
        System.out.println("Starting SSL handshake...");
        socket.startHandshake();
        socket.close();
        System.out.println();
        System.out.println("No errors, certificate is already trusted");
    } catch (SSLException e) {
        System.out.println();
        e.printStackTrace(System.out);
    } X509Certificate[] chain = tm.chain;
    if (chain == null) {
        System.out.println("Could not obtain server certificate chain");
        return;
    } BufferedReader reader =
    new BufferedReader(new InputStreamReader(System.in)); System.out.println();
    System.out.println("Server sent " + chain.length + " certificate(s):");
    System.out.println();
    MessageDigest sha1 = MessageDigest.getInstance("SHA1");
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    for (int i = 0; i < chain.length; i++) {
        X509Certificate cert = chain[i];
        System.out.println
         (" " + (i + 1) + " Subject " + cert.getSubjectDN());
        System.out.println("   Issuer  " + cert.getIssuerDN());
        sha1.update(cert.getEncoded());
        System.out.println("   sha1    " + toHexString(sha1.digest()));
        md5.update(cert.getEncoded());
        System.out.println("   md5     " + toHexString(md5.digest()));
        System.out.println();
    } System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
    String line = reader.readLine().trim();
    int k;
    try {
        k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
    } catch (NumberFormatException e) {
        System.out.println("KeyStore not changed");
        return;
    } X509Certificate cert = chain[k];
    String alias = host + "-" + (k + 1);
    ks.setCertificateEntry(alias, cert); OutputStream out = new FileOutputStream("jssecacerts");
    ks.store(out, passphrase);
    out.close(); System.out.println();
    System.out.println(cert);
    System.out.println();
    System.out.println
    ("Added certificate to keystore 'jssecacerts' using alias '"
    + alias + "'");
        }    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();    private static String toHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder(bytes.length * 3);
    for (int b : bytes) {
        b &= 0xff;
        sb.append(HEXDIGITS[b >> 4]);
        sb.append(HEXDIGITS[b & 15]);
        sb.append(' ');
    }
    return sb.toString();
        }    private static class SavingTrustManager implements X509TrustManager { private final X509TrustManager tm;
    private X509Certificate[] chain; SavingTrustManager(X509TrustManager tm) {
        this.tm = tm;
    } public X509Certificate[] getAcceptedIssuers() {
        throw new UnsupportedOperationException();
    } public void checkClientTrusted(X509Certificate[] chain, String authType)
    throws CertificateException {
        throw new UnsupportedOperationException();
    } public void checkServerTrusted(X509Certificate[] chain, String authType)
    throws CertificateException {
        this.chain = chain;
        tm.checkServerTrusted(chain, authType);
    }
        }}
    你是用这个导入的吗?兄弟
      

  4.   


    55555555我是用
    keytool -import -alias ntt -file ntt.cer -keystore ntt.truststore
    导入的啊。
    然后提示签发人:CN=AaD Networks Certification Authority, O=AaD Networks, L=Ann AaD,ST=MDSn, C=US
    序列号:628
    有效期: Thu Jun 19 02:22:21 CST 2007 至Wed Mar 15 07:22:12 CST 2008
    证书指纹:
             MD5:81:2E:F9:66:39:9A:13:51:EC:3B:F5:C3:73:A1:FB:DE
             SHA1:0E:E1:E0:48:B3:19:9A:99:C9:FD:32:8F:B7:A1:E1:F1:1D:4F:DA:69
             签名算法名称:MD5withRSA
             版本: 3
    应该是过期了啊!!!555555555555555我的qq是
    923570482希望能加一下啊~~比较着急啊555
      

  5.   


    55555555我是用
    keytool -import -alias ntt -file ntt.cer -keystore ntt.truststore
    导入的啊。
    然后提示签发人:CN=AaD Networks Certification Authority, O=AaD Networks, L=Ann AaD,ST=MDSn, C=US
    序列号:628
    有效期: Thu Jun 19 02:22:21 CST 2007 至Wed Mar 15 07:22:12 CST 2008
    证书指纹:
             MD5:81:2E:F9:66:39:9A:13:51:EC:3B:F5:C3:73:A1:FB:DE
             SHA1:0E:E1:E0:48:B3:19:9A:99:C9:FD:32:8F:B7:A1:E1:F1:1D:4F:DA:69
             签名算法名称:MD5withRSA
             版本: 3
    应该是过期了啊!!!555555555555555我的qq是
    923570482希望能加一下啊~~比较着急啊555
      

  6.   


    55555555我是用
    keytool -import -alias ntt -file ntt.cer -keystore ntt.truststore
    导入的啊。
    然后提示签发人:CN=AaD Networks Certification Authority, O=AaD Networks, L=Ann AaD,ST=MDSn, C=US
    序列号:628
    有效期: Thu Jun 19 02:22:21 CST 2007 至Wed Mar 15 07:22:12 CST 2008
    证书指纹:
             MD5:81:2E:F9:66:39:9A:13:51:EC:3B:F5:C3:73:A1:FB:DE
             SHA1:0E:E1:E0:48:B3:19:9A:99:C9:FD:32:8F:B7:A1:E1:F1:1D:4F:DA:69
             签名算法名称:MD5withRSA
             版本: 3
    应该是过期了啊!!!555555555555555我的qq是
    923570482希望能加一下啊~~比较着急啊555