簡體   English   中英

GAE上的Web服務的雙向SSL(java)

[英]2-way SSL for web services on GAE (java)

我們需要在Google App Engine上實施雙向SSL,我們使用JAX-WS向需要雙向SSL身份驗證的服務器發送Web服務請求。

我們如何為傳出的Web服務請求設置雙向SSL?

我們知道app Engine環境中禁止使用javax.net.ssl*

這是我們代碼的一個例子:

@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應該在文件系統上。

此外,GAE上不允許使用SSLSocketFactorySSLContextKeyManagerKeyManagerFactory

更新:

截至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發行說明

根據我對SSL授權的限制知識,您可能會遺漏一些至關重要的內容; 證書。 雙向SSL要求客戶端和服務器證書位於密鑰庫中,密鑰庫可以是自簽名證書(pkcs12或pem文件,您可以通過shell輕松生成一些命令)或由Thawte或Verisign等授權公司。 雖然我不確定你是否面臨這個問題,但是很好看。 (另外,我是新手,所以請不要低估我的答案,只是嘗試建議可能的選項。)

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

希望它有所改善

謝謝

我知道你可能不想聽到這個,但使用SSL是昂貴的,並且對雙向通信有問題。 根據您對服務器/客戶端的控制程度,我更喜歡簡單的雙向管道,如Web套接字和可簡單實現AES的數據包協議。 這實際上取決於您要解決的問題。

聽起來像是通過SSL( https://... )進行簡單連接以及所謂的“相互身份驗證”或“公鑰基礎結構(PKI)”存在混淆。 你實際上可以做兩個或一個獨立於另一個。 對於后者(我認為原始問題所指的是),當您向服務器發出請求時,服務器將響應您要求提供證書,您必須出示該證書以進行身份​​驗證。

為了回答上面的具體問題 (從二進制數據加載密鑰庫),我認為這不可能,因為它是在運行密鑰庫的Java運行時。 您可以做的唯一想法是從數據存儲區加載位並暫時將其寫入磁盤。 (可選)在應用程序存在時刪除它。 這是我以前做過的,並且運作得相當好。 如果你這樣做,我建議使用一個可寫的位置(例如System.getProperty("java.io.tmpdir")); ),然后在將文件寫入磁盤后,設置JVM屬性(例如System.getProperties().put( "javax.net.ssl.keyStore","...");

您將需要App Engine的Socket API。 此API處於受信任的測試人員模式,因此並非適用於所有人。

您可以要求訪問gere: https ://docs.google.com/spreadsheet/viewform formkey = dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ #gid = 0

據我所知,不支持雙向SSL(從GAE托管的應用程序到外部世界)。 幾個月前我嘗試了一個示例應用程序,並且很驚訝地發現GAE甚至不支持這個基本功能..而且文檔也不清楚。 當您聯系網絡服務時,您將無法提供客戶端證書..沒有地方存儲它,無法訪問密鑰庫。

對於我對雙向SSL的了解,您將無法使用Java EE代碼:雙向SSL是傳輸層安全性:當您的客戶端應用程序嘗試使用該服務創建安全HTTP連接(HTTPS)時,服務器將索取證書並批准或不批准此證書。 如果客戶端證書被批准,則將在各方建立安全連接,並允許它們通過此隧道交換一些消息。 但是這個過程是在傳輸層完成的。 您的代碼(在應用程序層上)永遠不會被告知此過程。 為了建立雙向SSL,在SSL端口的應用程序服務器設置上完成設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM