2

私は、静的ファイルのコンテンツを読み取る必要があるGoogle App Engine Javaでアプリを作成しています.warディレクトリに myrsakey11.pk8 という名前のファイルがあります。

ファイルを読み取るための私のコードセグメントは

public static PrivateKey getPrivateKey(String privKeyFileName) throws IOException {
          File privKeyFile = new File(privKeyFileName);
          FileInputStream fis = new FileInputStream(privKeyFile);
          DataInputStream dis  = new DataInputStream(fis);

          byte[] privKeyBytes = new byte[(int) privKeyFile.length()];
          try {
            dis.read(privKeyBytes);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
          dis.close();
          fis.close();

          String BEGIN = "-----BEGIN PRIVATE KEY-----";
          String END = "-----END PRIVATE KEY-----";
          String str = new String(privKeyBytes);

          if (str.contains(BEGIN) && str.contains(END)) {
            str = str.substring(BEGIN.length(), str.lastIndexOf(END));
          }

          KeyFactory fac;
        try {
            fac = KeyFactory.getInstance("RSA");

             EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(Base64.decode(str));
              return fac.generatePrivate(privKeySpec);

        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Base64DecoderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         return null;
    }

この関数では、文字列「/myrsakey11.pk8」を渡しています

そして、私が取得している完全なエラーログは

java.security.AccessControlException: access denied (java.io.FilePermission /myrsakey11.pk8 read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:355)
    at java.security.AccessController.checkPermission(AccessController.java:567)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.apphosting.runtime.security.CustomSecurityManager.checkPermission(CustomSecurityManager.java:56)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
    at java.io.FileInputStream.<init>(FileInputStream.java:133)
    at org.ritesh.HelloWorldServlet.getPrivateKey(HelloWorldServlet.java:129)
    at org.ritesh.HelloWorldServlet.doGet(HelloWorldServlet.java:110)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)

このエラーを修正する方法を教えてください。

4

3 に答える 3

2

それは私にも起こり、それを理解するのにしばらく時間がかかりました:

ファイルへの間違ったパスを宣言すると、Google AE は FileNotFoundException をスローしませんが、代わりに「AccessControlException: アクセスが拒否されました (読み取り)」をスローします。

パスが有効であることを確認してください。

于 2014-04-03T17:59:18.520 に答える
0

デプロイされた appengine アプリからデータストアにアクセスするのは難しく、このチュートリアルでは十分に説明されていませんでした。チュートリアルで説明されているように環境変数を使用する代わりに、アプリで定数を使用しました。p12 ファイルは、デプロイされたアプリからアクセスできる場所 (/src/main/resources/ など) にある必要があります。

私がやった方法は次のようなものでした:

  1. app-xxx.p12 ファイルを backend/src/main/resources に置きますが、シークレットにする必要があるため、.gitignore にも追加します。
  2. このような環境から資格情報全体を構築する代わりに

datastore = DatastoreFactory.get().create(DatastoreHelper.getOptionsfromEnv() .dataset(DATASET_ID).build());

チュートリアルで示唆されているように、私は次のことを行いました

Credential credential = getCredential();       
DatastoreOptions.Builder options = DatastoreHelper.getOptionsFromEnv().credential(credential);
datastore = DatastoreFactory.get().create(options.dataset(DATASET_ID).build());

getCredential() は次のように定義されます。

private Credential getCredential() throws GeneralSecurityException, IOException {
        final String serviceAccount = "123-xxx@developer.gserviceaccount.com";
        final String FILE_NAME = "/app-xxx.p12";

        URL url = getClass().getResource(FILE_NAME);
        String filename = url.getFile();
        return DatastoreHelper.getServiceAccountCredential(serviceAccount, filename);
    }
于 2015-10-06T00:55:16.357 に答える
0

[1] で説明されているように、この静的ファイルへのアクセスを許可しましたか。静的ファイルのパスを取得するにはどうすればよいですか? おそらく、このファイルをリソースとして使用し (WEB-INF フォルダーに配置)、次のようにアクセスできます。

ServletContext context = getContext();
InputStream resourceContent = context.getResourceAsStream("/WEB-INF/testinger.txt");

[1] https://developers.google.com/appengine/docs/java/config/appconfig#include-exclude

于 2013-01-08T10:41:17.400 に答える