15

Google App Engine に双方向 SSL を実装する必要があります。ここでは、双方向 SSL 認証を必要とするサーバーに JAX-WS を使用して Web サービス リクエストを送信します。

発信する Web サービス リクエストに対して双方向 SSL を設定するにはどうすればよいでしょうか。

javax.net.ssl*これは App Engine 環境では禁止されています。

コードの例を次に示します。

@WebService(name="ListenerSoap", targetNamespace = "http://example.com/Listener.Wsdl")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface ListenerSoap {

    @WebMethod(operationName = "Ping", action="http://example.com/Listener.Wsdl#Ping")
    public void ping();
}

@WebServiceClient(name="Listener", targetNamespace="http://example.com/Listener.Wsdl", wsdlLocation = "https://example.com/Listener.asmx?WSDL")
public class Listener extends Service
{
  public ListenerSoap getListenerSoap() {
   return super.getPort(new QName("http://example.com/Listener.Wsdl", 
                       "ListenerSoap"), ListenerSoap.class);
  }
}

上記のコードの使用例:

ListenerSoap soap = new Listener().getListenerSoap();
soap.ping();

キーストアまたは必要な証明書を DataStore にバイナリ オブジェクトとして保存できると思います (ただし、それらをアップロードする方法はまだ少しわかりません)。

この Web サービスが双方向 SSL を使用して認証するために必要な値を設定するにはどうすればよいでしょうか?

助けてくれてありがとう

アップデート:

調査を通じて、これが従来のサーバー(ファイルシステムにアクセスできるサーバー)で実行できる方法であることがわかりました。

ListenerSoap soap = new Listener().getListenerSoap();
((BindingProvider) soap).getRequestContext().put("javax.net.ssl.keyStore", "client_cert.p12"

ただし、このアプローチでclient_cert.p12は、ファイルシステム上にあることが予想されます。

さらに、SSLSocketFactorySSLContextKeyManager、およびKeyManagerFactoryall は GAE では許可されていません。

アップデート:

GAE SDK バージョン 1.7.7 以降。これが可能になるはずです:

Similarly, Java developers can now use the javax.net.ssl package to make outbound SSL connections.

GAE 1.7.7 SDK リリース ノート

4

7 に答える 7

2

From my restricted knowledge about SSL authorization, it seems you may be missing something of vital importance here; the certificates. Two-way SSL requires the client and server certificates to be in your keystore, which can be either a self-signed certificate( a pkcs12 or pem file, which you can easily generate with a few commands through shell) or a proprietary certificate issued by an authorized company like Thawte or Verisign. Although I am not sure if that is the problem you are facing, but its good to check it out. (Also, I am a newbie so please don't downvote my answer, just trying to suggest possible options.)

于 2013-04-24T04:19:23.447 に答える
1

これを聞きたくないかもしれませんが、SSLの使用は費用がかかり、双方向通信には問題があります。サーバー/クライアントエンドをどの程度制御できるかに応じて、Webソケットのような単純な双方向パイプとAESを簡単に実装できるデータパケットプロトコルを好みます。それは本当にあなたが解決しようとしている問題に依存します。

于 2013-02-22T06:27:21.233 に答える
1

これには App Engine の Socket API が必要です。この API はトラステッド テスター モードであるため、すべてのユーザーが利用できるわけではありません。

アクセス ギアを要求できます: https://docs.google.com/spreadsheet/viewform?formkey=dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ#gid=0

于 2013-03-27T05:52:00.063 に答える
1

SSL を介した単純な接続 ( https://...) と、「相互認証」または「公開鍵基盤 (PKI)」として知られているものについて混乱があるようです。実際には、両方または一方を他方から独立して実行できます。後者(元の質問が言及していると思います)では、サーバーにリクエストを行うと、サーバーはあなたに応答して、自分自身を認証するために提示する必要がある証明書を要求します。

上記の特定の質問(バイナリ データからキーストアをロードする) に答えるには、キーストアを取得するのは Java ランタイムであるため、実際には可能ではないと思います。あなたができる唯一の考えは、データストアからビットをロードし、一時的にディスクに書き込むことです。アプリケーションが存在する場合は、必要に応じて削除します。これは私が以前に行ったことがあり、かなりうまく機能します。これを行う場合は、書き込み可能な場所 ( などSystem.getProperty("java.io.tmpdir"));) を使用することをお勧めします。次に、ファイルをディスクに書き込んだ後、JVM プロパティを設定します (例System.getProperties().put( "javax.net.ssl.keyStore","...");) 。

于 2013-02-27T16:03:23.520 に答える
1
ListenerSoap soap = new Listener().getListenerSoap();

それが改善することを願っています

ありがとう

于 2012-12-14T00:39:30.363 に答える
0

双方向SSLについて私が知っていることについては、Java EEコードとのリンクはありません.双方向SSLはトランスポート層セキュリティです.クライアントアプリケーションがサーバーとの安全なHTTP接続(HTTPS)を作成しようとすると、サーバーは.証明書を要求し、この証明書を承認するかどうかを決定します。クライアント証明書が承認されると、パーティで安全な接続が確立され、このトンネルを介して一部のメッセージを交換できるようになります。ただし、このプロセスはトランスポート層で行われます。(アプリケーション層の) コードには、このプロセスが通知されることはありません。双方向 SSL を確立するには、SSL ポート用のアプリケーション サーバー セットアップでセットアップを行います。

于 2012-09-24T07:42:23.363 に答える