4

ログインページを作成しようとしています。そのために、SSL ソケットを開いて HTTPS リクエストを行いたいのですが、m getting Unknown Host Exception in line-- SSLSocket skt = (SSLSocket)sslsf.createSocket("https://31.21.18.222/room_info/x.txt" , 443); Could someone please tell me what I間違っていますか? また、プログラムでホスト検証が必要ないため、ホスト検証をオフにしました。

`public void clickLogin() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException {


            URL url = new URL ("https://31.21.18.222/room_info/x.txt");
            HttpsURLConnection connection = null;
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);        //Make an empty store
            InputStream fis = new FileInputStream("C:/Documents and Settings/user/Desktop/PK/localhost.crt"); 
            BufferedInputStream bis = new BufferedInputStream(fis);
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            while (bis.available() > 0) {
                java.security.cert.Certificate cert = cf.generateCertificate(bis);
                keyStore.setCertificateEntry("localhost", cert);
            }

            // write code for turning off client verification
            TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
            tmf.init(keyStore);
            SSLContext context = SSLContext.getInstance("SSL");
            context.init(null, tmf.getTrustManagers() , null);
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            SSLSocketFactory sslsf = context.getSocketFactory();
            SSLSocket skt = (SSLSocket)sslsf.createSocket("https://31.21.18.222/room_info/x.txt" , 443);
            skt.setUseClientMode(true);
            SSLSession s = skt.getSession(); // handshake implicitly done
            skt.setKeepAlive(true);


            connection = (HttpsURLConnection) url.openConnection();

        // Host name verification off
            connection.setHostnameVerifier(new HostnameVerifier()  
            {        
                public boolean verify(String hostname, SSLSession session)  
                {  
                    return true;  
                }  
            });  `
4

1 に答える 1

3

でソケットを開きたい場合createSocketは、完全な URL ではなく、ホスト名 (または IP アドレス) を使用する必要があります。

example : sslsf.createSocket("31.21.18.222" , 443);

加えて:

  • 使用しないでくださいSecurity.addProvider(new com.sun.net.ssl.internal.ssl.Provider())(デフォルトで存在します)。
  • 特に、TMF のデフォルトのアルゴリズムはではなくであるため、 のTrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())代わりに使用する方がよいでしょう。X.509PKIXX.509
  • createSocketトラスト アンカーに対して証明書を検証しますが、ホスト名はチェックしません (これは MITM 攻撃を防ぐためにも必要です)。このため、通常は IP アドレスではなくホスト名を使用することをお勧めします。
于 2013-06-26T11:55:08.637 に答える