|  | @@ -20,10 +20,17 @@ import java.security.KeyStore;
 | 
	
		
			
				|  |  |  import javax.net.ssl.SSLContext;
 | 
	
		
			
				|  |  |  import javax.net.ssl.SSLHandshakeException;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 | 
	
		
			
				|  |  | -import org.apache.http.impl.client.CloseableHttpClient;
 | 
	
		
			
				|  |  | -import org.apache.http.impl.client.HttpClients;
 | 
	
		
			
				|  |  | -import org.apache.http.ssl.SSLContexts;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.impl.classic.HttpClients;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.ssl.HttpsSupport;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
 | 
	
		
			
				|  |  | +import org.apache.hc.client5.http.ssl.TrustAllStrategy;
 | 
	
		
			
				|  |  | +import org.apache.hc.core5.http.config.Registry;
 | 
	
		
			
				|  |  | +import org.apache.hc.core5.http.config.RegistryBuilder;
 | 
	
		
			
				|  |  | +import org.apache.hc.core5.ssl.SSLContexts;
 | 
	
		
			
				|  |  |  import org.junit.jupiter.api.Disabled;
 | 
	
		
			
				|  |  |  import org.junit.jupiter.api.Test;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -41,38 +48,51 @@ import static org.assertj.core.api.Assertions.assertThatCode;
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * @author Michael Simons
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -@Disabled
 | 
	
		
			
				|  |  | +// @Disabled
 | 
	
		
			
				|  |  |  public class X509Tests {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	void notCertificateThenSslHandshakeException() {
 | 
	
		
			
				|  |  |  		RestTemplate rest = new RestTemplate();
 | 
	
		
			
				|  |  | -		assertThatCode(() -> rest.getForEntity("https://localhost:8443/", String.class))
 | 
	
		
			
				|  |  | +		assertThatCode(() -> rest.getForEntity(getServerUrl(), String.class))
 | 
	
		
			
				|  |  |  				.hasCauseInstanceOf(SSLHandshakeException.class);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  | +	@Disabled("Figure out how to make certs work")
 | 
	
		
			
				|  |  |  	void certificateThenStatusOk() throws Exception {
 | 
	
		
			
				|  |  | -		ClassPathResource serverKeystore = new ClassPathResource("/certs/server.p12");
 | 
	
		
			
				|  |  | +		ClassPathResource serverKeystore = new ClassPathResource("certs/server.p12");
 | 
	
		
			
				|  |  |  		KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
 | 
	
		
			
				|  |  |  		keyStore.load(serverKeystore.getInputStream(), "password".toCharArray());
 | 
	
		
			
				|  |  |  		// @formatter:off
 | 
	
		
			
				|  |  |  		SSLContext sslContext = SSLContexts.custom()
 | 
	
		
			
				|  |  |  				.loadKeyMaterial(keyStore, "password".toCharArray(), (aliases, socket) -> "client")
 | 
	
		
			
				|  |  | -				.loadTrustMaterial(keyStore, null)
 | 
	
		
			
				|  |  | +				.loadTrustMaterial(keyStore, new TrustAllStrategy())
 | 
	
		
			
				|  |  |  				.build();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext,
 | 
	
		
			
				|  |  | -				new String[]{"TLSv1.2", "TLSv1.1"},
 | 
	
		
			
				|  |  | -				null,
 | 
	
		
			
				|  |  | -				SSLConnectionSocketFactory.getDefaultHostnameVerifier());
 | 
	
		
			
				|  |  | +				HttpsSupport.getDefaultHostnameVerifier());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		final Registry<ConnectionSocketFactory> socketFactoryRegistry =
 | 
	
		
			
				|  |  | +				RegistryBuilder.<ConnectionSocketFactory> create()
 | 
	
		
			
				|  |  | +						.register("https", socketFactory)
 | 
	
		
			
				|  |  | +						.register("http", new PlainConnectionSocketFactory())
 | 
	
		
			
				|  |  | +						.build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		final BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry);
 | 
	
		
			
				|  |  |  		// @formatter:on
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
 | 
	
		
			
				|  |  | -		ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
 | 
	
		
			
				|  |  | -		RestTemplate rest = new RestTemplate(requestFactory);
 | 
	
		
			
				|  |  | -		ResponseEntity<String> responseEntity = rest.getForEntity("https://localhost:8443/me", String.class);
 | 
	
		
			
				|  |  | -		assertThat(responseEntity).extracting((result) -> result.getStatusCode().is2xxSuccessful()).isEqualTo(true);
 | 
	
		
			
				|  |  | +		try (CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build()) {
 | 
	
		
			
				|  |  | +			ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
 | 
	
		
			
				|  |  | +			RestTemplate rest = new RestTemplate(requestFactory);
 | 
	
		
			
				|  |  | +			ResponseEntity<String> responseEntity = rest.getForEntity(getServerUrl() + "/me", String.class);
 | 
	
		
			
				|  |  | +			assertThat(responseEntity).extracting((result) -> result.getStatusCode().is2xxSuccessful()).isEqualTo(true);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	private String getServerUrl() {
 | 
	
		
			
				|  |  | +		return "https://localhost:" + System.getProperty("app.httpsPort");
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |