2017-09-22 7 views
0

다음의 간단한 프로그램 :구글 클라우드 플랫폼 : 시작할 수 없습니다 자바 HTTPS 서버

import com.sun.net.httpserver.HttpsServer; 
import java.net.InetSocketAddress; 

class SimpleServer { 
    public static void main(String[] pArgs) { 
    try { 
     HttpsServer s = HttpsServer.create(new InetSocketAddress(443), 0); 
     System.out.println(" " + s); 
    } catch (Exception pE) { 
     throw new RuntimeException("Could not create HTTPS server", pE); 
    } 
    } 
} 

구글 클라우드 플랫폼에 의해 호스팅 데비안 VM 내에서 작동하지 않습니다 (구글 컴퓨 트 엔진 -의 IaaS) :

Exception in thread "main" java.lang.RuntimeException: Could not create HTTPS server 
    at SimpleServer.main(SimpleServer.java:10) 
Caused by: java.net.SocketException: Permission denied 
    at sun.nio.ch.Net.bind0(Native Method) 
    at sun.nio.ch.Net.bind(Net.java:433) 
    at sun.nio.ch.Net.bind(Net.java:425) 
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) 
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
    at sun.net.httpserver.ServerImpl.<init>(ServerImpl.java:100) 
    at sun.net.httpserver.HttpsServerImpl.<init>(HttpsServerImpl.java:50) 
    at sun.net.httpserver.DefaultHttpServerProvider.createHttpsServer(DefaultHttpServerProvider.java:39) 
    at com.sun.net.httpserver.HttpsServer.create(HttpsServer.java:90) 
    at SimpleServer.main(SimpleServer.java:7) 

이 예제는 Windows 바탕 화면에서 실행될 때와 443에서 다른 것으로 포트를 변경하는 경우에도 작동합니다. 그렇다면 Google Cloud에서 443 서버를 허용하려면 어떻게해야합니까? 나는 방화벽을 개방 시도했지만, 그 (그것은 별도의 문제이기 때문에 정말 :-(해야하지 않는 것이) 작동하지 않았다

Java 버전이다 (나는이 문제를 의심하지만).

을 리눅스/유닉스에 1024 아래
openjdk version "1.8.0_141" 
OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-1~deb9u1-b15) 
OpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode) 
+0

위의 프로그램을 'sudo'하는 것이 도움이되는 것처럼 보일 수 있으며 이는 유일한/궁극적 인 대답 일 수 있지만 권한 상승없이 수행 할 수 있습니까? –

답변

1

이것은 GCP의 문제가 아니라 리눅스/유닉스 보안 기능이 아닙니다.

포트 만들 상승 된 권한이 필요합니다 "특권 포트"입니다.

당신이 GCP에 따라 몇 가지 옵션이 있습니다.

가 아닌 privlaged 사용자로 1024 위의 높은 포트를 사용하여 :

  • 연결을 그 높은 포트에 URL을 HTTPS에서 : // foo는 : 8443
  • 사용 GCP 네트워크 또는 HTTP/HTTPS로드 밸런서는 SUID, sudo를하거나 다른 방법
  • 을 부여합니다 _CAP_NET를 사용하여 실행 높은 포트에 서비스를 VM 인스턴스
  • 내부에 높은 포트 443에서 패킷을 전달하는
  • 활용 IP 테이블을 포트 443를 전달합니다 _BIND_SERVICE_ capabilities (7)을 프로세스에 추가하십시오.

마지막 두 옵션은 복잡한 보안상의 영향을 미치므로 가능한 한 피해야합니다.

다음 링크는 위의 옵션 중 일부를 다루지 만 첫 번째 옵션은 마지막 두 옵션보다 훨씬 안전하지만 가장 단순합니다.

https://debian-administration.org/article/386/Running_network_services_as_a_non-root_user.

관련 문제