Подтвердить что ты не робот

Аутентификация общей карты доступа (CAC) с использованием Java

Я начинаю искать где-нибудь, чтобы начать изучать, как взаимодействовать с государственной картой CAC, используя java.

В конечном счете, моя цель - узнать, как использовать аутентификацию карты CAC (по PIN-коду) для авторизации доступа к веб-сайту, размещенному на сервере Tomcat/J2EE.

Но мне нужно где-то начать. Поэтому я полагаю, что начну с написания небольшой java-программы, чтобы просто прочитать информацию о карте CAC с карты CAC, которая вставлена ​​в устройство чтения карт на моей клавиатуре (клавиатура DELL с CAC-считывателем над цифровой клавиатурой).

При поиске в google я нашел проект cacard java (https://cacard.dev.java.net/), который был заменен на OpenSSO. Но я не могу найти пример кода, как использовать его для подключения к карте, чтения с карты и т.д.

Кто-нибудь знает, где я могу найти образец кода, чтобы начать учиться взаимодействовать с картой CAC с помощью java?

Спасибо

EDIT:

После изучения большего, я думал, смогу ли я просто установить clientAuth="true" в элемент соединителя в файле server.xml?

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

clientAuth: установите для этого значения значение true, если вы хотите, чтобы Tomcat требовал от всех SSL-клиентов предоставления сертификата клиента для использования этого сокета.

4b9b3361

Ответ 1

Создаете ли вы веб-приложение или пытаетесь написать программное обеспечение, которое выполняется на клиенте (вроде своего собственного веб-браузера)?

Если вы создаете веб-приложение, это в значительной степени просто стандартная проверка подлинности клиента. Тот факт, что сертификат пришел из аппаратного токена, мало меняет сервер; если вы хотите принимать только сертификаты CAC, вы можете указать набор допустимых политик сертификата, когда сервер проверяет сертификат клиента. (Валидация политики является стандартной частью проверки PKIX.) Если это приложение предназначено для государственного заказчика, вам нужно будет тесно сотрудничать со своей командой безопасности, чтобы ваше решение соответствовало их требованиям, что может быть жестким. Если это ваш сценарий, дайте мне знать, и я обновлю свой ответ на некоторые из проблем, с которыми мы столкнулись.

Если вы пишете клиента и нуждаетесь в доступе к физическому читателю, вы можете использовать поставщик Sun PKCS # 11, так как Java 1.5. Я экспериментировал с этим провайдером, и вы можете больше узнать об этом в другом ответе.


На сервере вы должны убедиться, что сертификат не отменен. Тем не менее, некоторые из этих списков CRL огромны: у нас есть файлы CRL более 100 Мб, а встроенная проверка отзыва Sun не масштабируется до этого размера.

Вам также необходимо убедиться, что у вас есть правильные корневые сертификаты CA в хранилище ключей доверия "Tomcat" (правильные сертификаты CA для корневых центров немного сложнее найти, потому что они хотят убедиться, что пользователи правильно их проверяют). Мы также обнаружили, что Firefox не отправляет всю цепочку сертификатов, если пользователь не импортирует промежуточные сертификаты в свой браузер вручную.

Ответ 2

Вам нужно создать файл с именем card.config и включить в него следующие строки:

name = myConfig
library = /path/to/library/that/implements/cac/card/reader 

И затем попробуйте следующее:

import java.io.*;
import java.util.*;

import java.security.cert.CertificateException;
import java.security.KeyStoreException;
import java.security.cert.X509Certificate;

import java.security.KeyStore;
import java.security.Provider;
import java.security.SecureRandom;
import java.security.Security;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class Test  
{
   public static void  main(String arg[]) throws Exception
   {
       try
       {   
         //Create our certificates from our CAC Card
         String configName = "card.config";
         Provider p = new sun.security.pkcs11.SunPKCS11(configName);
         Security.addProvider(p);

         //Get the pin from user entered data
         Console c = System.console();
         char[] pin = c.readPassword("Enter your PIN: ");
         KeyStore cac = null;

         cac = KeyStore.getInstance("PKCS11");
         cac.load(null, pin);

         showInfoAboutCAC(cac);

      }
      catch(Exception ex)
      {
         //System.out.println("*" + ex.getMessage());
         ex.printStackTrace();
         System.exit(0);
      }
   }

   public static void showInfoAboutCAC(KeyStore ks) throws KeyStoreException, CertificateException
   {
      Enumeration<String> aliases = ks.aliases();

      while (aliases.hasMoreElements()) 
      {
         String alias = aliases.nextElement();
         X509Certificate[] cchain = (X509Certificate[]) ks.getCertificateChain(alias);

         System.out.println("Certificate Chain for : " + alias);
         for (int i = 0; i < cchain.length; i ++)
         {
            System.out.println(i + " SubjectDN: " + cchain[i].getSubjectDN());
            System.out.println(i + " IssuerDN:  " + cchain[i].getIssuerDN());
         }
      }
   }
}

В этот момент у вас есть хранилище ключей, которое вы можете использовать для создания ssl-сокета для разговора с веб-сервером https.

Ответ 3

Посмотрите на использование аутентификации сертификатов с использованием приложения типа SSO, такого как OpenSSO или JOSSO. Агент должен быть проще внедрить, и они уже внедрили большую часть деталей. Если вам нужно сделать это самостоятельно, у них также есть много документации, относящейся к необходимым шагам, таким как: установка цифровых сертификатов