Nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu - błąd nawet po zaimportowaniu certyfikatu

205

Mam klienta Java, który próbuje uzyskać dostęp do serwera z certyfikatem z podpisem własnym.

Gdy próbuję wysłać wiadomość na serwer, pojawia się następujący błąd:

nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu

Po przeprowadzeniu badań na ten temat, zrobiłem następujące rzeczy.

  1. Zapisałem nazwę domeny moich serwerów jako root.cerplik.
  2. W środowisku JRE mojego serwera Glassfish uruchomiłem to:
    keytool -import -alias example -keystore cacerts -file root.cer
  3. Aby sprawdzić, czy certyfikat został pomyślnie dodany do mojego cacert, zrobiłem to:
    keytool -list -v -keystore cacerts
    Widzę, że certyfikat jest obecny.
  4. Następnie ponownie uruchomiłem Glassfish i wycofałem „post”.

Nadal pojawia się ten sam błąd.

Mam wrażenie, że to dlatego, że mój Glassfish nie czyta pliku cacert, który poprawiłem, ale może jakiś inny.

Czy ktoś z was miał ten problem i może popchnąć mnie we właściwym kierunku?

TheCoder
źródło
1
Żeby wyjaśnić: „Mam klienta Java próbującego uzyskać dostęp do serwera z certyfikatem z podpisem własnym.”: Mówisz o korzystaniu z certyfikatów klienta z podpisem własnym, prawda? Czy jest jakaś konkretna konfiguracja ustawień konektora w Glassfish (w szczególności ustawienia magazynu zaufanych certyfikatów)?
Bruno,
„Mam klienta Java próbującego uzyskać dostęp do serwera z certyfikatem z podpisem własnym.”: Mówisz o korzystaniu z certyfikatów klienta z podpisem własnym, prawda? - tak.
TheCoder
1
Znalazłem 2 ustawienia w Glassfish JVM: -Djavax.net.ssl.keyStore = $ {com.sun.aas.instanceRoot} /config/keystore.jks i -Djavax.net.ssl.trustStore = $ {com.sun. aas.instanceRoot} /config/cacerts.jks. Teraz muszę dodać certyfikat do jednego z nich. Czy możesz potwierdzić, że jest to magazyn kluczy, do którego go dodałem?
TheCoder
4
Na serwerze plik kluczy służy do certyfikatu serwera i jego klucza prywatnego (plik kluczy służy do tego, co „należy” do strony lokalnej). Magazyn zaufanych certyfikatów służy do certyfikatów używanych do weryfikacji zaufania do strony zdalnej. Należy dodać certyfikat klienta do magazynu zaufanych certyfikatów serwera. (Zobacz to też, chociaż Glassfish nie używa domyślnej lokalizacji JRE.)
Bruno
To działało Bruno. Dodałem go do mojego sklepu zaufania Glassfish. Dziękuję bardzo za pomoc. Ty też Dirk.
TheCoder

Odpowiedzi:

155

Niestety - może to być wiele rzeczy - a wiele serwerów aplikacji i innych „opakowań” Java jest skłonnych do zabawy z właściwościami i własnym „własnym” dostępem do pęku kluczy, a co nie. Więc może patrzeć na coś zupełnie innego.

Brak kratownic - spróbowałbym:

java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=trustStore ...

sprawdzić, czy to pomaga. Zamiast „wszystko” można również ustawić na „ssl”, menedżer kluczy i menedżer zaufania - co może pomóc w twoim przypadku. Ustawienie go na „help” spowoduje wyświetlenie czegoś takiego jak na większości platform.

Niezależnie od tego - upewnij się, że w pełni rozumiesz różnicę między magazynem kluczy (w którym masz klucz prywatny i certyfikat, z którym udowadniasz swoją tożsamość) a sklepem zaufania (który określa, komu ufasz) - a faktem, że twoja tożsamość również ma „łańcuch” zaufania do katalogu głównego - który jest niezależny od jakiegokolwiek łańcucha do katalogu głównego, którego potrzebujesz, aby dowiedzieć się, komu ufasz.

all            turn on all debugging
ssl            turn on ssl debugging

The   following can be used with ssl:
    record       enable per-record tracing
    handshake    print each handshake message
    keygen       print key generation data
    session      print session activity
    defaultctx   print default SSL initialization
    sslctx       print SSLContext tracing
    sessioncache print session cache tracing
    keymanager   print key manager tracing
    trustmanager print trust manager tracing
    pluggability print pluggability tracing

    handshake debugging can be widened with:
    data         hex dump of each handshake message
    verbose      verbose handshake message printing

    record debugging can be widened with:
    plaintext    hex dump of record plaintext
    packet       print raw SSL/TLS packets

Źródło: # Patrz http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug

Dirk-Willem van Gulik
źródło
6
Wielkie dzięki! -Djavax.net.ssl.trustStore = / location_of / trustStore rozwiązał mój problem, a informacje o debugowaniu też były bardzo pomocne.
RHE
5
java -Djavax.net.debug = all -Djavax.net.ssl.trustStore = trustStore ... wyświetla następujący błąd: Błąd: Nie można znaleźć lub załadować klasy głównej ...
rohith
1
Oczywiście może być także konieczne podanie hasła do magazynu zaufanych certyfikatów za pomocą opcji -Djavax.net.ssl.trustStorePassword = changeit
user1754036
18

Oto rozwiązanie, kliknij poniższy link Krok po kroku:

http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

PLIK JAVA: którego brakuje w blogu

/*
 * 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);
    }
    }

}
użytkownik6258309
źródło
3
To rozwiązanie działało dla mnie, ale wymaga niewielkiej zmiany w klasie prywatnej SavingTrustManager:public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Richard
1
@ Richard, @ Paul, @ user6258309 Wystąpił błąd Wyjątek w wątku „main” java.net.SocketTimeoutException: Przekroczono limit czasu odczytu w java.net.SocketInputStream.socketRead0 (metoda rodzima) w java.net.SocketInputStream.socketRead (nieznane źródło ) Jak mogę to naprawić
Renjith Krishnan
5
To „so; lution” jest całkowicie niepewne. Nie używać.
Markiz Lorne
9
Ta odpowiedź to głównie kod. Nie wyjaśnia, dlaczego lub dlaczego nie działa.
13

Musisz skonfigurować właściwości systemowe JSSE, w szczególności wskazać magazyn certyfikatów klienta.

Za pomocą wiersza poleceń:

java -Djavax.net.ssl.trustStore=truststores/client.ts com.progress.Client

lub za pomocą kodu Java:

import java.util.Properties;
    ...
    Properties systemProps = System.getProperties();
    systemProps.put("javax.net.ssl.keyStorePassword","passwordForKeystore");
    systemProps.put("javax.net.ssl.keyStore","pathToKeystore.ks");
    systemProps.put("javax.net.ssl.trustStore", "pathToTruststore.ts");
    systemProps.put("javax.net.ssl.trustStorePassword","passwordForTrustStore");
    System.setProperties(systemProps);
    ...

Więcej informacji można znaleźć w szczegółach na stronie RedHat .

Vic
źródło
Miał ten sam problem z Spring Boot, mikrousługami Spring Cloud i samopodpisanym certyfikatem SSL. Byłem w stanie ustawić keyStore i keyStorePassword w application.properties i sprawić, by działało w ten sposób po wyjęciu z pudełka, ale nie udało mi się zrobić tego samego z trustStore i trustStorePassword. Ta odpowiedź działała dla mnie w sklepie zaufania.
Mate Šimović
7

(repost z mojej drugiej odpowiedzi )
Użyj cli użytkową keytool z dystrybucji oprogramowania Java dla importu (i zaufanie! ) niezbędne certyfikaty

Próba:

  1. Z cli zmień katalog na jre \ bin

  2. Sprawdź plik kluczy (plik znaleziony w katalogu jre \ bin)
    keytool -list -keystore .. \ lib \ security \ cacerts
    Hasło zostało zmienione

  3. Pobierz i zapisz wszystkie certyfikaty w łańcuchu z potrzebnego serwera.

  4. Dodaj certyfikaty (przed usunięciem atrybutu „tylko do odczytu” z pliku „.. \ lib \ security \ cacerts”), uruchom: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -plik „r: \ root.crt "

przez przypadek znalazłem taką prostą wskazówkę. Inne rozwiązania wymagają użycia InstallCert.Java i JDK

źródło: http://www.java-samples.com/showtutorial.php?tutorialid=210

Алексей Присяжный
źródło
6

Miałem ten sam problem z sbt .
Próbował pobrać zależności z repo1.maven.org przez ssl,
ale stwierdził, że „nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego docelowego adresu URL”.
więc śledziłem ten post i nadal nie mogłem zweryfikować połączenia.
Przeczytałem o tym i stwierdziłem, że certyfikat root nie jest wystarczający, jak sugerował post, więc -
rzeczą, która działała dla mnie, było zaimportowanie pośrednich certyfikatów CA do magazynu kluczy .
Właściwie dodałem wszystkie certyfikaty w łańcuchu i działało to jak urok.

Danny Mor
źródło
4

Rozwiązanie podczas migracji z JDK 8 do JDK 10

JDK 10

root@c339504909345:/opt/jdk-minimal/jre/lib/security #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 80 entries

JDK 8

root@c39596768075:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 151 entries

Kroki do naprawienia

  • Usunąłem certyfikat JDK 10 i zastąpiłem go JDK 8
  • Ponieważ buduję obrazy Docker, mogłem to szybko zrobić przy użyciu kompilacji wieloetapowych
    • Buduję minimalne środowisko JRE za pomocą jlinkas/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...

Oto różne ścieżki i sekwencja poleceń ...

# Java 8
COPY --from=marcellodesales-springboot-builder-jdk8 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts /etc/ssl/certs/java/cacerts

# Java 10
RUN rm -f /opt/jdk-minimal/jre/lib/security/cacerts
RUN ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Marcello de Sales
źródło
2

Pracuję nad samouczkiem dla usług sieciowych REST na stronie www.udemy.com (REST Java Web Services). Przykład w samouczku mówi, że aby mieć SSL, musimy mieć folder o nazwie „trust_store” w moim projekcie „klienta” zaćmienia, który powinien zawierać plik „magazynu kluczy” (mieliśmy projekt „klienta” do wywołania usługi oraz projekt „usługa”, który zawierał serwis internetowy REST - 2 projekty w tym samym obszarze roboczym zaćmienia, jeden klient, drugi serwis). Aby uprościć sprawę, powiedzieli, aby skopiować plik „keystore.jks” z serwera aplikacji glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks), którego używamy, i umieścić go w tym folderze „trust_store”, w którym kazali mi zrobić projekt klienta. Wydaje się to mieć sens: samopodpisane certyfikaty na serwerze „ s key_store odpowiada certyfikatom w kliencie trust_store. Teraz robiąc to, otrzymałem błąd, o którym wspomina oryginalny post. Poszukałem tego i przeczytałem, że błąd wynika z pliku „keystore.jks” na kliencie nie zawierającego zaufanego / podpisanego certyfikatu, że znaleziony certyfikat jest samopodpisany.

Aby wszystko było jasne, powiem, że w moim rozumieniu plik „keystore.jks” zawiera certyfikaty z podpisem własnym, a plik „cacerts.jks” zawiera certyfikaty CA (podpisane przez urząd certyfikacji). „Plik keystore.jks” to „magazyn kluczy”, a „cacerts.jks” to „magazyn zaufania”. Jak komentuje „Bruno”, komentator powyżej, „keystore.jks” jest lokalny, a „cacerts.jks” jest dla zdalnych klientów.

Więc powiedziałem sobie: hej, glassfish ma również plik „cacerts.jks”, który jest plikiem trust_store glassfish. cacerts.jsk powinien zawierać certyfikaty CA. I najwyraźniej potrzebuję, aby mój folder trust_store zawierał plik magazynu kluczy, który ma co najmniej jeden certyfikat CA. Próbowałem więc umieścić plik „cacerts.jks” w utworzonym przeze mnie folderze „trust_store” w projekcie klienta i zmienić właściwości maszyny wirtualnej, aby wskazywały „cacerts.jks” zamiast „keystore.jks”. Pozbyłem się błędu. Chyba wszystko, czego potrzebował, to certyfikat CA do pracy.

Może to nie być idealne do produkcji, a nawet do rozwoju, poza czymś, co wystarczy do pracy. Na przykład prawdopodobnie można użyć polecenia „keytool”, aby dodać certyfikaty CA do pliku „keystore.jks” na kliencie. Ale i tak mam nadzieję, że przynajmniej zawęzi to możliwe scenariusze, które mogą się wydarzyć, aby spowodować błąd.

RÓWNIEŻ: moje podejście wydawało się przydatne dla klienta (certyfikat serwera dodany do klienta trust_store), wygląda na to, że powyższe komentarze do rozwiązania oryginalnego postu są przydatne dla serwera (certyfikat klienta dodany do serwera trust_store). Twoje zdrowie.

Konfiguracja projektu Eclipse:

  • MyClientProject
  • src
  • test
  • Biblioteka systemowa JRE
  • ...
  • trust_store
    --- cacerts.jks --- keystore.jks

Urywek z pliku MyClientProject.java:

static {
  // Setup the trustStore location and password
  System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
  // comment out below line
  System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
  //System.setProperty("javax.net.debug", "all");

  // for localhost testing only
  javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
        public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost");
        }

  });
}
Steve T.
źródło
1

Mój problem polegał na tym, że Broker zabezpieczeń dostępu do chmury, NetSkope, został zainstalowany na moim laptopie roboczym poprzez aktualizację oprogramowania. Zmieniało to łańcuch certyfikatów i po zaimportowaniu całego łańcucha do magazynu kluczy cacerts nadal nie byłem w stanie połączyć się z serwerem za pośrednictwem mojego klienta Java. Wyłączyłem NetSkope i udało mi się nawiązać połączenie.

gary69
źródło
1

W moim przypadku stanąłem przed problemem, ponieważ w moim procesie tomcat podano określony plik kluczy

-Djavax.net.ssl.trustStore=/pathtosomeselfsignedstore/truststore.jks

Poza tym importowałem certyfikat do cacert JRE / lib / security i zmiany nie odzwierciedlały. Następnie zrobiłem poniżej polecenia, gdzie /tmp/cert1.test zawiera certyfikat serwera docelowego

keytool -import -trustcacerts -keystore /pathtosomeselfsignedstore/truststore.jks -storepass password123 -noprompt -alias rapidssl-myserver -file /tmp/cert1.test

Możemy dokładnie sprawdzić, czy import certyfikatu się powiódł

keytool -list -v -keystore /pathtosomeselfsignedstore/truststore.jks

i sprawdź, czy Twój serwer tagów został znaleziony przeciwko aliasowi rapidssl-myserver

Sanjay Bharwani
źródło
0

Sprawdź, czy plik $JAVA_HOME/lib/security/cacertsistnieje! W moim przypadku nie był to plik, ale łącze do/etc/ssl/certs/java/cacerts a także to był link do siebie (CO ??), dlatego JVM nie może znaleźć pliku.

Rozwiązanie: Skopiuj prawdziwy plik cacerts ( możesz to zrobić z innego JDK ) do /etc/ssl/certs/java/katalogu, a to rozwiąże problem :)

0x7E1
źródło
rzeczywiście JDK utrzymuje łącze i być może dla kompatybilności ze starszymi API, SDK ... Udało mi się to zrobić ... Przenoszę się z JDK 8 na JDK 10 i używam Dockera, więc po prostu musiałem skopiować cacerts z obraz do innego ... Utworzyłem link i dokładnie tak samo ...rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Marcello de Sales
-9

Powiedzmy, że używasz zmiennych ścieżki klas, takich jak $ {JAVA_HOME} w pom.xml.

<target>
                    <property name="compile_classpath" refid="maven.compile.classpath"/>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <property name="test_classpath" refid="maven.test.classpath"/>
                    <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                    <property name="jaxb-api.jar" value="${maven.dependency.javax.xml.bind.jaxb-api.jar.path}"/>
                    <property name="project_home" value="${PROJECT_HOME}"/>
                    <property name="java_home" value="${JAVA_HOME}"/>
                    <property name="ant_home" value="${ANT_HOME}"/>
                    <property name="common_home" value="${COMMON_HOME}"/>
                    <property name="JAXP_HOME" value="${common_home}/lib"/>
                    <property name="ejfw_home" value="${PROJECT_HOME}/lib"/>
                    <property name="weblogic_home" value="${WL_HOME}"/>
                    <property name="fw_home" value="${FW_HOME}"/>
                    <property name="env" value="${BUILDENV}"/>
                    <property name="tokenfile" value="${BUILDENV}${BUILDENV_S2S}.properties"/>

Do celów dodaj zmienne ścieżki klasy. tj., -DANT_HOME, -DJAVA_HOME

clean install -e -DPROJECT_HOME=..... -DANT_HOME=C:\bea1036\modules\org.apache.ant_1.7.1 -DJAVA_HOME=C:\bea1036\jdk160_31
jayakar jayaraman
źródło
1
Ścieżki klas i certyfikaty nie mają ze sobą nic wspólnego.
Markiz Lorne
1
Uważam, że źle zrozumiałeś pytanie.
Dawood ibn Kareem