I'm trying to implement a Digest authentication based login using SHA-256 algorithm in java, but not getting much help. I'm able to login using POSTMAN and getting HTTP status code 200, but not sure how POSTMAN has used the SHA-256 here, Postman request config snapshot and My implementation below, which throws SSLHandshakeException. 
Here's my code using which I'm getting Handshake failure :
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.http.*;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.*;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.DigestScheme;
import org.apache.http.impl.client.*;
import junit.framework.Assert;
public class DigestTest {
private static final String URL = "https://10.0.1.190/API/Web/Login";
private static final String USER = "admin";
private static final String PASSWORD = "testing123456";
public static void main(String[] args) throws Exception {
new DigestTest().run();
}
public void run() throws Exception {
System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
HttpPost httpPost = new HttpPost(URL);
HttpHost target
= new HttpHost(httpPost.getURI().getHost(), 443, "https");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials
= new UsernamePasswordCredentials(USER, PASSWORD);
credsProvider.setCredentials(
new AuthScope(target.getHostName(), target.getPort()),
credentials);
CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient httpclient
= HttpClients.custom().setDefaultCookieStore(cookieStore)
.setDefaultCredentialsProvider(credsProvider).build();
try {
DigestScheme digestAuth = new DigestScheme();
digestAuth.overrideParamter("qop", "auth");
digestAuth.overrideParamter("nc", "0");
digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce());
digestAuth.overrideParamter("algorithm", "SHA-256");
AuthCache authCache = new BasicAuthCache();
authCache.put(target, digestAuth);
HttpClientContext localContext = HttpClientContext.create();
localContext.setAuthCache(authCache);
CloseableHttpResponse response;
response = httpclient.execute(target, httpPost, localContext);
Map<String, String> wwwAuth = Arrays
.stream(response.getHeaders("WWW-Authenticate")[0]
.getElements())
.collect(Collectors.toMap(HeaderElement::getName,
HeaderElement::getValue));
// the first call ALWAYS fails with a 401
// Assert.assertEquals(response.getStatusLine().getStatusCode(), 401);
digestAuth.overrideParamter("opaque", wwwAuth.get("opaque"));
digestAuth.overrideParamter("nonce", wwwAuth.get("nonce"));
digestAuth.overrideParamter("realm", wwwAuth.get("Digest realm"));
Header authenticate = digestAuth.authenticate(credentials, httpPost,
localContext);
httpPost.addHeader(authenticate);
response = httpclient.execute(target, httpPost, localContext);
// the 2nd call is the real deal
// Assert.assertEquals(response.getStatusLine().getStatusCode(), 200);
//System.out.println(IOUtils
// .toString(response.getEntity().getContent(), "utf-8"));
System.out.println(response.getEntity().getContent().toString());
} catch(Exception e){
System.out.println("Exception : \n"+e);
} finally {
httpclient.close();
}
}
}
I'm getting the exception below :
Exception : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Please help with the code rectification.
java.net.http.HttpClient: stackoverflow.com/a/76750652/2073804