2015-05-16 2 views
0

Я создаю приложение, где я использую клиент Джерси для запроса некоторой информации с другого сервера. Я уверен, выполнение вызова следующим образом:Джерси клиент SSL взаимная аутентификация

.... 
result = ClientBuilder 
    .newBuilder() 
    .keyStore(KeyStoreUtils.loadKeyStore(KeyStoreUtils.TEST), 
      KeyStoreUtils.getKeyStorePassword()) 
    .withConfig(new LoggingConfig()).build().target(serverUrl) 
    .request() 
    .post(Entity.entity(payload, request.getContentType())); 
....  

к хранилищу является JKS хранилища ключей, который содержит только 1 пара ключей, которые должны быть использованы для взаимной аутентификации SSL. Однако, несмотря на это, я получаю сообщение об ошибке HTTP 401 (Unauthorized) с сервера. Есть ли что-то еще, что нужно сделать для обеспечения совместной работы SSL?

PS: Я использую Джерси версии 2,14

ответ

1

Моя идея здесь заключается в использовании маркера проверки подлинности на основе, которая может быть проверяемым с заголовком HTTP. Я выполнил взаимную аутентификацию клиента с помощью API-интерфейсов jersey 2.x.

* Сертификат находится в формате PEM и преобразуется в кодировку Base64 до того, как клиент использует его. Вот пример клиента для отдыха в Джерси, используя аутентификацию на основе взаимного сертификата.
ПРИМЕЧАНИЕ: сертификаты CA. следует настроить на сервере keystore TEST.java

package your.package.here; 

import org.glassfish.jersey.client.ClientConfig; 

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import java.io.File; 
import java.io.FileWriter; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

public class TEST { 
    public static final String codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 
    public static String base64encodedCert; 
    public static ClientBuilder clientBuilder; 
    public static ClientConfig config; 
    public static Client client; 
    public static String res; 

    public static void main(String[] args) { 
     String urls = "http://YourDomain/URL/here/path"; 
     try { 
      File certFile = new File("keystores/directory/Your_Cert_File.base64"); 
      if (!certFile.exists()) { 
       FileWriter fileWriter = new FileWriter(certFile); 
       fileWriter.write(base64Encode(new String(Files.readAllBytes(Paths.get("keystores/directory/Your_Cert_File.pem"))).getBytes())); 
       fileWriter.close(); 
      } 
      base64encodedCert = new String(Files.readAllBytes(Paths.get("keystores/directory/Your_Cert_File.base64"))); 
      clientBuilder = ClientBuilder.newBuilder(); 
      config = new ClientConfig(); 
      client = clientBuilder.withConfig(config).build(); 
      WebTarget target = client.target(urls); 
      Response response = target.request().header("MY-CUSTOM-TOKEN", base64encodedCert).accept(MediaType.APPLICATION_XML).get(); 
      res = response.readEntity(String.class); 
      response.close(); 
      System.out.println("res = " + res); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public static String base64Encode(byte[] in) { 
     StringBuilder out = new StringBuilder((in.length * 4)/3); 
     int b; 
     for (int i = 0; i < in.length; i += 3) { 
      b = (in[i] & 0xFC) >> 2; 
      out.append(codes.charAt(b)); 
      b = (in[i] & 0x03) << 4; 
      if (i + 1 < in.length) { 
       b |= (in[i + 1] & 0xF0) >> 4; 
       out.append(codes.charAt(b)); 
       b = (in[i + 1] & 0x0F) << 2; 
       if (i + 2 < in.length) { 
        b |= (in[i + 2] & 0xC0) >> 6; 
        out.append(codes.charAt(b)); 
        b = in[i + 2] & 0x3F; 
        out.append(codes.charAt(b)); 
       } else { 
        out.append(codes.charAt(b)); 
        out.append('='); 
       } 
      } else { 
       out.append(codes.charAt(b)); 
       out.append("=="); 
      } 
     } 
     return out.toString(); 
    } 

} 
Смежные вопросы