Il modo giusto è quello di importare questo certificato auto-firmato in negozio la fiducia del cliente, utilizzando keytool
ad esempio:
keytool -import -file server-cert.pem -alias myserver -keystore mytruststore.jks
È possibile farlo direttamente nel negozio di fiducia del JRE (lib/security/cacerts
), che potrebbe non avere una certa flessibilità, o farlo nella propria copia di questo file, che poi si imposta come archivio fidato (la password predefinita è changeit
o changeme
su OSX). Si configura questa truststore a livello globale per l'applicazione utilizzando i soliti javax.net.ssl.trustStore*
proprietà del sistema (ad esempio -Djavax.net.ssl.trustStore=mytruststore
proprietà di sistema (e -Djavax.net.ssl.trustStorePassword
) oppure è possibile configurarlo per un connettore specifico Restlet utilizzando i parametri di contesto del server, ad esempio:
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");
il modo sbagliato è quello di utilizzare un TrustManager
che sta per disattivare qualsiasi verifica e passarlo attraverso un SslContextFactory
(nell'estensione SSL). Qualcosa in questo senso.
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; }
});
Mentre il primo metodo può sembrare un po 'più noioso del secondo (dal momento che è necessario ottenere prima il certificato del server e copiare i file), il secondo semplicemente farà scomparire i messaggi di errore non verificando nulla sul certificato del server, quindi rendendolo vulnerabile agli attacchi MITM attivi. Ciò si applica a qualsiasi connessione in cui è configurato questo SSLContext
. (Questo "modo sbagliato non è sbagliato perché utilizza un personalizzato SSLContext
, è sbagliato a causa di questa particolare configurazione del SSLContext
.)
No - Sono particolarmente chiedendo su come fare questo con il quadro Restlet (http://www.restlet.org/). Ho fatto questo in altre occasioni con altri tipi di connessioni, vorrei solo sapere il modo giusto di farlo con le scuse del Restlet – nwaltham
, in qualche modo non l'ho capito .. – home