Importacao arquivo .crt NFe

Aew galera, estou com uma duvida na hora de fazer um acesso ao webservice da receita estou adicionando o certificado A1 e o cacerts para fazer o acesso esta funcionando certo, mas nao entendi direito o que seria o arquivo cacerts, por exemplo

[code]
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

        System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

        System.clearProperty("javax.net.ssl.keyStore");
        System.clearProperty("javax.net.ssl.keyStorePassword");
        System.clearProperty("javax.net.ssl.trustStore");

        System.setProperty("javax.net.ssl.keyStore", "C:/certificado.pfx");
        System.setProperty("javax.net.ssl.keyStorePassword", "0000");

        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", "C:\NFeCacerts");// Arquivo cacerts estou usando um que encontrei num exemplo mas nao sei o conteudo desse arquivo[/code]

Procurei e encontrei uma classe para adicionar os dados no arquivo cacerts no arquivo do jdk do java

[code]private static final String JSSECACERTS = "NFeCacerts";
private static final int TIMEOUT_WS = 30;

public static void main(String[] args) {
    try {
        char[] passphrase = "changeit".toCharArray();

        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");
            }
        }

        info("| Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        /**
         * AM - 2.00: homnfe.sefaz.am.gov.br
         * BA - 2.00: hnfe.sefaz.ba.gov.br
         * CE - 2.00: nfeh.sefaz.ce.gov.br
         * GO - 2.00: homolog.sefaz.go.gov.br
         * MG - 2.00: hnfe.fazenda.mg.gov.br
         * MS - 2.00: homologacao.nfe.ms.gov.br
         * MT - 2.00: homologacao.sefaz.mt.gov.br
         * PE - 2.00: nfehomolog.sefaz.pe.gov.br
         * PR - 2.00: homologacao.nfe2.fazenda.pr.gov.br
         * RS - 2.00: homologacao.nfe.sefaz.rs.gov.br
         * SP - 2.00: homologacao.nfe.fazenda.sp.gov.br
         * SCAN	- 2.00: hom.nfe.fazenda.gov.br
         * SVAN	- 2.00: hom.sefazvirtual.fazenda.gov.br
         * SVRS - 2.00: homologacao.nfe.sefazvirtual.rs.gov.br
         */
        get("homnfe.sefaz.am.gov.br", 443, ks);
        get("hnfe.sefaz.ba.gov.br", 443, ks);
        get("nfeh.sefaz.ce.gov.br", 443, ks);
        get("homolog.sefaz.go.gov.br", 443, ks);
        get("hnfe.fazenda.mg.gov.br", 443, ks);
        get("homologacao.nfe.ms.gov.br", 443, ks);
        get("homologacao.sefaz.mt.gov.br", 443, ks);
        get("nfehomolog.sefaz.pe.gov.br", 443, ks);
        get("homologacao.nfe2.fazenda.pr.gov.br", 443, ks);
        get("homologacao.nfe.sefaz.rs.gov.br", 443, ks);
        get("homologacao.nfe.fazenda.sp.gov.br", 443, ks);
        get("hom.nfe.fazenda.gov.br", 443, ks);
        get("hom.sefazvirtual.fazenda.gov.br", 443, ks);
        get("homologacao.nfe.sefazvirtual.rs.gov.br", 443, ks);

        File cafile = new File(JSSECACERTS);
        OutputStream out = new FileOutputStream(cafile);
        ks.store(out, passphrase);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void get(String host, int port, KeyStore ks) throws Exception {
    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();

    info("| Opening connection to " + host + ":" + port + "...");
    SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
    socket.setSoTimeout(TIMEOUT_WS * 1000);
    try {
        info("| Starting SSL handshake...");
        socket.startHandshake();
        socket.close();
        info("| No errors, certificate is already trusted");
    } catch (SSLHandshakeException e) {
        /**
         * PKIX path building failed: 
         * sun.security.provider.certpath.SunCertPathBuilderException: 
         * unable to find valid certification path to requested target
         * N�o tratado, pois sempre ocorre essa exce��o quando o cacerts
         * nao esta gerado.
         */
    } catch (SSLException e) {
        error("| " + e.toString());
    }

    X509Certificate[] chain = tm.chain;
    if (chain == null) {
        info("| Could not obtain server certificate chain");
    }

    info("| Server sent " + chain.length + " certificate(s):");
    MessageDigest sha1 = MessageDigest.getInstance("SHA1");
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    for (int i = 0; i < chain.length; i++) {
        X509Certificate cert = chain[i];
        sha1.update(cert.getEncoded());
        md5.update(cert.getEncoded());

        String alias = host + "-" + (i);
        ks.setCertificateEntry(alias, cert);
        info("| Added certificate to keystore '" + JSSECACERTS + "' using alias '" + alias + "'");
    }
}

private static class SavingTrustManager implements X509TrustManager {

    private final X509TrustManager tm;
    private X509Certificate[] chain;

    SavingTrustManager(X509TrustManager tm) {
        this.tm = tm;
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        throw new UnsupportedOperationException();
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        throw new UnsupportedOperationException();
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        this.chain = chain;
        tm.checkServerTrusted(chain, authType);
    }
}

private static void info(String log) {
    System.out.println("INFO: " + log);
}

private static void error(String log) {
    System.out.println("ERROR: " + log);
}[/code]

mas nao entendi o que realmente essa classe faz se alguem pudesse me dar uma explicaçao, ja entendi que o servidor da receita tem o certificado .crt e eu tenho de passar o certificado na verdade adicionar os certificados em um arquivo para passar seria isso mesmo?