9

tl;dr: カスタム CA を永続キーストアに追加せずに使用しています。

HTTPS を使用してリモート サーバーに接続する Java アプリケーションを作成しています。接続用のコードは準備ができていますが、サーバーの SSL 証明書はJava の CA ルート証明書ストアにないStartSSLによって署名されています。

このコードを使用して、次のような Web サイトから有効な証明書情報を取得しますhttps://www.google.com/

Response Code : 200
Cipher Suite : TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Cert Type : X.509
Cert Hash Code : -1643391404
Cert Public Key Algorithm : RSA
Cert Public Key Format : X.509

Cert Type : X.509
Cert Hash Code : 771393018
Cert Public Key Algorithm : RSA
Cert Public Key Format : X.509

Cert Type : X.509
Cert Hash Code : 349192256
Cert Public Key Algorithm : RSA
Cert Public Key Format : X.509

同じコードが私のドメインに対して をスローしSSLHandshakeExceptionます ( と呼びましょうhttps://www.example.com/)。

もちろん、証明書をキーストアに手動で追加することもできますkeytool(おそらく を使用してもRuntime.exec("keytool ...")) が、これは汚い方法です。現在計画しているのは、アプリケーション ファイルに StartSSL ルート証明書を追加して配布し、実行時に一時的なキーストアにロードすることです。このようにして、「実際の」キーストアは変更されません。

ここここで読んだことから、 のようないくつかのクラスを台無しにする必要がありますTrustManager検証を完全にオフにする方法も見つけましたが、暗号化された通信の目的全体を排除するように見えるため、これは私が望むものではありません。

まさに私がやりたいことをしているように見えるコード行をいくつか見つけましたが、このメソッドを呼び出す方法、つまりどの値を引数として渡すかわかりません:

public class SSLClasspathTrustStoreLoader {
    public static void setTrustStore(String trustStore, String password) throws Exception {
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        InputStream keystoreStream = SSLClasspathTrustStoreLoader.class.getResourceAsStream(trustStore);
        keystore.load(keystoreStream, password.toCharArray());
        trustManagerFactory.init(keystore);
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustManagers, null);
        SSLContext.setDefault(sc);
    }
}

誰かが以前に同様の状況にあったことがありますか? この問題を処理する方法についてアドバイスをいただければ幸いです。上記のコードを実行するのを手伝っていただければ、本当にうれしいです!

4

2 に答える 2

0

これは私のために働いた!

public static void setTrustStore(String trustStore, String password) throws Exception {
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        InputStream keystoreStream = SSLClasspathTrustStoreLoader.class.getResourceAsStream(trustStore);
        keystore.load(keystoreStream, password.toCharArray());
        trustManagerFactory.init(keystore);
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustManagers, null);
        SSLContext.setDefault(sc);
    }

または、別のオプションは「portecle-1.9」を使用しています

1.1 – Baixar o programa “portecle-1.9”. 
1.1.1   https://sourceforge.net/projects/portecle

1.2 - Acessar a pasta security do JDK que será utilizado para rodar a aplicação
1.2.1   Exemplo: C:\Program Files\Java\jdk1.7.0_67\jre\lib\security
1.2.2   Fazer backup do arquivo “cacerts” (Só por segurança)

1.3 - Abrir o programa portecle  “portecle.jar”
1.3.1   Acessar o “Menu > File > Open Keystore File..”
1.3.2   Selecione o arquivo “cacerts” mande abrir
1.3.3   Irá pedir senha, a senha padrão quando instala o JDK é “changeit”
1.3.4   O programa irá listar os diversos certificados contidos no “cecerts”
1.3.5   Acessar o “Menu > Tools > Import Trusted Certificate…”
1.3.6   Selecione o arquivo de certificado “.pem“ ou “.cer” ou alguma outra extensão compatível.
1.3.7   Será questionado se realmente o arquivo é “trusted” ou seja “confiável” . Aceita como confiavel.
1.3.8   Também será possível alterar o “alias”, provavelmente não será necessário mudar então apenas aceites todas as opções até que receba a mensagem “Certificado importado”.
1.3.9   Clique em “Salvar”, pois se não salvar as alterações não terão efeito!
于 2016-10-27T16:11:08.750 に答える