可以使用java ServerSocket接受HTTPs请求吗

可以使用java ServerSocket接受HTTPs请求吗,java,https,socketserver,Java,Https,Socketserver,我有以下代码,可以很好地发送HTTP请求,但如何转换它以使其支持HTTPs请求 public test() throws Exception { ServerSocket ss = new ServerSocket(32567); Socket client = null; while ((client = ss.accept()) != null) { System.out.prin

我有以下代码,可以很好地发送HTTP请求,但如何转换它以使其支持HTTPs请求

    public test() throws Exception {
        ServerSocket ss = new ServerSocket(32567);

        Socket client = null;
        while ((client = ss.accept()) != null) {                
           System.out.println("-- Sending --");
           BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
           String s = "<?xml version=\"1.0\" ?><root><message>test</message><status>OK</status></root>";
           String output = "HTTP/1.1 200 OK\nContent-Type: text/xml; charset=UTF-8\nCache-Control: no-cache\nConnection: closed\nAccess-Control-Allow-Origin: *\n\n" + s;
           System.out.println("--- RESPONSE ---\n" +  output);
           out.write(output);
           out.flush();
           out.close();
           in.close();
           client.close();
        }
    }
public test()引发异常{
ServerSocket ss=新的ServerSocket(32567);
socketclient=null;
而((client=ss.accept())!=null){
System.out.println(“--Sending--”);
BufferedWriter out=新的BufferedWriter(新的OutputStreamWriter(client.getOutputStream());
字符串s=“testOK”;
String output=“HTTP/1.1 200确定\n内容类型:text/xml;charset=UTF-8\n缓存控制:无缓存\n连接:关闭\n访问控制允许来源:*\n\n“+s;
System.out.println(“--RESPONSE--\n”+输出);
输出。写入(输出);
out.flush();
out.close();
in.close();
client.close();
}
}

您使用的是
javax.net.ssl.SSLServerSocket
,但请注意,HTTP服务器并不简单。您需要充分了解RFC 2616及其后续产品


您还需要知道HTTP中的行终止符是
\r\n
,而不是
\n

我使用了这段代码,并且工作得很好

  HttpsURLConnection.setDefaultHostnameVerifier(
        new HostnameVerifier() {
           public boolean verify(String hostname, SSLSession sslSession) {
              return true;
           }
        }
  );

  TrustManager[] trustAllCerts = new TrustManager[] {
        new X509TrustManager() {
           public X509Certificate[] getAcceptedIssuers() {
              return new X509Certificate[0];
           }

           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());
      char[] keyPassword =  "MY_PASSWORD".toCharArray();
      KeyStore keystore = KeyStore.getInstance("PKCS12");;
      keystore.load(this.getClass().getClassLoader().getResourceAsStream("MY_CERT.p12"), keyPassword);

      KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
      keyManagerFactory.init(keystore, keyPassword);      
      KeyManager keyManagers[] = keyManagerFactory.getKeyManagers();

      Enumeration aliases = keystore.aliases();
      String keyAlias = "";
      while (aliases.hasMoreElements()) {
          keyAlias = (String) aliases.nextElement();
          System.out.println("KEY FOUND: " + keyAlias);
      }

      SSLContext sc = SSLContext.getInstance("TLS"); 
      sc.init(keyManagers, null, null);

      SSLServerSocketFactory sslContextFactory = (SSLServerSocketFactory) sc.getServerSocketFactory();
      SSLServerSocket ssl = (SSLServerSocket) sslContextFactory.createServerSocket(32567);     
      ssl.setEnabledProtocols(new String[] {"TLSv1", "TLSv1.1", "TLSv1.2", "SSLv3"});
      ssl.setEnabledCipherSuites(sslContextFactory.getSupportedCipherSuites());
证书存储在jar文件中。上面的代码从jar文件读取证书,而不是从命令行-Djavax.net.ssl.keyStore=MY_cert.p12-Djavax.net.ssl.keystrepassword=MY_PASSWORD传入

通过以下方式生成您的证书:

openssl req -new -newkey rsa:4096 -nodes -out MY_CERT.csr
openssl rsa -in privkey.pem -out MY_CERT.key -passin pass:MY_PASSWORD
openssl x509 -in MY_CERT.csr -out MY_CERT.crt -req -signkey MY_CERT.key -days 3650
openssl pkcs12 -export -inkey MY_CERT.key -in MY_CERT.crt -name localhost -out MY_CERT.p12 -passout pass:MY_PASSWORD -caname root 

jar文件(在jar文件的根目录中)中只需要MY_CERT.p12即可。

您做过任何研究吗?您遇到过
javax.net.ssl.*
classes吗?标准连接选项是
close
,没有
d