title: SSL signed certificate Authentication in Gatling
body: <p>I need to talk to a service which requires CA signed certificates. I have certificates on my own username and the same certificates has been imported at the server side.So that when I send request, I will produce my certificate for authentication with the server and server matches those certificate and send the response back.</p>
  
  <p>When I request the URL in the browser, it automatically selects/asks (In pop-up) with the certificate on my username and when I select that user name the request loads with a proper response.</p>
  
  <p>Now I want to simulate the same thing in Gatling. However in Gatling I am getting a 401 (Unauthorized).</p>
  
  <p>I verified at the server side that when I send the request from browser, I can able to see the certificates are passing but when I send request from Gatling the certificates are not sending along with request for authentication. At the server side it says no certificates found.</p>
  
  <p>I have imported my username CA signed certificates into JDK keystore and sending the request as shown below. </p>
  
  <pre><code>def execute(): ScenarioBuilder = {
  val parameters = Map("$filter" -&gt; "${Id}")
  val positionsScenario: ScenarioBuilder = scenario("Locations")
    .feed(accountFeed)
    .exec(requestHandler.getSAPRequest("Locations", parameters))
  positionsScenario
  }
  
  def getRequest(requestName: String, parameters: Map[String, String]): ChainBuilder = {
  val messageBuilder = exec(http(requestName)
    .get(s"$uri")
    .queryParamMap(parameters)
    .check(status.is(200))
  )
  messageBuilder
  }
  </code></pre>
  
  <p>I have configured my certs using system.property since gatling.conf is not sending the the certificates in the scenario.</p>
  
  <pre><code>    System.setProperty("gatling.http.ssl.trustStore.file", "C:/Program Files/Java/jdk1.8.0_111/jre/lib/security/cacerts")
      System.setProperty("gatling.http.ssl.trustStore.password", "changeit")
      System.setProperty("gatling.http.ssl.trustStore.type", "JKS")
  
      System.setProperty("gatling.http.ssl.keyStore.file", "C:/Program Files/Java/jdk1.8.0_111/jre/lib/security/vikram")
      System.setProperty("gatling.http.ssl.keyStore.password", "changeit")
      System.setProperty("gatling.http.ssl.keyStore.type", "JKS")
  </code></pre>
  
  <p><strong>Here are the log from gatling</strong></p>
  
  <pre><code>    Session(SAPPositions,4,Map(gatling.http.ssl.keyStore.password -&gt; changeit, 
      gatling.http.cache.dns -&gt; io.gatling.http.resolver.ShuffleJdkNameResolver@6e027c67, 
      gatling.http.ssl.trustStore.type -&gt; JKS, gatling.http.ssl.trustStore.password -&gt; changeit, 
      accountId -&gt; (account_id eq '000194878-182182-AU-AUD'), 
      gatling.http.ssl.keyStore.file -&gt; C:/Program Files/Java/jdk1.8.0_111/jre/lib/security/vikram, 
      gatling.http.ssl.keyStore.type -&gt; JKS, gatling.http.referer -&gt; https://d3u.internal.com/sap/op/data/ACCOUNT_LOCATION_API_SRV/locationapi?%24filter=%28account_id%20eq%20%27000194878, 
      gatling.http.ssl.trustStore.file -&gt; C:/Program Files/Java/jdk1.8.0_111/jre/lib/security/cacerts, 
      gatling.http.cookies -&gt; CookieJar(Map(CookieKey(sap-usercontext,d3u.internal.com,/) -&gt; StoredCookie(sap-usercontext=sap-client=100; path=/,true,false,1517797866679))))
   1517797866640,0,KO,List(),io.gatling.core.protocol.ProtocolComponentsRegistry$$Lambda$458/906347731@1443b002)
  =========================
  HTTP request:
  GET https://d3u.internal.com/sap/op/data/ACCOUNT_LOCATION_API_SRV/locationapi?%24filter=%28account_id%20eq%20%27000194878
  headers=
  Connection: Keep-Alive
  Accept: */*
  Accept-Encoding: gzip, deflate
  Host: d3u.internal.com
  =========================
  HTTP response:
  status=
  401 Unauthorized
  headers= 
  set-cookie: sap-usercontext=sap-client=100; path=/
  content-type: text/html; charset=utf-8
  sap-system: D3U
  www-authenticate: Basic realm="SAP NetWeaver Application Server [D3U/100]"
  Transfer-Encoding: chunked
  Content-Encoding: gzip
  </code></pre>
  
  <p><strong>Here are my Server side log:</strong></p>
  
  <pre><code>[Thr 139749210060544]   Server-configured Ciphersuites: "TLS_ECDHE_RSA_WITH_AES128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES256_GCM_SHA384:T
  [Thr 139749210060544] Mon Feb  5 11:09:34 2018
  [Thr 139749210060544]   Client-offered Ciphersuites: "TLS_RSA_WITH_AES256_CBC_SHA:TLS_RSA_WITH_AES128_CBC_SHA:TLS_RSA_WITH_RC4_128_S
  [Thr 139749210060544]   No Client Certificate
  [Thr 139749210060544]   New session (TLSv1.2, TLS_RSA_WITH_AES128_CBC_SHA)
  [Thr 139749210060544]   HexDump of new SSL session ID { &amp;buf= 7f19c001306c, buf_len= 32 }
  [Thr 139749210060544]    00000: 3e 2d 9e fb b6 f3 bf 63  fb 49 27 75 f3 d8 24 c7   &gt;-.....c .I'u..$.
  [Thr 139749210060544]    00010: 90 85 bb ed 5e 39 d6 cc  15 27 25 04 fe 29 44 3f   ....^9.. .'%..)D?
  [Thr 139749210060544]   SapSSLISessionStartFin(sssl_hdl=7f19c0016b50)==SAP_O_K
  [Thr 139749210060544]  in/out: status = "new SSL session,TLSv1.2,TLS_RSA_WITH_AES128_CBC_SHA, **NO client cert"**
  [Thr 139749210060544] &lt;&lt;- SapSSLSessionStartNB(sssl_hdl=7f19c0016b50)==SAP_O_K
  [Thr 139749210060544] HttpParseRequestHeader: no content length set
  [Thr 139749210060544] HttpParseRequestHeader: no transfer-encoding set
  [Thr 139749210060544] HttpParseRequestHeader: Version: 1001
  [Thr 139749210060544] HttpParseRequestHeader: Keep-Alive: 0
  [Thr 139749210060544] HttpParseRequestHeader: no server port set
  [Thr 139749210060544] HTTP request (raw) [5/540445/1]:
  [Thr 139749210060544]   GET /sap/bc/gui/sap/its/webgui?sap-client=000 HTTP/1.1
  [Thr 139749210060544]   host: d3u.internal.com
  [Thr 139749210060544]   connection: Close
  [Thr 139749210060544] Connection Info: role=Server, local=vd3u01.internal.com:44300, peer=10.137.249.2, protocol=HTTPS
  [Thr 139749210060544] -&gt;&gt; SapSSLGetPeerInfo(sssl_hdl=7f19c0016b50, &amp;cert=7f19e605e990, &amp;cert_len=7f19e605e99c,
  [Thr 139749210060544]    &amp;subject_dn=7f19e605e988, &amp;issuer_dn=7f19e605e978, &amp;cipher=7f19e605e980)
  [Thr 139749210060544] &lt;&lt;- SapSSLGetPeerInfo(sssl_hdl=7f19c0016b50)==SAP_O_K
  [Thr 139749210060544]     out: cert_len = &lt;no cert&gt;
  [Thr 139749210060544]     out: cipher   = "TLS_RSA_WITH_AES128_CBC_SHA"
  </code></pre>
  
  <p>In the server side log, it says client certificate not sent. I am suspecting I am sending something wrong in the request or my code itself.</p>
  
  <p>Thanks</p>