如何使用RestTemplate在每个请求中发送自签名证书?

时间:2018-02-22 14:36:41

标签: java rest spring-mvc

我想用我的spring应用程序调用REST服务。要访问该服务,我有一个客户端证书(自签名和X.509格式)进行授权。验证其他服务的正确方法是什么?

我有两个证书文件和一个私钥,我想在每个请求中发送服务

private final String CLIENT_CERT = "C:\\Cert\\cert.cert";

private final String CLIENT_KEY = "C:\\Cert\\client.cert";

private final String LYNX_ROOT_CERT = "C:\\Cert\\root.crt";

这是我的要求:

private ResponseEntity<String> restTemplateGetForObject(UriComponentsBuilder builder,
        Map<String, String> uriParams) {
    HttpEntity<?> entity = getEntityWithHeaders(HttpMethod.POST);
    ResponseEntity<String> resp = restTemplate.exchange(builder.buildAndExpand(uriParams).toUri(), HttpMethod.POST,
            entity, String.class);

    return resp;
}
public ResponseEntity<String> updateOrCreateAlarm() {
    String BaseUrl = configuration.getUrl();
    String port = configuration.getPort();

    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(BaseUrl + ":" + port + "/api/v1/alarm");
    Map<String, String> uriParams = new HashMap<String, String>();
    uriParams.put("alarm_group", "LYNXKEYPRO");
    uriParams.put("alarm_channel", "001");
    uriParams.put("alarm_state", "ALARM");
    uriParams.put("ip_address", "10.6.1.42");
    uriParams.put("computer_name", "WS-B2-Lab1");
    uriParams.put("version", "2");
    uriParams.put("additional_text", "Custom Text to display with alarm");
    return restTemplateGetForObject(builder, uriParams);

}

1 个答案:

答案 0 :(得分:0)

1)我会创建一个信任库并将此证书添加为那里的条目。

2)启动其余客户端时,请确保信任库包含在jvm进程中。

以下是详细信息:

自签名证书(适用于Windows)。 请注意,在您的情况下,您可能已经拥有证书。只需确保它已添加到信任库中。同样在开发环境中,密钥库和信任库可以是相同的。你可以谷歌如何做到这一点。我使用了 keystore Explorer

cd  certificate directory
"C:\Program Files\Java\jdk1.8.0_162\bin\keytool.exe"  -genkey -alias signFiles -keystore badsslkeystore

badsslkeystore - 密钥库名称 assword - changeit。 -alias - 密钥库条目,在我们的例子中是signFiles。

http://java-buddy.blogspot.cz/2016/07/java-example-of-ssl-server-and-client.html

对于客户:

$ java -jar -Djavax.net.ssl.trustStore=keystore -Djavax.net.ssl.trustStorePassword=password "...JavaSSLClient.jar"

或者将它们设置为系统属性。

public static void setClientSslConfig() {
    System.setProperty("javax.net.ssl.trustStore", TRUSTSTORE);//TRUSTSTORE - truststore location in the file system.
    System.setProperty("javax.net.ssl.trustStorePassword", KEYSTORE_PASSWORD);

}