[英]How to make Restlet client ignore SSL Certificate problems
我目前正在測試環境中工作,其中服務器具有默認的自簽名SSL證書。 我正在使用Restlet 2.1-RC2並實例化客戶端資源,如下所示:
Client client = new Client(new Context(), Protocol.HTTP);
cr = new ClientResource(String.format(itql_endpoint,riQuery));
cr.setNext(client);
並為我的每個電話重復使用客戶端。 如何設置客戶端以便忽略有問題的證書。
正確的方法是使用keytool
將此自簽名證書導入客戶端的信任存儲區,例如:
keytool -import -file server-cert.pem -alias myserver -keystore mytruststore.jks
您可以直接在JRE的信任存儲( lib/security/cacerts
)中執行此操作(可能缺少一些靈活性),也可以在您自己的此文件副本中執行此操作,然后將其設置為信任存儲(默認密碼為changeit
或changeme
上OSX)。 您可以使用通常的javax.net.ssl.trustStore*
系統屬性(例如-Djavax.net.ssl.trustStore=mytruststore
系統屬性(和-Djavax.net.ssl.trustStorePassword
))為您的應用程序全局配置此信任庫,或者您可以配置它使用服務器上下文參數在Restlet中的特定連接器,例如:
Series<Parameter> parameters = client.getContext().getParameters();
parameters.add("truststorePath", "/path/to/your/truststore.jks");
// parameters.add("truststorePassword", "password");
// parameters.add("trustPassword", "password");
// parameters.add("truststoreType", "JKS");
錯誤的方法是使用TrustManager
來禁用任何驗證並通過SslContextFactory
(在SSL擴展中)傳遞它。 沿着這些方向的東西。
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkServerTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
// This will never throw an exception.
// This doesn't check anything at all: it's insecure.
}
};
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] {tm}, null);
Context context = client.getContext();
context.getAttributes().put("sslContextFactory", new SslContextFactory() {
public void init(Series<Parameter> parameters) { }
public SSLContext createSslContext() { return sslContext; }
});
雖然第一種方法似乎比第二種方法更乏味(因為您需要先獲取服務器證書並復制文件),但第二種方法只是通過不驗證服務器證書的任何內容而使錯誤消息消失,從而使它容易受到MITM主動攻擊。 這將適用於配置此SSLContext
任何連接。 (這個“錯誤的做法是沒有錯的,因為它使用了自定義SSLContext
,那是因為這個特殊的配置錯誤SSLContext
。)
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.