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

В основном я ищу место, где можно научиться взаимодействовать с государственной картой CAC с помощью java.

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

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

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

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

Спасибо

РЕДАКТИРОВАТЬ:

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

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

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


person Community    schedule 12.02.2009    source источник
comment
Мы хотели бы убедиться, что пользователь должен арендовать свой PIN-код для доступа к одному из наших браузерных приложений. Есть ли способ деаутентифицировать пользователя, чтобы он снова аутентифицировался? Может быть, закрыть сокет на стороне сервера, чтобы соединение пришлось восстанавливать?   -  person    schedule 29.12.2009
comment
Пол, я хочу сделать почти то же, что и ты. Я ничего не знаю об этих устройствах, и я начинаю с нуля. Не могли бы вы опубликовать код, который вы использовали для решения, с отредактированной/затененной конфиденциальной информацией? Спасибо в любом случае. Счастливой пятницы. Стив   -  person Steve    schedule 07.12.2012


Ответы (3)


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

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

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


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

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

person erickson    schedule 13.02.2009
comment
Мы создаем веб-приложение. Так что мне не нужно беспокоиться о чтении карты, верно? Браузер должен передать сертификат моему веб-приложению, и пока пользователь вводит правильный PIN-код, Tomcat разрешит ему доступ. Неверный PIN-код, Tomcat откажет в доступе? - person ; 13.02.2009
comment
Верно. PIN-код указывает карте включить операцию подписи, которая поддерживает аутентификацию. Смотрите мои правки выше для получения дополнительных советов. Используете ли вы сертификаты CAC, выданные Министерством обороны США? Это приложение для государственного учреждения? Есть много дополнительных правил, которым вам нужно следовать, если это так. - person erickson; 13.02.2009
comment
+1. Ваш веб-сервер просто получит сертификат X.509 в запросе - person Kevin; 13.02.2009
comment
@erickson У меня есть вопрос по поводу вашего заявления. Если это так, вам нужно будет соблюдать множество дополнительных правил. Не могли бы вы взглянуть на это здесь? stackoverflow.com/questions/41833825/ - person twindham; 24.01.2017

Вам нужно создать файл с именем 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.

person Jay    schedule 27.10.2009

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

person Joshua    schedule 08.07.2009