3

テストのためだけに Java 証明書の検証を無効にする必要があります。だから、リスクは理解しています。次のチュートリアルを使用しました: http://www.rgagnon.com/javadetails/java-fix-certificate-problem-in-HTTPS.html

したがって、コードは次のとおりです。

import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

public class Cert {
  public static void main(String[] args) throws Exception {
    /*
     *  fix for
     *    Exception in thread "main" javax.net.ssl.SSLHandshakeException:
     *       sun.security.validator.ValidatorException:
     *           PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
     *               unable to find valid certification path to requested target
     */
    TrustManager[] trustAllCerts = new TrustManager[] {
       new X509TrustManager() {
          public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
          }

          public void checkClientTrusted(X509Certificate[] certs, String authType) {  }

          public void checkServerTrusted(X509Certificate[] certs, String authType) {  }

       }
    };

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
          return true;
        }
    };
    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    /*
     * end of the fix
     */

    URL url = new URL("https://www.nakov.com:2083/");
    URLConnection con = url.openConnection();
    Reader reader = new InputStreamReader(con.getInputStream());
    while (true) {
      int ch = reader.read();
      if (ch==-1) {
        break;
      }
      System.out.print((char)ch);
    }
      }
    }

私はまだ次のエラーが発生します。どんな体でも助けてくれますか?

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: https://www.nakov.com:2083/
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1615)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at MainProject.Cert.main(Cert.java:56)
4

4 に答える 4

4

「修正」と例外は無関係のようです。修正により、クライアントによるサーバーの証明書の検証が無効になりますが、例外は、クライアントがその URL へのアクセスを許可されていないとサーバーが見なしたことを示しています。

于 2012-10-28T02:04:26.530 に答える
3

これでは問題は解決しません。401 は HTTPS と SSL を介して送信されたため、証明書は完全に機能しています。

いずれにせよ、これを行わないことを強くお勧めします。テストと本番で異なるコードを実行する必要はありません。テスト コードが本番環境に漏洩し、セキュリティが侵害される大きなリスクがあります。また、安全でないコードをテストしても意味がありません。

于 2012-10-28T02:29:09.770 に答える
2

コードでわざわざ無効にする必要はありません。証明書をテスト マシンのトラストストアに追加するだけで、チェックが無効になっているビルドを出荷しないことを 100% 確信できます。

于 2012-10-28T01:57:09.147 に答える
1

他の人が述べたように、エラー 401 は、実際に SSL 接続を確立し、リクエストを送信して、この 401 エラーが返されたことを意味します。したがって、SSLコードは問題ありません。

ブラウザでこのページを開くと、ユーザー名とパスワードのプロンプトが表示されますか? 多分自動ログイン?この場合、コードにこの基本認証または類似の認証が欠けていると言えます。

于 2012-11-20T10:41:18.767 に答える