39

HttpClientを使用して、HTTPS 経由で通信しようとすると、次のエラーが表示されます。

スレッド「メイン」の例外 javax.net.ssl.SSLPeerUnverifiedException: ピアが認証されていません。

これが私のコードです:

URI loginUri = new URI("https://myUrl.asp");

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet( loginUri );
HttpResponse response = httpclient.execute( httpget );

このエラーを抑制または削除するにはどうすればよいですか?

4

6 に答える 6

17

この答えは、owlsteadMatの応答に続きます。これは、ME / mobile / Android SSLではなく、SE/EEインストールに適用されます。

まだ誰も言及していないので、これを修正するための「本番環境」について説明します。HttpClientのAuthSSLProtocolSocketFactoryクラスの手順に従って、トラストストアとキーストアを更新します。

  1. 信頼できる証明書をインポートし、トラストストアファイルを生成します

keytool -import -alias "my server cert" -file server.crt -keystore my.truststore

  1. 新しいキーを生成します(トラストストアと同じパスワードを使用します)

keytool -genkey -v -alias "my client key" -validity 365 -keystore my.keystore

  1. 証明書署名要求(CSR)を発行します

keytool -certreq -alias "my client key" -file mycertreq.csr -keystore my.keystore

  1. (自己署名するか、証明書に署名してもらいます)

  2. 信頼できるCAルート証明書をインポートします

keytool -import -alias "my trusted ca" -file caroot.crt -keystore my.keystore

  1. 完全な証明書チェーンを含むPKCS#7ファイルをインポートします

keytool -import -alias "my client key" -file mycert.p7 -keystore my.keystore

  1. 結果のキーストアファイルの内容を確認します

keytool -list -v -keystore my.keystore

サーバー証明書がない場合は、JKS形式で生成し、CRTファイルとしてエクスポートします。出典:keytoolのドキュメント

keytool -genkey -alias server-alias -keyalg RSA -keypass changeit
    -storepass changeit -keystore my.keystore

keytool -export -alias server-alias -storepass changeit
    -file server.crt -keystore my.keystore
于 2013-03-11T22:35:11.947 に答える
17

注: 実稼働コードではこれを行わないでください。代わりに http を使用するか、上記で提案した実際の自己署名公開鍵を使用してください。

HttpClient 4.xx の場合:

import static org.junit.Assert.assertEquals;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.junit.Test;

public class HttpClientTrustingAllCertsTest {

    @Test
    public void shouldAcceptUnsafeCerts() throws Exception {
        DefaultHttpClient httpclient = httpClientTrustingAllSSLCerts();
        HttpGet httpGet = new HttpGet("https://host_with_self_signed_cert");
        HttpResponse response = httpclient.execute( httpGet );
        assertEquals("HTTP/1.1 200 OK", response.getStatusLine().toString());
    }

    private DefaultHttpClient httpClientTrustingAllSSLCerts() throws NoSuchAlgorithmException, KeyManagementException {
        DefaultHttpClient httpclient = new DefaultHttpClient();

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, getTrustingManager(), new java.security.SecureRandom());

        SSLSocketFactory socketFactory = new SSLSocketFactory(sc);
        Scheme sch = new Scheme("https", 443, socketFactory);
        httpclient.getConnectionManager().getSchemeRegistry().register(sch);
        return httpclient;
    }

    private TrustManager[] getTrustingManager() {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                // Do nothing
            }

            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                // Do nothing
            }

        } };
        return trustAllCerts;
    }
}
于 2012-10-04T18:21:11.237 に答える
12

HttpClient 3.xを使用して、これを行う必要があります。

Protocol easyHttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyHttps);

EasySSLProtocolSocketFactoryの実装はここにあります。

于 2010-02-22T20:34:40.613 に答える
4

この例外は、サーバーが JDK 7 に基づいており、クライアントが JDK 6 で SSL 証明書を使用している場合に発生します。JDK 7 では sslv2hello メッセージ ハンドシェイクはデフォルトで無効になっていますが、JDK 6 では sslv2hello メッセージ ハンドシェイクが有効になっています。このため、クライアントがサーバーに接続しようとすると、sslv2hello メッセージがサーバーに送信され、sslv2hello メッセージが無効になっているため、この例外が発生します。これを解決するには、クライアントを JDK 7 に移行するか、6u91 バージョンの JDK を使用する必要があります。しかし、このバージョンの JDK を入手するには、

于 2015-08-26T07:44:43.880 に答える
0

「secureClient」を返すメソッド (Java 7 環境 - NetBeans IDE および GlassFish サーバー: ポート https はデフォルトで 3920 )、これが役立つことを願っています:

public DefaultHttpClient secureClient() {
    DefaultHttpClient httpclient = new DefaultHttpClient();
    SSLSocketFactory sf;

    KeyStore trustStore;
    FileInputStream trustStream = null;
    File truststoreFile;
    // java.security.cert.PKIXParameters for the trustStore
    PKIXParameters pkixParamsTrust;

    KeyStore keyStore;
    FileInputStream keyStream = null;
    File keystoreFile;
    // java.security.cert.PKIXParameters for the keyStore
    PKIXParameters pkixParamsKey;

    try {
        trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        truststoreFile = new File(TRUSTSTORE_FILE);
        keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystoreFile = new File(KEYSTORE_FILE);
        try {
            trustStream = new FileInputStream(truststoreFile);
            keyStream = new FileInputStream(keystoreFile);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            trustStore.load(trustStream, PASSWORD.toCharArray());
            keyStore.load(keyStream, PASSWORD.toCharArray());
        } catch (IOException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (CertificateException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            pkixParamsTrust = new PKIXParameters(trustStore);
            // accepts Server certificate generated with keytool and (auto) signed by SUN
            pkixParamsTrust.setPolicyQualifiersRejected(false);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            pkixParamsKey = new PKIXParameters(keyStore);
            // accepts Client certificate generated with keytool and (auto) signed by SUN
            pkixParamsKey.setPolicyQualifiersRejected(false);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            sf = new SSLSocketFactory(trustStore);
            ClientConnectionManager manager = httpclient.getConnectionManager();
            manager.getSchemeRegistry().register(new Scheme("https", 3920, sf));
        } catch (KeyManagementException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnrecoverableKeyException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
    } catch (KeyStoreException ex) {
        Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
    }
    // use the httpclient for any httpRequest
    return httpclient;
}
于 2013-02-05T23:09:45.970 に答える
0

ローカル JVM またはリモート サーバーに必要な暗号がない可能性があります。ここに行きます

https://www.oracle.com/java/technologies/javase-jce8-downloads.html

US_export_policy.jar および local_policy.jar を含む zip ファイルをダウンロードします。

既存のファイルを置き換えます (JVM で既存のパスを見つける必要があります)。

Mac では、私のパスはここにありました。/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security

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

于 2020-02-12T20:46:47.120 に答える