我目前在服务器具有默认的自签名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
您可以直接在lib/security/cacerts
可能缺乏灵活性的JRE信任库()中进行操作,也可以在自己的文件副本中进行操作,然后将该文件设置为信任库(默认密码为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
。)
问题内容: 我正在使用Jersey客户端库针对在jboss上运行的rest服务运行测试。我使用自签名证书在服务器(在本地主机上运行)上设置了https。 但是,每当我使用https url运行测试时,都会出现以下错误: 我知道这是因为我的自签名证书不在Java密钥库中。有什么办法可以让我不检查ssl证书的有效性,而直接使用它呢? 这段代码只能在测试服务器上运行,因此,我不想在每次设置新的测试服务器
问题内容: 在Python中,我使用了这样的请求: 非常简单。 现在,我需要使用Apache HttpClient在Java中实现相同的功能。使用HttpClient进行请求时如何通过客户端证书? 问题答案: 我认为主要区别在于,在Java中,通常将密钥和证书放在密钥存储区中,然后从那里使用它。就像您提到的那样,人们经常希望为此使用单独的库,例如提到的httpcomponents客户端(就像您在p
我使用Spring RestTemplate发出HTTPS请求,我想忽略SSL证书 下面是我创建restTem板请求的代码: 当我使用服务器主机名时,此请求有效,但当我使用服务器IP地址时,会出现以下异常:
问题内容: URL myUrl = new URL(“https://www....."); 网站的SSL证书已过期。如何避免它并使URL()工作? 问题答案: 您应该构建一个包装默认信任管理器的,捕获并忽略它。 注意:如此答案中所述,此设置是否安全在很大程度上取决于实现。特别是,它依赖于在正确检查所有其他内容之后最后执行的日期验证。 遵循这些原则的东西应该起作用: 当证书有问题时,信任管理器将抛
问题内容: Apache Http客户端。您可以在此处查看相关代码: 这是每个人都用来忽略SSL证书错误的方法(仅将其设置为登台,它将不会在生产中使用)。但是,我仍然收到以下异常/堆栈跟踪: 任何提示都很好。如果我做的TrustManager错误,或者我应该以不同的方式执行HTTP Post方法,则可以选择两种方式。 谢谢! 问题答案: 首先,不要 忽略 证书错误。与他们打交道。忽略证书错误将打开