2017-09-22 5 views
0

次の簡単なプログラム:Googleのクラウドプラットフォーム:起動できませんJavaの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); 
    } 
    } 
} 

GoogleのクラウドプラットフォームによってホストされているのDebian VMの内部で動作しません(GoogleのCompute Engineの - 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のクラウドで443のサーバーを許可するにはどうすればよいですか?私は、ファイアウォールを開くしようとしたが、それは(それは別の問題だから、それは本当に:-(持つべきではないということ)動作しませんでした

Javaのバージョンがある(私はこの問題を疑うが):。

をLinux/Unixで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の問題が、Linux/Unixのセキュリティ機能ではありません。

ポートを作成するために、上昇権限が必要な「特権ポート」です。

あなたがGCPにあるとおりいくつかのオプションがあります。

非privlagedユーザーとして1024以上の高いポートを使用して:あなたのURLでその高いポートhttpsに

  • 接続:// FOO:8443
  • をGCPネットワークまたはHTTP /を使用しますHTTPSロードバランサはSUID、sudoのか、他の方法
  • グラント_CAP_NETを使用して実行し、高いポートにサービスをVMインスタンス
  • 内の高いポートに443からのパケットを転送する
  • 活用IPテーブルをポート443を転送します_BIND_SERVICE_ capabilities(7)をプロセスに追加します。

これらの最後の2つのオプションは、セキュリティ上の意味が複雑であり、可能な限り避けるべきです。

上記のオプションのいくつかは次のリンクでカバーされますが、最初のオプションは最後の2つのオプションよりもはるかに安全ですが、最も簡単です。

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

関連する問題